劉培剛,杜靖中
(1.中國(guó)民用航空局第二研究所 四川 成都 610041;2.北京中企建發(fā)監(jiān)理咨詢有限公司 北京 101300)
基于μC/OS-Ⅱ和LwIP嵌入式設(shè)備以太網(wǎng)通信研究與實(shí)現(xiàn)
劉培剛1,杜靖中2
(1.中國(guó)民用航空局第二研究所 四川 成都 610041;2.北京中企建發(fā)監(jiān)理咨詢有限公司 北京 101300)
文中介紹一種基于高性能、低成本ARM處理器--STM32的嵌入式設(shè)備以太網(wǎng)通信技術(shù)的系統(tǒng)設(shè)計(jì),系統(tǒng)充分利用μC/OS-II實(shí)時(shí)操作系統(tǒng)和LwIP輕量型網(wǎng)絡(luò)協(xié)議棧的特點(diǎn),通過(guò)以太網(wǎng)控制器DP83848和RJ45接口連接網(wǎng)絡(luò),實(shí)現(xiàn)上位機(jī)和客戶端的雙向數(shù)據(jù)傳輸。測(cè)試結(jié)果表明,基于μC/OS-II和LwIP的嵌入式設(shè)備聯(lián)網(wǎng)系統(tǒng)設(shè)計(jì)是正確和可靠的。
LwIP;μC/OS-II;STM32;DP83848;以太網(wǎng)通信
隨著工業(yè)現(xiàn)場(chǎng)控制智能化的發(fā)展,嵌入式設(shè)備迫切需要接入局域網(wǎng)甚至Internet[1],但完整的TCP/IP協(xié)議棧代碼量龐大,移植于資源有限的嵌入式設(shè)備上并不合適[2]。LwIP(Light Weight IP)是瑞典計(jì)算機(jī)科學(xué)院Adam Dunkels等開發(fā)的一個(gè)小型開源的TCP/IP協(xié)議棧[3]。LwIP是輕量級(jí)IP協(xié)議,有無(wú)操作系統(tǒng)的支持都可以運(yùn)行,實(shí)現(xiàn)的重點(diǎn)是在保持TCP協(xié)議主要功能的基礎(chǔ)上減少對(duì)RAM的占用。μC/OS-Ⅱ是一種基于優(yōu)先級(jí)的搶占式多任務(wù)實(shí)時(shí)操作系統(tǒng),包含了任務(wù)管理和調(diào)度、任務(wù)間同步與通信、中斷時(shí)鐘管理以及內(nèi)存管理等功能,多年的實(shí)際應(yīng)用驗(yàn)證了其穩(wěn)定性和可靠性[4]。本文基于LwIP和μC/OS-Ⅱ,研究并實(shí)現(xiàn)了嵌入式設(shè)備的以太網(wǎng)通信功能。
嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II是一個(gè)可裁減的實(shí)時(shí)多任務(wù)搶占式內(nèi)核,具有高度的可移植性,特別適合應(yīng)用于小型嵌入式系統(tǒng)中。其性能可以和很多商業(yè)操作系統(tǒng)相媲美,是一款典型的實(shí)時(shí)操作系統(tǒng),應(yīng)用在許多領(lǐng)域當(dāng)中,例如消費(fèi)類電子、工業(yè)控制等。
μC/OS-II主要分為5個(gè)部分,分別為核心處理部分、時(shí)間處理部分、任務(wù)調(diào)度部分、任務(wù)間通信部分和操作系統(tǒng)移植部分。1)核心處理部分是該操作系統(tǒng)最重要的部分,主要包括任務(wù)控制塊初始化、內(nèi)存初始化、事件初始化、任務(wù)調(diào)度初始化和郵箱隊(duì)列初始化等,操作系統(tǒng)所需的最基本的工作都在這一部分完成;2)時(shí)間處理部分為操作系統(tǒng)提供心跳,是操作系統(tǒng)得以運(yùn)行的最基本保障,μC/OS-II的最小時(shí)鐘單位是time tick(時(shí)鐘節(jié)拍),具體大小因不同硬件而異,一般與時(shí)間相關(guān)的操作都是在這里完成的;3)任務(wù)調(diào)度部分是操作系統(tǒng)的精華所在,主要完成與任務(wù)相關(guān)的一些操作,比如任務(wù)的創(chuàng)建,任務(wù)的刪除等操作;4)任務(wù)間通信部分用于任務(wù)間的相互通信和對(duì)臨界資源的訪問(wèn),主要包括信號(hào)量操作、郵箱操作、消息隊(duì)列操作和事件標(biāo)志等;5)CPU移植部分主要是在指定的CPU上完成操作系統(tǒng)所需的接口,因μC/OS-II是一個(gè)通用性的操作系統(tǒng),所以不可能實(shí)現(xiàn)和具體硬件相關(guān)的操作,只能預(yù)留出接口讓移植者來(lái)完成,這部分代碼需要匯編和C語(yǔ)言共同完成,主要包括任務(wù)級(jí)和中斷級(jí)的任務(wù)調(diào)度,以及時(shí)鐘中斷的處理,為操作系統(tǒng)提供最基本的時(shí)間基準(zhǔn)[5-6],而與微處理相關(guān)的匯編語(yǔ)言代碼只有一小部分而且全部集中在 OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C 3個(gè)文件中。
LwIP協(xié)議與傳統(tǒng)的TCP/IP協(xié)議的設(shè)計(jì)方式是一樣的,也是以分層的協(xié)議設(shè)計(jì)方式來(lái)設(shè)計(jì)的。LwIP協(xié)議為嵌入式系統(tǒng)開發(fā)提供了一個(gè)即靈活又松散的輕量級(jí)嵌入式網(wǎng)絡(luò)協(xié)議[7]。協(xié)議的每一層當(dāng)中,每個(gè)子協(xié)議也分別作為一個(gè)單獨(dú)的模塊來(lái)實(shí)現(xiàn)。雖然這些協(xié)議都是以獨(dú)立的形式來(lái)實(shí)現(xiàn),但是它們不是按照傳統(tǒng)的協(xié)議那樣來(lái)嚴(yán)格進(jìn)行劃分。換而言之,應(yīng)用層的應(yīng)用協(xié)議和協(xié)議底層之間沒(méi)有嚴(yán)格的分開來(lái),應(yīng)用層協(xié)議對(duì)底層協(xié)議所使用的緩沖機(jī)制非常清楚。應(yīng)用層協(xié)議與底層協(xié)議可以通過(guò)共享內(nèi)存的方式,來(lái)實(shí)現(xiàn)整個(gè)通訊的過(guò)程。簡(jiǎn)單的來(lái)說(shuō)就是各個(gè)協(xié)議層之間,可以使用相同的內(nèi)存區(qū)間。例如,應(yīng)用層可以直接對(duì)底層緩沖區(qū)直接操作,從而避免了過(guò)多的數(shù)據(jù)復(fù)制操作。這就是專為嵌入式開發(fā)的LwIP在設(shè)計(jì)的過(guò)程當(dāng)中與傳統(tǒng)TCP/IP最不一樣的地方。
盡管LwIP是專為嵌入式系統(tǒng)開發(fā)的精簡(jiǎn)版、輕量級(jí)的網(wǎng)絡(luò)協(xié)議,但仍然功能較全。除了支持傳統(tǒng)TCP/IP協(xié)議的基本功能外(IP/ICMP/UDP/TCP),還支持包括其他一些機(jī)制,操作系統(tǒng)模擬層、緩沖與內(nèi)存管理子系統(tǒng)、網(wǎng)絡(luò)接口、Internet校驗(yàn)和計(jì)算及API接口等,這樣很大程度上便于嵌入式系統(tǒng)的開發(fā)。
該系統(tǒng)主要硬件電路由處理器和網(wǎng)絡(luò)通信模塊兩部分組成。
處理器選用意法半導(dǎo)體公司生產(chǎn)的基于Cortex-M3內(nèi)核的STM32F107VCT6,該單片機(jī)是一款具有高性能、低成本、低功耗的32位處理器,工作頻率為72 MHz,內(nèi)置256kB的Flash和64kB的SRAM。
芯片內(nèi)部集成了介質(zhì)訪問(wèn)控制器(MAC),只需外接一個(gè)物理層PHY芯片就可以實(shí)現(xiàn)一個(gè)完整的以太網(wǎng)收發(fā)器[8-9]。內(nèi)部MAC與外部的PHY通過(guò)介質(zhì)獨(dú)立接口(MII)或是精簡(jiǎn)介質(zhì)獨(dú)立接口(RMII)傳輸以太網(wǎng)數(shù)據(jù)包。
以太網(wǎng)控制芯片采用美國(guó)國(guó)家半導(dǎo)體(NS)公司生產(chǎn)的DP83848,該芯片是一款10/100 Mbit/s單路物理層以太網(wǎng)收發(fā)器器件,支持10/100 M的以太網(wǎng)通信,同時(shí)也支持MII和RMII接口模式,集成度高,具有全功能、低功耗等性能。
DP83848傳輸線接口是一個(gè)差分線路,網(wǎng)口插座采用內(nèi)置網(wǎng)絡(luò)變壓器、狀態(tài)顯示燈和電阻網(wǎng)絡(luò)的RJ45插座HR911105A,具有信號(hào)耦合、電氣隔離、阻抗匹配、抑制干擾等優(yōu)點(diǎn)。
在本設(shè)計(jì)中直接采用精簡(jiǎn)介質(zhì)獨(dú)立接口(RMII)接入方式,相比介質(zhì)獨(dú)立接口(MII)的方式可以減少一半的接入信號(hào)線數(shù)量,同時(shí)支持平行交叉網(wǎng)線自適應(yīng)。內(nèi)部MAC接收到來(lái)自PHY傳遞的數(shù)據(jù)包并將其通過(guò)FIFO傳遞給直接內(nèi)存訪問(wèn)(DMA),最終由DMA將以太網(wǎng)數(shù)據(jù)包直接傳遞給總線,同理,通過(guò)總線傳遞到DMA的數(shù)據(jù)包可以由PHY芯片DP83848傳遞到HR911105A。圖1為通信設(shè)計(jì)結(jié)構(gòu)框圖,圖2為PHY芯片硬件設(shè)計(jì)原理圖。
圖1 通信模塊設(shè)計(jì)框圖
μC/OS-II中的源代碼在STM32F107VCT6的移植過(guò)程中,主要分為不需要修改和需要修改兩部分。不需要修改的文件只需添加到工程目錄中即可,在這里重點(diǎn)介紹需要修改部分。需要修改源代碼的文件為OS_CPU.C、COS_CPU.H 及 OS_CPU_A.ASM[10]。
OS_CPU.C中要修改的函數(shù)是OSTaskStkInit,其他的9個(gè)函數(shù)不需要包含任何代碼,但是必須聲明。OSTaskStkInit的作用是把任務(wù)堆棧初始化。堆棧中的LR和PC需初始化為任務(wù)的入口地址值,便于任務(wù)切換時(shí)跳轉(zhuǎn)到正確執(zhí)行語(yǔ)句的地方。
OS_CPU.H頭文件中需要修改的內(nèi)容有兩部分:與處理器相關(guān)的少量代碼部分和與編譯器相關(guān)的數(shù)據(jù)類型重定義部分。其中與處理器相關(guān)部分代碼包括任務(wù)切換宏定義、處理器堆棧增長(zhǎng)方向及臨界區(qū)訪問(wèn)處理。
OS_CPU_A.ASM匯編文件中有4個(gè)函數(shù)需要修改:分別為OSSstartHighRdy、OSCtxSw、OSIntCtxSw和OSTickISR。OSSstartHighRdy函數(shù)只在操作系統(tǒng)開始調(diào)度任務(wù)前執(zhí)行一次,目的是啟動(dòng)多任務(wù)調(diào)度。OSCtxSW是任務(wù)切換函數(shù),在任務(wù)執(zhí)行過(guò)程中,μC/OS-Ⅱ內(nèi)核會(huì)啟動(dòng)OSCtxSW進(jìn)行任務(wù)切換,確保進(jìn)入就緒態(tài)的任務(wù)始終是當(dāng)前任務(wù)優(yōu)先級(jí)最高的任務(wù)。匯編函數(shù)OSIntCtxSW是中斷級(jí)任務(wù)切換函數(shù),若在任務(wù)執(zhí)行時(shí)有中斷發(fā)生,且中斷服務(wù)程序所執(zhí)行的任務(wù)比正在運(yùn)行的任務(wù)的優(yōu)先級(jí)更高時(shí),這時(shí)候中斷服務(wù)程序所執(zhí)行的任務(wù)就會(huì)進(jìn)入就緒態(tài),在中斷返回之前,μC/OS-Ⅱ內(nèi)核就會(huì)調(diào)用函數(shù)OSIntCtxSw。系統(tǒng)時(shí)鐘節(jié)拍的中斷服務(wù)函數(shù)是OSTickISR。處理器STM32F107VCT6中有一個(gè)專門用來(lái)定義系統(tǒng)時(shí)鐘節(jié)拍定時(shí)器SysTick。
圖2 DP83848硬件設(shè)計(jì)原理圖
在移植LwIP之前需要將CPU或編譯器相關(guān)的頭文件添加到工程中,并修改相應(yīng)代碼。
cc.h:定義常用數(shù)據(jù)類型、同步機(jī)制、與編譯器相關(guān)的LwIP結(jié)構(gòu)體封裝宏、與平臺(tái)相關(guān)的調(diào)試輸出。為了增加協(xié)議棧可移植性,LwIP避免使用int、long等數(shù)據(jù)類型,而是使用在cc.h文件下自主定義的數(shù)據(jù)類型,包括 u8_t,s8_t,u16_t,s16_t,u32_t,s32_t,em_ptr_t,ys_prot_t等,這樣一方面增加了代碼的可讀性,同時(shí)消除處理器的字長(zhǎng)差異引起的協(xié)議棧移植問(wèn)題[11]。
perf.h:定義性能測(cè)量使用的宏。在pbuf_free(),tcp_input(),udp_input(),ip_forward()中使用到,用戶可以根據(jù)實(shí)際需要定義需要測(cè)試的對(duì)象和數(shù)據(jù)記錄。
cpu.h:定義字節(jié)排放順序,#define BYTE_ORDER LITTLE_ENDIAN為小端模式,即將高位數(shù)據(jù)保存在高地址中。
操作系統(tǒng)模擬層存在的目的主要是為了方便LwIP的移植,它在底層操作系統(tǒng)和LwIP之間提供了一個(gè)接口。這樣,我們?cè)谝浦睱wIP到一個(gè)新的目標(biāo)系統(tǒng)時(shí),只需修改這個(gè)接口即可[12-13]。
由于μC/OS-Ⅱ提供了創(chuàng)建任務(wù)函數(shù)、臨界保護(hù)函數(shù)以及豐富的信號(hào)量和郵箱操作函數(shù),進(jìn)行一定的修改,便可實(shí)現(xiàn)LwIP操作系統(tǒng)模擬層的函數(shù)。與操作系統(tǒng)相關(guān)的結(jié)構(gòu)和函數(shù)實(shí)現(xiàn)包含在sys_arch.c和sys_arch.h中。
1)定義操作系統(tǒng)平臺(tái)需要的數(shù)據(jù)類型:sys_sem_t,sys_mbox_t,sys_thread_t,sys_prot_t。
2)信號(hào)量操作函數(shù)的實(shí)現(xiàn)。sys_sem_new():建立并返回一個(gè)新的信號(hào)量;sys_sem_free():釋放信號(hào)量;sys_sem_signal( ):發(fā)送信號(hào)量;sys_arch_sem_wait():等待由參數(shù)sem指定的信號(hào)并阻塞線程。
3)郵箱操作函數(shù)的實(shí)現(xiàn)。郵箱一次接收多條消息更高效,郵箱中的消息是指針。本文移植中郵箱的實(shí)現(xiàn)機(jī)制為:系統(tǒng)同時(shí)建立多個(gè)郵箱,通過(guò)一個(gè)單向鏈表鏈接在一起。每個(gè)郵箱一次可以接收多條消息,接收消息的最大數(shù)量由消息數(shù)組的大小決定。需要實(shí)現(xiàn)的函數(shù):sys_mbox_new();sys_mbox_free( );sys_mbox_post( );sys_arch_mbox_fetch( )。
4)創(chuàng)建新線程函數(shù)的實(shí)現(xiàn)。void sys_thread_new(void(*thread)(void*arg),void*arg)。
5)系統(tǒng)超時(shí)函數(shù)的實(shí)現(xiàn)。struct sys_timeouts*sys_arch_timeouts(void)。
在LwIP中利用struct netif結(jié)構(gòu)實(shí)現(xiàn)對(duì)不同網(wǎng)絡(luò)接口的操作,在stm32f107_eth_bsp.c文件中編輯網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序,并主要實(shí)現(xiàn)網(wǎng)卡初始化、接收和發(fā)送網(wǎng)絡(luò)數(shù)據(jù)以及網(wǎng)絡(luò)中斷處理函數(shù)這幾部分功能。
1)建立硬件配置文件stm32f107_eth_bsp.c
該文件主要實(shí)現(xiàn)GPIO引腳初始化,配置和使能全局中斷,使能以太網(wǎng)時(shí)鐘等。
2)建立網(wǎng)絡(luò)連接配置文件netconf.c
netconf.c文件主要負(fù)責(zé)搭建底層設(shè)備與LwIP之間的接口。一方面要完成LwIP內(nèi)存區(qū)初始化以及MAC地址等的設(shè)置,另一方面要實(shí)現(xiàn)網(wǎng)絡(luò)驅(qū)動(dòng)與LwIP的對(duì)接,告訴LwIP如何接收來(lái)自底層網(wǎng)絡(luò)的數(shù)據(jù)和如何將數(shù)據(jù)信息發(fā)送出去[14]。
3)ethernetif_init()初始化底層接口
該函數(shù)一方面負(fù)責(zé)完成對(duì)ethernetif結(jié)構(gòu)體的初始化,該結(jié)構(gòu)體擁有響應(yīng)ARP查詢的核心數(shù)據(jù),是對(duì)網(wǎng)絡(luò)底層硬件設(shè)備的描述[15-16]。另一方面利用輸出netif類型參數(shù)實(shí)現(xiàn)向LwIP.注冊(cè)發(fā)送函數(shù)以及鏈路層發(fā)送函數(shù),最后調(diào)用low_level_init(netif)實(shí)現(xiàn)對(duì)硬件設(shè)備的初始化,并建立穩(wěn)定的接收線程。
以PC機(jī)作為服務(wù)器,設(shè)備作為客戶端,服務(wù)器IP為192.168.12.6,端口:8087,客戶端IP為192.168.12.197,在PC機(jī)上使用ping命令測(cè)試網(wǎng)絡(luò)是否連通,從圖3可以看出,通信狀況良好,主機(jī)發(fā)送的32bit的數(shù)據(jù)均成功返回,耗時(shí)均小于1ms,整個(gè)過(guò)程的數(shù)據(jù)收發(fā)正確,丟包率為0%。采用網(wǎng)絡(luò)調(diào)試助手驗(yàn)證數(shù)據(jù)收發(fā)功能,如圖4和5所示均能正常收發(fā)。
圖3 ping通信結(jié)果
圖4 網(wǎng)絡(luò)數(shù)據(jù)接收
圖5 網(wǎng)絡(luò)數(shù)據(jù)發(fā)送
文中基于μC/OS-Ⅱ操作系統(tǒng)和LwIP協(xié)議棧,采用CPU芯片 STM32F107VCT6,PHY芯片 DP83848,實(shí)現(xiàn)了嵌入式設(shè)備的以太網(wǎng)通信,該方案結(jié)構(gòu)簡(jiǎn)單、性能可靠、經(jīng)過(guò)實(shí)際測(cè)試和驗(yàn)證,應(yīng)用效果很好,為嵌入式設(shè)備接入以太網(wǎng)提供了很好的解決方案,具有較高的推廣價(jià)值。
[1]張潔.Lwip協(xié)議棧在嵌入式Linux下的移植與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2011,28(4):94-96.
[2]楊俊.基于μCOS-II和LwIP的嵌入式Web服務(wù)器實(shí)現(xiàn)[J].電氣自動(dòng)化,2011,33(3):62-64.
[3]Shang Junyan,Ding Huafeng.Application of lightweight protocol stack LwIP on embedded Ethernet[C]//International Conference on Electrical and Control Engineering(ICECE 2011),Yichang,China,2011.
[4]劉濤.μC/OS-II任務(wù)調(diào)度算法的改進(jìn)與實(shí)現(xiàn)[D].沈陽(yáng):沈陽(yáng)工業(yè)大學(xué),2013.
[5]周超.基于Cortex-M3的以太網(wǎng)串口服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)[D].武漢:武漢理工大學(xué),2012.
[6]任哲,房紅征,曹靖.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OSII原理及應(yīng)用[M].第3版.北京:北京航空航天大學(xué)出版社,2014.
[7]金仲乾,苗克堅(jiān),王毅航.基于μC/OS-II的LwIP協(xié)議棧的移植和改進(jìn)[J].科學(xué)技術(shù)與工程,2013(1):517-521.
[8]于春雪.基于STM32F107的高速以太網(wǎng)接口設(shè)計(jì)與應(yīng)用[J].電聲技術(shù)2011,35(9):63-67.
[9]劉火良,楊森.STM32庫(kù)開發(fā)實(shí)例指南[M].北京:機(jī)械工業(yè)出版社,2013.
[10]劉波文,孫巖.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II經(jīng)典實(shí)例—基于STM32處理器[M].第2版.北京:北京航空航天大學(xué)出版社,2014.
[11]蔡雄飛.嵌入式TCP/IP協(xié)議LwIP的內(nèi)存管理機(jī)制研究[J].杭州電子科技大學(xué)學(xué)報(bào),2012(8):118-121.
[12]王祖云,楊思國(guó).嵌入式LwIP協(xié)議棧的移植與測(cè)試研究[J].計(jì)算機(jī)與數(shù)字工程,2014(2):272-318.
[13]焦海波.μC/OS-II平臺(tái)下的LwIP移植筆記[EB/OL].http://bbs.elecfans.com.
[14]陸旭.基于μC/OS-II和LwIP的嵌入式設(shè)備監(jiān)控平臺(tái)研究[D].重慶:重慶大學(xué),2013.
[15]胡亦萬(wàn).基于Cortex-M3的LwIP移植以及嵌入式WEB的應(yīng)用研究[D].南昌:南昌大學(xué),2013.
[16]Xiong Shengjiang,Dai Wenwen,Yan Wei.Design and Implementation of LWIP Ethernet Based on SOPC AXI Bus[C]//Proceedings of 2012 International Conference on Electronic Information and Electrical Engineering,2012,16(1):35-40.
Research and implementation of embedded equipment ethernet communication based on μC/OS-Ⅱand LwIP
LIU Pei-gang1,DU Jing-zhong2
(1.The Second Research Institute of CAAC,Chengdu 610041,China ;2.Beijing Zhongqi Construction Supervision Consulting Co.Ltd.,Beijing 101300,China)
This paper introduces a kind of embedded devices networking technology of system design based on high-performance and low-cost ARM processor STM32.The system makes full use of the realtime operating system uC/OS-II and light weight internet protocol stack.Through the ethernet controller DP83848 and RJ45 interface to connect to the internet.Realize the PC and client double data transmission.Test results show that the system design of embedded devices connected to network based on the uC/OS-II and light weight internet protocol is correct and reliable.
LwIP; μC/OS-II; STM32; DP83848; ethernet communication
TN919.6
A
1674-6236(2017)16-0129-05
2016-07-15稿件編號(hào):201607112
劉培剛(1985—),男,重慶人,碩士,工程師。研究方向:電子技術(shù)應(yīng)用開發(fā)。