王亞丁+徐俊臣++李冠宇++邱文博++胡軼群++楊子原
摘 要 嵌入式設(shè)備常采用實時操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議棧的組合來實現(xiàn)網(wǎng)絡(luò)通訊功能,本文基于FreeRTOS操作系統(tǒng)和LwIP協(xié)議棧為一款轉(zhuǎn)發(fā)模塊實現(xiàn)網(wǎng)絡(luò)通訊功能。FreeRTOS和LwIP開源免費,移植簡單,功能完善,配置靈活。本文介紹了FreeRTOS和LwIP的移植過程和配置方法,并給出了DHCP服務(wù)器和TCP協(xié)議的軟件設(shè)計流程,驗證了基于FreeRTOs和LwIP協(xié)議棧實現(xiàn)網(wǎng)絡(luò)通訊的可行性。
【關(guān)鍵詞】FreeRTOS LwIP 網(wǎng)絡(luò)通訊 移植 TCP
當(dāng)前主流的嵌入式網(wǎng)絡(luò)設(shè)備所使用的操作系統(tǒng)有Linux、UCOSII、FreeRTOS、RTX等。Linux的網(wǎng)絡(luò)協(xié)議棧完備,但內(nèi)核移植裁剪較為復(fù)雜,開發(fā)難度較大;UCOSII參考資料多,但系統(tǒng)商用需付費;RTX(Keil開發(fā))簡單好用,自帶RL_TCPnet協(xié)議棧,但是協(xié)議棧不開源,不便于調(diào)試和研究。本文基于FreeRTOS實時操作系統(tǒng),采用第三方LwIP網(wǎng)絡(luò)協(xié)議棧,實現(xiàn)網(wǎng)絡(luò)通訊功能,為嵌入式網(wǎng)絡(luò)設(shè)備提供了一種新的設(shè)計思路。
FreeRTOS具備良好的實時性、多任務(wù)功能,可移植裁剪,可靈活配置調(diào)度策略,RAM占用小,對系統(tǒng)資源要求低。最重要的是FreeRTOS完全開源免費,而且移植方法簡單,在當(dāng)前小型嵌入式操作系統(tǒng)市場使用率很高。LwIP是由瑞典計算機學(xué)院開發(fā)的一個開源的輕量級TCP/IP協(xié)議棧。LwIP的特點是在有無操作系統(tǒng)環(huán)境下都可以運行,提供完備的API接口,RAM消耗低。本文基于市面上的網(wǎng)絡(luò)轉(zhuǎn)發(fā)模塊,進行FreeRTOS操作系統(tǒng)和LwIP協(xié)議棧的移植,并在移植好的工程上測試DHCP服務(wù)器、TCP通訊功能等,驗證這種可靠實用的網(wǎng)絡(luò)通訊解決方案。
1 硬件平臺
本文采用的設(shè)備是一種能夠?qū)S232串口數(shù)據(jù)轉(zhuǎn)成網(wǎng)絡(luò)數(shù)據(jù)的轉(zhuǎn)發(fā)模塊,模塊的單片機采用ARM架構(gòu)的STM32F429芯片,STM32F429基于Cortex-M4架構(gòu),具有浮點運算單元,2MB容量的FLASH,256KB的RAM,系統(tǒng)時鐘頻率能達(dá)到180MHz,外設(shè)豐富,最主要的是它具有以太網(wǎng)MAC接口,通過外接PHY芯片可以實現(xiàn)網(wǎng)絡(luò)通訊功能。該模塊的PHY芯片采用的是LAN8720,LAN8720是低功耗的10/100M以太網(wǎng)PHY芯片,支持通過RMII接口與以太網(wǎng)MAC層通信,內(nèi)置10/100M全雙工傳輸模塊,支持HP Auto-MDIX自動翻轉(zhuǎn)功能。轉(zhuǎn)發(fā)模塊網(wǎng)絡(luò)部分硬件連接圖如圖1所示。
2 移植FreeRTOS操作系統(tǒng)
首先從官網(wǎng)下載FreeRTOS -8.2.3版本源碼;然后在已有的工程模板(keil軟件)上創(chuàng)建 FreeRTOS相關(guān)文件夾,添加源碼文件到相應(yīng)目錄,添加后的工程目錄如圖2所示,紅框內(nèi)的文件就是添加的FreeRTOS源碼,Source目錄下主要是任務(wù)調(diào)度、消息隊列、定時器等操作系統(tǒng)基本功能的實現(xiàn),Ports目錄下是操作系統(tǒng)與處理器平臺架構(gòu)相關(guān)的接口文件,Port.c是支持Cortex-M4架構(gòu)的,Heap_4.c是一種動態(tài)內(nèi)存使用方法。
FreeRTOSConfig.h是操作系統(tǒng)的配置文件,配置選項至關(guān)重要,決定了系統(tǒng)的功能和性能。移植后主要的配置功能有:使能搶占式調(diào)度器;系統(tǒng)主頻 180MHz;系統(tǒng)時鐘節(jié)拍 1KHz,即 1ms;系統(tǒng)最大優(yōu)先級號;定義堆大小,用于動態(tài)內(nèi)存申請,任務(wù)棧;定義系統(tǒng)可以使用信號量。除此之外,移植中需要注意的地方是要加入三個宏定義,將STM32F429原本的SVC_Handler,PendSV_Handler,SysTick_Handler中斷函數(shù)定義為FreeRTOS內(nèi)部定義的三個函數(shù),因為FreeRTOS對這三個系統(tǒng)中斷有特殊的處理過程。至此,F(xiàn)reeRTOS移植基本完成,可以在后續(xù)軟件工程中使用創(chuàng)建線程,創(chuàng)建信號量、消息隊列等API函數(shù)來實現(xiàn)任務(wù)間的調(diào)度和通信了。
3 移植LwIP協(xié)議棧
首先從官網(wǎng)下載LwIP-1.4.1源碼,然后在軟件工程中添加LwIP相關(guān)目錄,工程結(jié)構(gòu)如圖3所示。LwIP_src目錄下是LwIP源碼,實現(xiàn)基本的LwIP協(xié)議功能。LwIP_port目錄下的文件主要實現(xiàn)了LwIP協(xié)議棧與系統(tǒng)的接口,ethernetif.c文件實現(xiàn)LwIP協(xié)議和以太網(wǎng)驅(qū)動的接口,sys_arch.c文件(位于arch目錄下)實現(xiàn)LwIP協(xié)議和操作系統(tǒng)的接口。
ethernetif.c主要功能是初始化 MAC 相關(guān)工作環(huán)境、初始化 DMA 描述符鏈表。實現(xiàn)LwIP最底層的發(fā)送和接收一幀數(shù)據(jù)的函數(shù)。
sys_arch.c文件包含了LwIP要用到的必要的基于FreeRTOS機制的函數(shù),主要有創(chuàng)建線程函數(shù)sys_thread_new,創(chuàng)建信號量函數(shù)sys_sem_new,創(chuàng)建郵箱函數(shù)sys_mbox_new等。這些函數(shù)需要對FreeRTOS的API做簡單的封裝,如sys_thread_new函數(shù)的本質(zhì)是調(diào)用xTaskCreate來實現(xiàn)創(chuàng)建線程。
APP目錄屬于應(yīng)用層的文件。netconf.c文件實現(xiàn)LwIP協(xié)議棧的初始化并開啟DHCP服務(wù)器,tcp_echoclient.c 文件實現(xiàn)指定的通訊協(xié)議任務(wù)。
stm32f429_eth.c,stm32f429_phy.c由ST公司官方提供,屬于以太網(wǎng)標(biāo)準(zhǔn)庫,用于實現(xiàn)ETH外設(shè)的配置,包括GPIO 初始化,RMII、 SMI 接口初始化,MAC 控制器工作環(huán)境配置,PHY 狀態(tài)獲取等。
4 網(wǎng)絡(luò)通訊測試
測試DHCP服務(wù)器軟件流程如圖4所示,首先硬件初始化,初始化系統(tǒng)時鐘、GPIO引腳、以太網(wǎng)ETH模塊、串口等;然后創(chuàng)建FreeRTOS任務(wù),指定任務(wù)優(yōu)先級,棧大??;啟動FreeRTOS調(diào)度,至此以后系統(tǒng)開始輪詢調(diào)度任務(wù)。
在DHCP任務(wù)中首先執(zhí)行LwIP_Init函數(shù)初始化 LwIP 協(xié)議棧,設(shè)置ip地址、子網(wǎng)掩碼、網(wǎng)關(guān);添加以太網(wǎng)設(shè)備;設(shè)置以太網(wǎng)設(shè)備為默認(rèn)網(wǎng)卡;啟動網(wǎng)卡;設(shè)置鏈路回調(diào)函數(shù),用于獲取鏈路狀態(tài)。然后以250ms的周期查詢DHCP的狀態(tài),當(dāng) DHCP 狀態(tài)為DHCP_START 時,啟動 DHCP 功能, LwIP 會向 DHCP 服務(wù)器申請分配 IP 請求。當(dāng) DHCP 狀態(tài)為 DHCP_WAIT_ADDRESS 時,先判斷IP 地址是否為 0,如果不為 0 說明已經(jīng)有 IP 地址, 將停止DHCP 功能;如果IP 地址總是為 0,就需要判斷超時時間,并響應(yīng)超時錯誤。
使用網(wǎng)線把網(wǎng)絡(luò)模塊和電腦連入同一個路由器,保證路由器可以提供 DHCP 服務(wù)器功能。打開串口調(diào)試助手,為系統(tǒng)上電,可以看到在使能 DHCP 功能后,能夠動態(tài)獲取 的IP 地址,用電腦ping這個地址可以ping通,說明基于FreeRTOS和LwIP協(xié)議的DHCP功能調(diào)試成功。
TCP是一種可靠的、面向連接的通信協(xié)議,建立連接時需要通過“三次握手”建立連接。本文基于LwIP的socket編程接口實現(xiàn)TCP協(xié)議網(wǎng)絡(luò)通訊,電腦作為客戶端,網(wǎng)絡(luò)模塊作為服務(wù)器,TCP軟件流程如圖4所示,初始化軟件流程與DHCP相同,區(qū)別是是創(chuàng)建的任務(wù)是TCP任務(wù):創(chuàng)建socket套接字;調(diào)用bind函數(shù)綁定套接字的地址和端口號;調(diào)用listen函數(shù)監(jiān)聽客戶端的連接請求;調(diào)用accept函數(shù),確立連接;通過recv、send函數(shù)接收發(fā)送數(shù)據(jù),與客戶端通訊。在網(wǎng)絡(luò)調(diào)試助手中確定客戶端和服務(wù)器的IP和端口號,輸入一行內(nèi)容,可回顯服務(wù)器的響應(yīng),即將輸入內(nèi)容打印出來,證明TCP通訊正常。
5 結(jié)語
在嵌入式操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議棧百花齊放的今天,選擇一種簡單實用的網(wǎng)絡(luò)通訊方式能夠很大的提高產(chǎn)品的可靠性和質(zhì)量。本文基于開源免費,移植簡單的FreeRTOS和LwIP協(xié)議棧,為嵌入式設(shè)備提供一種新的實現(xiàn)網(wǎng)絡(luò)通訊功能的設(shè)計流程,具有一定的參考價值。
參考文獻(xiàn)
[1]李少杰,馬曉輝.基于FreeRTOS和LwIP的SNTP設(shè)計[J].單片機與嵌入式系統(tǒng)應(yīng)用,2013(09).
[2]謝鵬程.基于STM32和FreeRTOS的獨立式運動控制器設(shè)計與研究[D].廣州:華南理工大學(xué),2012(05).
[3]余曉光.基于實時操作系統(tǒng)FreeRTOS的Lwip協(xié)議的移植研究[D].昆明:昆明理工大學(xué),2013(04).
作者單位
國家海洋技術(shù)中心 天津市 300112