劉培剛,杜靖中
(1.中國民用航空局第二研究所 四川 成都 610041;2.北京中企建發(fā)監(jiān)理咨詢有限公司 北京 101300)
基于μC/OS-Ⅱ和LwIP嵌入式設備以太網(wǎng)通信研究與實現(xiàn)
劉培剛1,杜靖中2
(1.中國民用航空局第二研究所 四川 成都 610041;2.北京中企建發(fā)監(jiān)理咨詢有限公司 北京 101300)
文中介紹一種基于高性能、低成本ARM處理器--STM32的嵌入式設備以太網(wǎng)通信技術的系統(tǒng)設計,系統(tǒng)充分利用μC/OS-II實時操作系統(tǒng)和LwIP輕量型網(wǎng)絡協(xié)議棧的特點,通過以太網(wǎng)控制器DP83848和RJ45接口連接網(wǎng)絡,實現(xiàn)上位機和客戶端的雙向數(shù)據(jù)傳輸。測試結果表明,基于μC/OS-II和LwIP的嵌入式設備聯(lián)網(wǎng)系統(tǒng)設計是正確和可靠的。
LwIP;μC/OS-II;STM32;DP83848;以太網(wǎng)通信
隨著工業(yè)現(xiàn)場控制智能化的發(fā)展,嵌入式設備迫切需要接入局域網(wǎng)甚至Internet[1],但完整的TCP/IP協(xié)議棧代碼量龐大,移植于資源有限的嵌入式設備上并不合適[2]。LwIP(Light Weight IP)是瑞典計算機科學院Adam Dunkels等開發(fā)的一個小型開源的TCP/IP協(xié)議棧[3]。LwIP是輕量級IP協(xié)議,有無操作系統(tǒng)的支持都可以運行,實現(xiàn)的重點是在保持TCP協(xié)議主要功能的基礎上減少對RAM的占用。μC/OS-Ⅱ是一種基于優(yōu)先級的搶占式多任務實時操作系統(tǒng),包含了任務管理和調(diào)度、任務間同步與通信、中斷時鐘管理以及內(nèi)存管理等功能,多年的實際應用驗證了其穩(wěn)定性和可靠性[4]。本文基于LwIP和μC/OS-Ⅱ,研究并實現(xiàn)了嵌入式設備的以太網(wǎng)通信功能。
嵌入式實時操作系統(tǒng)μC/OS-II是一個可裁減的實時多任務搶占式內(nèi)核,具有高度的可移植性,特別適合應用于小型嵌入式系統(tǒng)中。其性能可以和很多商業(yè)操作系統(tǒng)相媲美,是一款典型的實時操作系統(tǒng),應用在許多領域當中,例如消費類電子、工業(yè)控制等。
μC/OS-II主要分為5個部分,分別為核心處理部分、時間處理部分、任務調(diào)度部分、任務間通信部分和操作系統(tǒng)移植部分。1)核心處理部分是該操作系統(tǒng)最重要的部分,主要包括任務控制塊初始化、內(nèi)存初始化、事件初始化、任務調(diào)度初始化和郵箱隊列初始化等,操作系統(tǒng)所需的最基本的工作都在這一部分完成;2)時間處理部分為操作系統(tǒng)提供心跳,是操作系統(tǒng)得以運行的最基本保障,μC/OS-II的最小時鐘單位是time tick(時鐘節(jié)拍),具體大小因不同硬件而異,一般與時間相關的操作都是在這里完成的;3)任務調(diào)度部分是操作系統(tǒng)的精華所在,主要完成與任務相關的一些操作,比如任務的創(chuàng)建,任務的刪除等操作;4)任務間通信部分用于任務間的相互通信和對臨界資源的訪問,主要包括信號量操作、郵箱操作、消息隊列操作和事件標志等;5)CPU移植部分主要是在指定的CPU上完成操作系統(tǒng)所需的接口,因μC/OS-II是一個通用性的操作系統(tǒng),所以不可能實現(xiàn)和具體硬件相關的操作,只能預留出接口讓移植者來完成,這部分代碼需要匯編和C語言共同完成,主要包括任務級和中斷級的任務調(diào)度,以及時鐘中斷的處理,為操作系統(tǒng)提供最基本的時間基準[5-6],而與微處理相關的匯編語言代碼只有一小部分而且全部集中在 OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C 3個文件中。
LwIP協(xié)議與傳統(tǒng)的TCP/IP協(xié)議的設計方式是一樣的,也是以分層的協(xié)議設計方式來設計的。LwIP協(xié)議為嵌入式系統(tǒng)開發(fā)提供了一個即靈活又松散的輕量級嵌入式網(wǎng)絡協(xié)議[7]。協(xié)議的每一層當中,每個子協(xié)議也分別作為一個單獨的模塊來實現(xiàn)。雖然這些協(xié)議都是以獨立的形式來實現(xiàn),但是它們不是按照傳統(tǒng)的協(xié)議那樣來嚴格進行劃分。換而言之,應用層的應用協(xié)議和協(xié)議底層之間沒有嚴格的分開來,應用層協(xié)議對底層協(xié)議所使用的緩沖機制非常清楚。應用層協(xié)議與底層協(xié)議可以通過共享內(nèi)存的方式,來實現(xiàn)整個通訊的過程。簡單的來說就是各個協(xié)議層之間,可以使用相同的內(nèi)存區(qū)間。例如,應用層可以直接對底層緩沖區(qū)直接操作,從而避免了過多的數(shù)據(jù)復制操作。這就是專為嵌入式開發(fā)的LwIP在設計的過程當中與傳統(tǒng)TCP/IP最不一樣的地方。
盡管LwIP是專為嵌入式系統(tǒng)開發(fā)的精簡版、輕量級的網(wǎng)絡協(xié)議,但仍然功能較全。除了支持傳統(tǒng)TCP/IP協(xié)議的基本功能外(IP/ICMP/UDP/TCP),還支持包括其他一些機制,操作系統(tǒng)模擬層、緩沖與內(nèi)存管理子系統(tǒng)、網(wǎng)絡接口、Internet校驗和計算及API接口等,這樣很大程度上便于嵌入式系統(tǒng)的開發(fā)。
該系統(tǒng)主要硬件電路由處理器和網(wǎng)絡通信模塊兩部分組成。
處理器選用意法半導體公司生產(chǎn)的基于Cortex-M3內(nèi)核的STM32F107VCT6,該單片機是一款具有高性能、低成本、低功耗的32位處理器,工作頻率為72 MHz,內(nèi)置256kB的Flash和64kB的SRAM。
芯片內(nèi)部集成了介質(zhì)訪問控制器(MAC),只需外接一個物理層PHY芯片就可以實現(xiàn)一個完整的以太網(wǎng)收發(fā)器[8-9]。內(nèi)部MAC與外部的PHY通過介質(zhì)獨立接口(MII)或是精簡介質(zhì)獨立接口(RMII)傳輸以太網(wǎng)數(shù)據(jù)包。
以太網(wǎng)控制芯片采用美國國家半導體(NS)公司生產(chǎn)的DP83848,該芯片是一款10/100 Mbit/s單路物理層以太網(wǎng)收發(fā)器器件,支持10/100 M的以太網(wǎng)通信,同時也支持MII和RMII接口模式,集成度高,具有全功能、低功耗等性能。
DP83848傳輸線接口是一個差分線路,網(wǎng)口插座采用內(nèi)置網(wǎng)絡變壓器、狀態(tài)顯示燈和電阻網(wǎng)絡的RJ45插座HR911105A,具有信號耦合、電氣隔離、阻抗匹配、抑制干擾等優(yōu)點。
在本設計中直接采用精簡介質(zhì)獨立接口(RMII)接入方式,相比介質(zhì)獨立接口(MII)的方式可以減少一半的接入信號線數(shù)量,同時支持平行交叉網(wǎng)線自適應。內(nèi)部MAC接收到來自PHY傳遞的數(shù)據(jù)包并將其通過FIFO傳遞給直接內(nèi)存訪問(DMA),最終由DMA將以太網(wǎng)數(shù)據(jù)包直接傳遞給總線,同理,通過總線傳遞到DMA的數(shù)據(jù)包可以由PHY芯片DP83848傳遞到HR911105A。圖1為通信設計結構框圖,圖2為PHY芯片硬件設計原理圖。

圖1 通信模塊設計框圖
μC/OS-II中的源代碼在STM32F107VCT6的移植過程中,主要分為不需要修改和需要修改兩部分。不需要修改的文件只需添加到工程目錄中即可,在這里重點介紹需要修改部分。需要修改源代碼的文件為OS_CPU.C、COS_CPU.H 及 OS_CPU_A.ASM[10]。
OS_CPU.C中要修改的函數(shù)是OSTaskStkInit,其他的9個函數(shù)不需要包含任何代碼,但是必須聲明。OSTaskStkInit的作用是把任務堆棧初始化。堆棧中的LR和PC需初始化為任務的入口地址值,便于任務切換時跳轉到正確執(zhí)行語句的地方。
OS_CPU.H頭文件中需要修改的內(nèi)容有兩部分:與處理器相關的少量代碼部分和與編譯器相關的數(shù)據(jù)類型重定義部分。其中與處理器相關部分代碼包括任務切換宏定義、處理器堆棧增長方向及臨界區(qū)訪問處理。
OS_CPU_A.ASM匯編文件中有4個函數(shù)需要修改:分別為OSSstartHighRdy、OSCtxSw、OSIntCtxSw和OSTickISR。OSSstartHighRdy函數(shù)只在操作系統(tǒng)開始調(diào)度任務前執(zhí)行一次,目的是啟動多任務調(diào)度。OSCtxSW是任務切換函數(shù),在任務執(zhí)行過程中,μC/OS-Ⅱ內(nèi)核會啟動OSCtxSW進行任務切換,確保進入就緒態(tài)的任務始終是當前任務優(yōu)先級最高的任務。匯編函數(shù)OSIntCtxSW是中斷級任務切換函數(shù),若在任務執(zhí)行時有中斷發(fā)生,且中斷服務程序所執(zhí)行的任務比正在運行的任務的優(yōu)先級更高時,這時候中斷服務程序所執(zhí)行的任務就會進入就緒態(tài),在中斷返回之前,μC/OS-Ⅱ內(nèi)核就會調(diào)用函數(shù)OSIntCtxSw。系統(tǒng)時鐘節(jié)拍的中斷服務函數(shù)是OSTickISR。處理器STM32F107VCT6中有一個專門用來定義系統(tǒng)時鐘節(jié)拍定時器SysTick。

圖2 DP83848硬件設計原理圖
在移植LwIP之前需要將CPU或編譯器相關的頭文件添加到工程中,并修改相應代碼。
cc.h:定義常用數(shù)據(jù)類型、同步機制、與編譯器相關的LwIP結構體封裝宏、與平臺相關的調(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等,這樣一方面增加了代碼的可讀性,同時消除處理器的字長差異引起的協(xié)議棧移植問題[11]。
perf.h:定義性能測量使用的宏。在pbuf_free(),tcp_input(),udp_input(),ip_forward()中使用到,用戶可以根據(jù)實際需要定義需要測試的對象和數(shù)據(jù)記錄。
cpu.h:定義字節(jié)排放順序,#define BYTE_ORDER LITTLE_ENDIAN為小端模式,即將高位數(shù)據(jù)保存在高地址中。
操作系統(tǒng)模擬層存在的目的主要是為了方便LwIP的移植,它在底層操作系統(tǒng)和LwIP之間提供了一個接口。這樣,我們在移植LwIP到一個新的目標系統(tǒng)時,只需修改這個接口即可[12-13]。
由于μC/OS-Ⅱ提供了創(chuàng)建任務函數(shù)、臨界保護函數(shù)以及豐富的信號量和郵箱操作函數(shù),進行一定的修改,便可實現(xiàn)LwIP操作系統(tǒng)模擬層的函數(shù)。與操作系統(tǒng)相關的結構和函數(shù)實現(xiàn)包含在sys_arch.c和sys_arch.h中。
1)定義操作系統(tǒng)平臺需要的數(shù)據(jù)類型:sys_sem_t,sys_mbox_t,sys_thread_t,sys_prot_t。
2)信號量操作函數(shù)的實現(xiàn)。sys_sem_new():建立并返回一個新的信號量;sys_sem_free():釋放信號量;sys_sem_signal( ):發(fā)送信號量;sys_arch_sem_wait():等待由參數(shù)sem指定的信號并阻塞線程。
3)郵箱操作函數(shù)的實現(xiàn)。郵箱一次接收多條消息更高效,郵箱中的消息是指針。本文移植中郵箱的實現(xiàn)機制為:系統(tǒng)同時建立多個郵箱,通過一個單向鏈表鏈接在一起。每個郵箱一次可以接收多條消息,接收消息的最大數(shù)量由消息數(shù)組的大小決定。需要實現(xiàn)的函數(shù):sys_mbox_new();sys_mbox_free( );sys_mbox_post( );sys_arch_mbox_fetch( )。
4)創(chuàng)建新線程函數(shù)的實現(xiàn)。void sys_thread_new(void(*thread)(void*arg),void*arg)。
5)系統(tǒng)超時函數(shù)的實現(xiàn)。struct sys_timeouts*sys_arch_timeouts(void)。
在LwIP中利用struct netif結構實現(xiàn)對不同網(wǎng)絡接口的操作,在stm32f107_eth_bsp.c文件中編輯網(wǎng)絡設備驅動程序,并主要實現(xiàn)網(wǎng)卡初始化、接收和發(fā)送網(wǎng)絡數(shù)據(jù)以及網(wǎng)絡中斷處理函數(shù)這幾部分功能。
1)建立硬件配置文件stm32f107_eth_bsp.c
該文件主要實現(xiàn)GPIO引腳初始化,配置和使能全局中斷,使能以太網(wǎng)時鐘等。
2)建立網(wǎng)絡連接配置文件netconf.c
netconf.c文件主要負責搭建底層設備與LwIP之間的接口。一方面要完成LwIP內(nèi)存區(qū)初始化以及MAC地址等的設置,另一方面要實現(xiàn)網(wǎng)絡驅動與LwIP的對接,告訴LwIP如何接收來自底層網(wǎng)絡的數(shù)據(jù)和如何將數(shù)據(jù)信息發(fā)送出去[14]。
3)ethernetif_init()初始化底層接口
該函數(shù)一方面負責完成對ethernetif結構體的初始化,該結構體擁有響應ARP查詢的核心數(shù)據(jù),是對網(wǎng)絡底層硬件設備的描述[15-16]。另一方面利用輸出netif類型參數(shù)實現(xiàn)向LwIP.注冊發(fā)送函數(shù)以及鏈路層發(fā)送函數(shù),最后調(diào)用low_level_init(netif)實現(xiàn)對硬件設備的初始化,并建立穩(wěn)定的接收線程。
以PC機作為服務器,設備作為客戶端,服務器IP為192.168.12.6,端口:8087,客戶端IP為192.168.12.197,在PC機上使用ping命令測試網(wǎng)絡是否連通,從圖3可以看出,通信狀況良好,主機發(fā)送的32bit的數(shù)據(jù)均成功返回,耗時均小于1ms,整個過程的數(shù)據(jù)收發(fā)正確,丟包率為0%。采用網(wǎng)絡調(diào)試助手驗證數(shù)據(jù)收發(fā)功能,如圖4和5所示均能正常收發(fā)。

圖3 ping通信結果

圖4 網(wǎng)絡數(shù)據(jù)接收

圖5 網(wǎng)絡數(shù)據(jù)發(fā)送
文中基于μC/OS-Ⅱ操作系統(tǒng)和LwIP協(xié)議棧,采用CPU芯片 STM32F107VCT6,PHY芯片 DP83848,實現(xiàn)了嵌入式設備的以太網(wǎng)通信,該方案結構簡單、性能可靠、經(jīng)過實際測試和驗證,應用效果很好,為嵌入式設備接入以太網(wǎng)提供了很好的解決方案,具有較高的推廣價值。
[1]張潔.Lwip協(xié)議棧在嵌入式Linux下的移植與實現(xiàn)[J].微計算機信息,2011,28(4):94-96.
[2]楊俊.基于μCOS-II和LwIP的嵌入式Web服務器實現(xiàn)[J].電氣自動化,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任務調(diào)度算法的改進與實現(xiàn)[D].沈陽:沈陽工業(yè)大學,2013.
[5]周超.基于Cortex-M3的以太網(wǎng)串口服務器的設計與實現(xiàn)[D].武漢:武漢理工大學,2012.
[6]任哲,房紅征,曹靖.嵌入式實時操作系統(tǒng)μC/OSII原理及應用[M].第3版.北京:北京航空航天大學出版社,2014.
[7]金仲乾,苗克堅,王毅航.基于μC/OS-II的LwIP協(xié)議棧的移植和改進[J].科學技術與工程,2013(1):517-521.
[8]于春雪.基于STM32F107的高速以太網(wǎng)接口設計與應用[J].電聲技術2011,35(9):63-67.
[9]劉火良,楊森.STM32庫開發(fā)實例指南[M].北京:機械工業(yè)出版社,2013.
[10]劉波文,孫巖.嵌入式實時操作系統(tǒng)μC/OS-II經(jīng)典實例—基于STM32處理器[M].第2版.北京:北京航空航天大學出版社,2014.
[11]蔡雄飛.嵌入式TCP/IP協(xié)議LwIP的內(nèi)存管理機制研究[J].杭州電子科技大學學報,2012(8):118-121.
[12]王祖云,楊思國.嵌入式LwIP協(xié)議棧的移植與測試研究[J].計算機與數(shù)字工程,2014(2):272-318.
[13]焦海波.μC/OS-II平臺下的LwIP移植筆記[EB/OL].http://bbs.elecfans.com.
[14]陸旭.基于μC/OS-II和LwIP的嵌入式設備監(jiān)控平臺研究[D].重慶:重慶大學,2013.
[15]胡亦萬.基于Cortex-M3的LwIP移植以及嵌入式WEB的應用研究[D].南昌:南昌大學,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稿件編號:201607112
劉培剛(1985—),男,重慶人,碩士,工程師。研究方向:電子技術應用開發(fā)。