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