0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

LwIP的無操作系統(tǒng)基本移植

CHANBAEK ? 來源:木南創(chuàng)智 ? 作者:尹家軍 ? 2022-12-14 14:53 ? 次閱讀

現(xiàn)在,TCP/IP協(xié)議的應(yīng)用無處不在。隨著物聯(lián)網(wǎng)的火爆,嵌入式領(lǐng)域使用TCP/IP協(xié)議進(jìn)行通訊也越來越廣泛。在我們的相關(guān)產(chǎn)品中,也都有應(yīng)用,所以我們結(jié)合應(yīng)用實(shí)際對相關(guān)應(yīng)用作相應(yīng)的總結(jié)。

1 、技術(shù)準(zhǔn)備

我們采用的開發(fā)平臺(tái)是STM32F407和LwIP協(xié)議棧。在開始之前,我們需要做必要的準(zhǔn)備工作。

首先要獲得LwIP的源碼,在網(wǎng)上有很多,不同版本及不同平臺(tái)的都有,不過我們還是建議直接從官方網(wǎng)站獲得。

其次,需要硬件平臺(tái),我們采用了STM32F407ZG+DM9161的網(wǎng)絡(luò)接口方式,這并不是必須的,其他硬件平臺(tái)也是一樣的。

最后,因?yàn)槲覀兒竺嬉?a href="http://wenjunhu.com/v/tag/527/" target="_blank">操作系統(tǒng)下移植,采用的操作系統(tǒng)是FreeRTOS,所以還需下載FreeRTOS的源碼。

2 、 LwIP****簡要說明

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

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

對于以上三種接口,前一種只需要裸機(jī)即可調(diào)用,后兩種需要操作系統(tǒng)才能調(diào)用。所以據(jù)此LwIP存在兩種移植方式:一是,只移植內(nèi)核,此時(shí)應(yīng)用程序的編寫只能基于RAW/Callback API進(jìn)行。二是,移植內(nèi)核和上層API,此時(shí)應(yīng)用程序編寫可以使用3種API,即:RAW/Callback API、Sequential API和Socket API。

3 LwIP****的無操作系統(tǒng)基本移植

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

其實(shí),進(jìn)行無操作系統(tǒng)的移植,所需要做的工作并不多,一是需要定義幾個(gè)協(xié)議在所需要的頭文件。二是需要編寫網(wǎng)卡的驅(qū)動(dòng)程序,而寫驅(qū)動(dòng)程序是主要工作所在。

首先我們說需要定義的頭文件。根據(jù)sys_arch.txt文件中的要求,我們需要實(shí)現(xiàn)cc.h、lwipopts.h和perf.h三個(gè)頭文件,線描述如下:

  • cc.h文件主要完成協(xié)議棧內(nèi)部使用的數(shù)據(jù)類型的定義,以保證平臺(tái)無關(guān)性。
  • lwipopts.h文件包含了用戶對協(xié)議棧內(nèi)核參數(shù)進(jìn)行的配置。
  • perf.h文件是實(shí)現(xiàn)與系統(tǒng)統(tǒng)計(jì)和測量相關(guān)的功能。

其次要實(shí)現(xiàn)網(wǎng)卡的驅(qū)動(dòng),事實(shí)上我們采用STM32F407自帶的網(wǎng)卡,以及ST的開發(fā)庫時(shí),驅(qū)動(dòng)大部分都寫好了,我們只需要完成硬件IO部分的配置以及一些必要的參數(shù)配置就可以了。

接下來就是實(shí)現(xiàn)幾個(gè)必要的函數(shù),按照LwIP作者給出的模板,需要實(shí)現(xiàn)5個(gè)函數(shù)如下:

  • **low_level_init **調(diào)用以太網(wǎng)驅(qū)動(dòng)函數(shù),初始化 STM32F4xx 和 STM32F2x7xx 以太網(wǎng)外設(shè)
  • **low_level_output **調(diào)用以太網(wǎng)驅(qū)動(dòng)函數(shù)以發(fā)送以太網(wǎng)包
  • low_level_input 調(diào)用以太網(wǎng)驅(qū)動(dòng)函數(shù)以接收以太網(wǎng)包
  • ethernetif_init 初始化網(wǎng)絡(luò)接口結(jié)構(gòu) (netif)并調(diào)用low_level_init以初始化以太網(wǎng)外設(shè)
  • ethernetif_input 調(diào)用low_level_input接收包,然后將其提供給LwIP棧

以上這些函數(shù)都實(shí)現(xiàn)后,我們需要使協(xié)議運(yùn)轉(zhuǎn)起來,所以我們還需要做兩件事,一是對協(xié)議及網(wǎng)卡初始化;二是實(shí)現(xiàn)對數(shù)據(jù)的輪詢,當(dāng)然也可使用中斷方式,不過在這里我們使用查詢方式。

初始化部分,除了初始化默認(rèn)網(wǎng)絡(luò)接口的參數(shù)外,需要注冊2個(gè)函數(shù),一是初始化網(wǎng)絡(luò)接口函數(shù) ethernetif_init ; 一是數(shù)據(jù)包接收函數(shù) ethernet_input 。 實(shí)現(xiàn)如下:

1 /* LwIP初始化配置 */
 2 void LWIP_Init_Configuration(void)
 3 {
 4   /* IP賦值 */
 5   IP_ADDRESS[0] = 192;
 6   IP_ADDRESS[1] = 168;
 7   IP_ADDRESS[2] = 2;
 8   IP_ADDRESS[3] = 110;
 9   NETMASK_ADDRESS[0] = 255;
10   NETMASK_ADDRESS[1] = 255;
11   NETMASK_ADDRESS[2] = 255;
12   NETMASK_ADDRESS[3] = 0;
13   GATEWAY_ADDRESS[0] = 192;
14   GATEWAY_ADDRESS[1] = 168;
15   GATEWAY_ADDRESS[2] = 2;
16   GATEWAY_ADDRESS[3] = 1;
17  
18   /* 在無操作系統(tǒng)環(huán)境下初始化LwIP協(xié)議棧 */
19   lwip_init();
20  
21   /* 固定IP地址初始化(IPv4) */
22   IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);
23   IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);
24   IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);
25  
26   /* 添加無操作系統(tǒng)的網(wǎng)絡(luò)接口參數(shù) */
27   netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input);
28  
29   /* 注冊缺省的網(wǎng)絡(luò)接口 */
30   netif_set_default(&gnetif);
31  
32   if (netif_is_link_up(&gnetif))
33   {
34     /* 連接正常時(shí),啟用網(wǎng)絡(luò)接口 */
35     netif_set_up(&gnetif);
36   }
37   else
38   {
39     /* 連接故障時(shí),停止網(wǎng)絡(luò)接口 */
40     netif_set_down(&gnetif);
41   }
42  
43 }
44 初始化完成需要調(diào)用ethernetif_input接收數(shù)據(jù)才能實(shí)現(xiàn)通訊,其實(shí)現(xiàn)很簡單。
45 /* 以太網(wǎng)輪循處理函數(shù) */
46 void EthernetProcess(void)
47 {
48   ethernetif_input(&gnetif);
49  
50   /* 無操作系統(tǒng)超時(shí)檢測 */
51   sys_check_timeouts();
52  
53 }

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

4 、結(jié)論

前面已經(jīng)完成了無操作系統(tǒng)LwIP的移植,那怎么知道我們的移植是否成功呢?接下來我們對它進(jìn)行必要的驗(yàn)證。

首先我們查看目標(biāo)板在網(wǎng)絡(luò)上的配置是否正確。我們打開命令行窗口,運(yùn)行ipconfig命令,查看MAC地址和IP地址配置:

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

上圖顯示網(wǎng)絡(luò)連接正常,說明我們的LwIP在無操作系統(tǒng)情況下移植正常。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6838

    瀏覽量

    123385
  • 移植
    +關(guān)注

    關(guān)注

    1

    文章

    379

    瀏覽量

    28145
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1362

    瀏覽量

    79111
  • LwIP
    +關(guān)注

    關(guān)注

    2

    文章

    86

    瀏覽量

    27216
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    #硬聲創(chuàng)作季 #LWIP 學(xué)LWIP-19 ENC28J60模塊LWIP操作系統(tǒng)移植1-2

    LwIPENC28J60
    水管工
    發(fā)布于 :2022年11月11日 14:56:30

    #硬聲創(chuàng)作季 #LWIP 學(xué)LWIP-19 ENC28J60模塊LWIP操作系統(tǒng)移植1-3

    LwIPENC28J60
    水管工
    發(fā)布于 :2022年11月11日 14:57:07

    #硬聲創(chuàng)作季 #LWIP 學(xué)LWIP-19 ENC28J60模塊LWIP操作系統(tǒng)移植1-4

    LwIPENC28J60
    水管工
    發(fā)布于 :2022年11月11日 14:57:43

    #硬聲創(chuàng)作季 #LWIP 學(xué)LWIP-20 ENC28J60模塊LWIP操作系統(tǒng)移植2-1

    LwIPENC28J60智能操作系統(tǒng)
    水管工
    發(fā)布于 :2022年11月11日 14:58:06

    #硬聲創(chuàng)作季 #LWIP 學(xué)LWIP-20 ENC28J60模塊LWIP操作系統(tǒng)移植2-2

    LwIPENC28J60智能操作系統(tǒng)
    水管工
    發(fā)布于 :2022年11月11日 14:58:44

    #硬聲創(chuàng)作季 #LWIP 學(xué)LWIP-20 ENC28J60模塊LWIP操作系統(tǒng)移植2-3

    LwIPENC28J60智能操作系統(tǒng)
    水管工
    發(fā)布于 :2022年11月11日 14:59:25

    #硬聲創(chuàng)作季 #LWIP 學(xué)LWIP-20 ENC28J60模塊LWIP操作系統(tǒng)移植2-4

    LwIPENC28J60智能操作系統(tǒng)
    水管工
    發(fā)布于 :2022年11月11日 15:00:04

    #硬聲創(chuàng)作季 #LWIP 學(xué)LWIP-20 ENC28J60模塊LWIP操作系統(tǒng)移植2-5

    LwIPENC28J60智能操作系統(tǒng)
    水管工
    發(fā)布于 :2022年11月11日 15:00:45

    #硬聲創(chuàng)作季 #LWIP 學(xué)LWIP-20 ENC28J60模塊LWIP操作系統(tǒng)移植2-6

    LwIPENC28J60智能操作系統(tǒng)
    水管工
    發(fā)布于 :2022年11月11日 15:01:21

    一起討論討論 STM32F407 DP83848 LWIP 操作系統(tǒng)移植

    之前一直看原子的操作系統(tǒng)移植LWIP,看了很久沒搞懂,甚至一步一步照著操作也沒成功。然后又轉(zhuǎn)向ST官網(wǎng),修改官網(wǎng)例程。照著網(wǎng)上以為網(wǎng)友分享
    發(fā)表于 05-03 09:13

    如何解決lwip移植出錯(cuò)問題?

    原子哥,在做LWIP操作系統(tǒng)移植的時(shí)候,液晶顯示有問題,調(diào)試一下出現(xiàn)的截圖,求助一下,該怎么修改代碼
    發(fā)表于 07-01 04:35

    為什么LWIP操作系統(tǒng)移植但ping不通IP?

    顯示無法訪問目標(biāo)主機(jī)
    發(fā)表于 10-09 04:35

    為什么UCOSIII中移植LWIP會(huì)出現(xiàn)編譯錯(cuò)誤?

    移植的時(shí)候其實(shí)也就是把已經(jīng)通過了的UCOSIII的源碼拷進(jìn)原子哥的LWIP操作系統(tǒng)移植那個(gè)例程里面,但是文件添加完后,一直有這個(gè)編譯錯(cuò)誤
    發(fā)表于 10-10 21:35

    LWIP操作系統(tǒng)移植不能識(shí)別jlink

    用原子的 網(wǎng)絡(luò)實(shí)驗(yàn)1 LWIP操作系統(tǒng)移植無法識(shí)別jlink其他基礎(chǔ)例程,UCOS等例程都可以,就這一個(gè)程序無法識(shí)別,換過電腦,換jlink都一樣,配置也都一樣,請問原子哥和各位大神
    發(fā)表于 03-11 04:36

    NXPl788上lwip操作系統(tǒng)移植,基于Embest開發(fā)板

    NXPl788上lwip操作系統(tǒng)移植,基于Embest開發(fā)板
    發(fā)表于 03-26 15:59 ?85次下載