日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

LwIP应用开发笔记之一:LwIP无操作系统基本移植

發布時間:2024/7/23 windows 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LwIP应用开发笔记之一:LwIP无操作系统基本移植 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

現在,TCP/IP協議的應用無處不在。隨著物聯網的火爆,嵌入式領域使用TCP/IP協議進行通訊也越來越廣泛。在我們的相關產品中,也都有應用,所以我們結合應用實際對相關應用作相應的總結。

1、技術準備

我們采用的開發平臺是STM32F407和LwIP協議棧。在開始之前,我們需要做必要的準備工作。

首先要獲得LwIP的源碼,在網上有很多,不同版本及不同平臺的都有,不過我們還是建議直接從官方網站獲得。其官方網站如下:

http://savannah.nongnu.org/projects/lwip/

其次,需要硬件平臺,我們采用了STM32F407ZG+DM9161的網絡接口方式,這并不是必須的,其他硬件平臺也是一樣的。

最后,因為我們后面要在操作系統下移植,采用的操作系統是FreeRTOS,所以還需下載FreeRTOS的源碼。同樣簡易從官網下載:

https://www.freertos.org/index.html

2、LwIP簡要說明

LwIP是一款免費的TCP/IP協議棧,但它的功能趨勢十分完備。LwIP 具有三種應用編程接口 (API):

  • Raw API:為原始的 LwIP API。它通過事件回調機制進行應用開發。該 API 提供了最好的性能和優化的代碼長度,但增加了應用開發的復雜性。
  • ?Netconn API:為高層有序 API,需要實時操作系統 (RTOS)的支持 (提供進程間通訊的方法)。 Netconn API 支持多線程工作。
  • BSD Socket API:類似 Berkeley 的套接字 API (開發于 Netconn API 之上) 。

對于以上三種接口,前一種只需要裸機即可調用,后兩種需要操作系統才能調用。所以據此LwIP存在兩種移植方式:一是,只移植內核,此時應用程序的編寫只能基于RAW/Callback API進行。二是,移植內核和上層API,此時應用程序編寫可以使用3種API,即:RAW/Callback API、Sequential API和Socket API。

3、LwIP的無操作系統基本移植

在移植之前,我們需要對源碼有一些了解,以及清楚API如何使用,才能進行很好的移植。在源碼的文件中有兩個文本文件:rawapi.txt和sys_arch.txt。在rawapi.txt文件中,作者說明了怎樣使用協議棧的Raw/Callback API進行編程。而在sys_arch.txt文件中,說明了如何移植,規定了移植者需要實現的函數宏定義等。接下來我們就據此來實現移植。

其實,進行無操作系統的移植,所需要做的工作并不多,一是需要定義幾個協議在所需要的頭文件。二是需要編寫網卡的驅動程序,而寫驅動程序是主要工作所在。

首先我們說需要定義的頭文件。根據sys_arch.txt文件中的要求,我們需要實現cc.h、lwipopts.h和perf.h三個頭文件,線描述如下:

  • cc.h文件主要完成協議棧內部使用的數據類型的定義,以保證平臺無關性。
  • lwipopts.h文件包含了用戶對協議棧內核參數進行的配置。
  • perf.h文件是實現與系統統計和測量相關的功能。

其次要實現網卡的驅動,事實上我們采用STM32F407自帶的網卡,以及ST的開發庫時,驅動大部分都寫好了,我們只需要完成硬件IO部分的配置以及一些必要的參數配置就可以了。

接下來就是實現幾個必要的函數,按照LwIP作者給出的模板,需要實現5個函數如下:

  • low_level_init 調用以太網驅動函數,初始化 STM32F4xx 和 STM32F2x7xx 以太網外設
  • low_level_output 調用以太網驅動函數以發送以太網包
  • low_level_input 調用以太網驅動函數以接收以太網包
  • ethernetif_init 初始化網絡接口結構 (netif)并調用low_level_init以初始化以太網外設
  • ethernetif_input 調用low_level_input接收包,然后將其提供給LwIP棧

以上這些函數都實現后,我們需要使協議運轉起來,所以我們還需要做兩件事,一是對協議及網卡初始化;二是實現對數據的輪詢,當然也可使用中斷方式,不過在這里我們使用查詢方式。

初始化部分,除了初始化默認網絡接口的參數外,需要注冊2個函數,一是初始化網絡接口函數ethernetif_init一是數據包接收函數ethernet_input。實現如下:

/* LwIP初始化配置 */ void LWIP_Init_Configuration(void) { /* IP賦值 */IP_ADDRESS[0] = 192;IP_ADDRESS[1] = 168;IP_ADDRESS[2] = 2;IP_ADDRESS[3] = 110;NETMASK_ADDRESS[0] = 255;NETMASK_ADDRESS[1] = 255;NETMASK_ADDRESS[2] = 255;NETMASK_ADDRESS[3] = 0;GATEWAY_ADDRESS[0] = 192;GATEWAY_ADDRESS[1] = 168;GATEWAY_ADDRESS[2] = 2;GATEWAY_ADDRESS[3] = 1;/* 在無操作系統環境下初始化LwIP協議棧 */lwip_init();/* 固定IP地址初始化(IPv4) */IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);/* 添加無操作系統的網絡接口參數 */netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);/* 注冊缺省的網絡接口 */netif_set_default(&gnetif);if (netif_is_link_up(&gnetif)){/* 連接正常時,啟用網絡接口 */netif_set_up(&gnetif);}else{/* 連接故障時,停止網絡接口 */netif_set_down(&gnetif);} }

初始化完成需要調用ethernetif_input接收數據才能實現通訊,其實現很簡單。
?

/* 以太網輪循處理函數 */ void EthernetProcess(void) {ethernetif_input(&gnetif);/* 無操作系統超時檢測 */sys_check_timeouts(); }

這樣每次查詢都會檢查是否有數據收到,并通過ethernet_input函數發送到協議棧進行處理。其實,可能大家會發現還有一個sys_check_timeouts()函數,它是一個超時檢測函數,要求調用一個名為sys_now()的函數來返回系統時鐘,而sys_now()函數是我們需要實現的,各個系統復雜程度不同,在這里我們使用了STM32的HAL庫,所以實現就很簡單了。

4、結論

前面已經完成了無操作系統LwIP的移植,那怎么知道我們的移植是否成功呢?接下來我們對它進行必要的驗證。

首先我們查看目標板在網絡上的配置是否正確。我們打開命令行窗口,運行ipconfig命令,查看MAC地址和IP地址配置:

我們配置的MAC地址00:08:E1:00:00:00和IP地址192.168.2.110顯示正常。接下來我們采用ping命令測試網絡鏈接:

上圖顯示網絡連接正常,說明我們的LwIP在無操作系統情況下移植正常。

歡迎關注:

總結

以上是生活随笔為你收集整理的LwIP应用开发笔记之一:LwIP无操作系统基本移植的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。