范亞南,高軍科,韓文斌,魏亞偉
(中國航空工業(yè)集團(tuán)公司洛陽電光設(shè)備研究所,河南洛陽 471009)
以太網(wǎng)通信具有抗干擾性、實時性和高速率等特點。面向復(fù)雜應(yīng)用環(huán)境設(shè)計的TCP/IP通信協(xié)議,具有自動糾錯功能,通信質(zhì)量穩(wěn)定,不易受外部環(huán)境干擾,已應(yīng)用于生產(chǎn)生活中的各個領(lǐng)域[1-3]。但是目前嵌入式系統(tǒng)的TCP/IP服務(wù)器,一般只能被單個TCP客戶端連接,未能充分體現(xiàn)TCP/IP協(xié)議的功能,不能滿足多個網(wǎng)絡(luò)節(jié)點同時連接、分布式通信架構(gòu)的現(xiàn)代化網(wǎng)絡(luò)通信需求[4]。
本文提出了一種以高性能微處理器Cortex-M4芯片STM32F407VET6和以太網(wǎng)收發(fā)器LAN8742A為核心的網(wǎng)絡(luò)通信電路。通過FreeRTOS實現(xiàn)多線程任務(wù)管理與調(diào)度,并根據(jù)TCP客戶端連接情況,進(jìn)行網(wǎng)絡(luò)處理線程和數(shù)據(jù)內(nèi)存空間的動態(tài)管理,最大可實現(xiàn)4個客戶端的同時連接與數(shù)據(jù)通信?;谠揟CP Server的嵌入式系統(tǒng),能夠快速集成到網(wǎng)絡(luò)系統(tǒng)中,實現(xiàn)分布式系統(tǒng)構(gòu)建。
如圖1所示,嵌入式TCP服務(wù)器由STM32F407VET6微處理器、以太網(wǎng)收發(fā)器LAN8472A、含網(wǎng)絡(luò)變壓器的RJ45連接器以及系統(tǒng)電源、時鐘分發(fā)等電路組成,并可通過RJ45連接器連接多個TCP客戶端。其中STM32F407VET6處理器內(nèi)部移植了FreeRTOS嵌入式操作系統(tǒng)和Lwip網(wǎng)絡(luò)協(xié)議棧,可實現(xiàn)多個外部TCP客戶端的同時連接。當(dāng)接收到客戶端的數(shù)據(jù)指令后,TCP Server通過Lwip完成用戶IP識別和數(shù)據(jù)緩存,并在任務(wù)處理線程中完成對用戶指令的響應(yīng)執(zhí)行和數(shù)據(jù)回傳。
圖1 嵌入式TCP Server總體框圖
基于FreeRTOS的多連接TCP Server采用高性能且低功耗的STM32F407VET6處理器作為主控芯片。該芯片以ARM Cortex-M4為內(nèi)核,具有32位浮點運算單元(FPU)和自適應(yīng)實時加速器,可以從閃存0等待狀態(tài)執(zhí)行,具備內(nèi)存保護(hù)單元和數(shù)字信號處理DSP功能。STM32F407VET6時鐘頻率配置為168 MHz時,其運算能力高達(dá)210 DMIPS。除此之外,在接口方面集成了Ethernet、 USART、 FSMC、CAN等接口,能夠滿足各類嵌入式系統(tǒng)設(shè)計需求。
以太網(wǎng)電路由STM32內(nèi)部集成的MAC(媒體接入控制層)和低功耗高速網(wǎng)絡(luò)收發(fā)器LAN8742A(PHY物理層)、TVS二極管USBLC6以及RJ45連接器HR911105A組成。其中TVS二極管具有瞬態(tài)電壓抑制作用,主要防止網(wǎng)線熱插拔過程中的電壓浪涌沖擊。此外,HR911105A內(nèi)部集成網(wǎng)絡(luò)變壓器,可以隔離網(wǎng)線上連接的不同設(shè)備間電平不一致的影響,保護(hù)PHY不因外部網(wǎng)絡(luò)電壓不同而通信異常甚至燒壞電路。
LAN8742A通過RMII接口與STM32連接。STM32為網(wǎng)絡(luò)通信設(shè)計了直接內(nèi)存訪問(DMA)功能,當(dāng)STM32內(nèi)部MAC接收到來自PHY傳遞的數(shù)據(jù)包后,將其通過FIFO傳遞到DMA,最終由DMA將以太網(wǎng)數(shù)據(jù)包直接傳遞給總線。同理,STM32對外發(fā)送的數(shù)據(jù),通過總線傳遞到DMA,進(jìn)而由DMA發(fā)送到PHY芯片LAN8742A,最終通過HR911105A連接器到達(dá)客戶端。
STM32F407VET6內(nèi)部MAC和LAN8742A收發(fā)器均符合IEEE 802.3—2002標(biāo)準(zhǔn)的以太網(wǎng)協(xié)議,且支持10/100 MB/s的網(wǎng)速自動檢測適配功能,二者之間通過RMII接口連接。圖2為網(wǎng)絡(luò)通信電路原理圖,RMII接口的主要引腳定義如表1所示。
表1 RMII接口主要信號說明表
圖2 LAN8742A網(wǎng)絡(luò)收發(fā)器電路原理圖
系統(tǒng)軟件使用STM32CubeMX界面化工具(以下簡稱CubeMX)和MDK-ARM集成開發(fā)環(huán)境(以下簡稱MDK)進(jìn)行程序設(shè)計。CubeMX是一種用于STM32系列MCU生成驅(qū)動配置和初始化代碼的圖形化工具,使用CubeMX在進(jìn)行管腳、時鐘、寄存器等硬件資源配置時,可自動進(jìn)行管腳重映射和時鐘倍頻計算,并對各硬件資源生成底層驅(qū)動代碼,可顯著提高系統(tǒng)軟硬件開發(fā)的工作效率。CubeMX支持一些常用的中間件,如RTOS、USB、 LwIP、 圖像和文件等。此外,CubeMX還支持MDK、IAR等工具鏈,便于不同IDE的新建工程或中途修改工程配置。MDK開發(fā)環(huán)境包含代碼編輯、編譯、調(diào)試、下載等功能,支持C語言、匯編語言編程,對STM32微處理器有良好的支持。使用CubeMX選擇MDK工具鏈配置并生成工程后,可以直接由MDK打開,其工程目錄如圖3所示。
圖3 MDK打開CubeMX生成的代碼工程目錄
FreeRTOS操作系統(tǒng)是一個輕量級的嵌入式系統(tǒng),用C語言開發(fā),系統(tǒng)中的任務(wù)沒有數(shù)量的限制,并且支持優(yōu)先級調(diào)度算法,每個任務(wù)被賦予一定的優(yōu)先級,處理器會優(yōu)先執(zhí)行處于就緒態(tài)的優(yōu)先級最高的任務(wù);系統(tǒng)還支持輪換調(diào)度算法,允許不同的任務(wù)使用相同的優(yōu)先級,同一優(yōu)先級的任務(wù)可以共享處理器的使用時間[5-6]。
本文使用CubeMx添加FreeRTOS系統(tǒng),主要需要配置的參數(shù)包括搶占式調(diào)度器、系統(tǒng)主頻、系統(tǒng)時鐘、最大優(yōu)先級號、堆大小等,最終會集中體現(xiàn)在FreeRTOSConfig.h文件中的相關(guān)宏定義。此外,FreeRTOS執(zhí)行需要在SysTick_Handler中斷函數(shù)中調(diào)用osSystickHandler(),其內(nèi)部修改了SVC_Handler和PendSV_Handler系統(tǒng)中斷,為實時操作系統(tǒng)構(gòu)建運行節(jié)拍。FreeRTOS主要包括list.c (內(nèi)核調(diào)度鏈表)、queue.c(隊列)、croutine.c(共享堆棧任務(wù))和task.c(任務(wù))等文件。本文使用獨立堆棧任務(wù)(task.c)建立多個任務(wù)線程,各任務(wù)線程之間支持搶占式調(diào)度。
LwIP的資源開銷低、輕量化,是專為資源有限的嵌入式設(shè)備設(shè)計的,它以少量的資源消耗實現(xiàn)了較完整的TCP/IP協(xié)議棧,減少了對RAM的占用。此外LwIP既可以移植在RTOS里運行,也可無系統(tǒng)運行。LwIP具有內(nèi)存管理策略和數(shù)據(jù)包管理策略,數(shù)據(jù)處理效率很高。通過宏編譯可對LwIP代碼和內(nèi)核進(jìn)行裁剪,從而進(jìn)一步減少對資源的占用[7-8]。
LwIP保留了TCP/IP協(xié)議的主要功能,支持UDP、TCP、IPv4、 ARP等協(xié)議,并提供了3種編程接口:Raw API、Netconn API和Socket API。 本文采用Socket API進(jìn)行編程,具有可讀性好,利于開發(fā)維護(hù)等優(yōu)點。Socket API執(zhí)行效率略低于另2種接口,需要在RTOS中構(gòu)建多任務(wù)執(zhí)行,其工作模式如圖4所示。
圖4 基于RTOS多任務(wù)執(zhí)行的Socket通信
本文使用CubeMX添加LwIP協(xié)議棧,其流程如圖5所示。CubeMX配置時需要注意ETH引腳、MAC地址、硬件校驗、DHCP關(guān)閉、RTOS使能等。關(guān)于TCP Server最大連接客戶端數(shù)量的設(shè)置最終會在opt.h中的MEMP_NUM_NETBUF和MEMP_ NUM_NETCONN體現(xiàn),本文設(shè)置為4。
圖5 LwIP移植流程圖
基于STM32的嵌入式TCP服務(wù)器在工業(yè)領(lǐng)域具有一定的研究基礎(chǔ)和應(yīng)用,但其目前僅實現(xiàn)了面向單個客戶端TCP-Echo模式(點對點通信),未能充分發(fā)揮TCP通信能力,不能滿足分布式網(wǎng)絡(luò)化通信的應(yīng)用需求[9-10]。
針對以上問題,本文結(jié)合工業(yè)網(wǎng)絡(luò)化通信需求,基于FreeRTOS和Lwip,開發(fā)了一種可同時連接4個客戶端的TCP Server系統(tǒng)軟件。軟件流程如圖6所示,在完成網(wǎng)口和串口等硬件初始化后,通過osThreate創(chuàng)建3個任務(wù)(TCP服務(wù)、系統(tǒng)業(yè)務(wù)、任務(wù)監(jiān)控),然后執(zhí)行osKerne1Start開啟任務(wù)調(diào)度,使各個任務(wù)以10 ms周期循環(huán)執(zhí)行。
任務(wù)1基于socket實現(xiàn)TCP Server任務(wù):創(chuàng)建socket;調(diào)用bind()綁定IP和Port;調(diào)用listen()監(jiān)聽客戶端的連接請求;調(diào)用accept()建立新連接,并調(diào)用
圖6 系統(tǒng)軟件流程圖和TCP Server任務(wù)流程圖
sys_thread_new()為新連接的客戶端動態(tài)創(chuàng)建子線程并為客戶端開辟內(nèi)存空間pvPortMalloc();動態(tài)子線程個數(shù)取決于所連接的客戶端數(shù)量(最大4個),當(dāng)檢測到有客戶端斷開連接后則調(diào)用vTaskDelete()銷毀線程并釋放相應(yīng)內(nèi)存vPortFree();在子任務(wù)中通過recv()、send()接收并發(fā)送數(shù)據(jù),解析的指令傳送到任務(wù)2中由業(yè)務(wù)線程進(jìn)行執(zhí)行。
任務(wù)2作為業(yè)務(wù)線程,按照客戶端指令循環(huán)執(zhí)行嵌入式系統(tǒng)功能性任務(wù)。任務(wù)3作為任務(wù)監(jiān)控線程,主要完成各線程狀態(tài)監(jiān)控和系統(tǒng)狀態(tài)監(jiān)控,并通過串口上報系統(tǒng)運行信息。
圖7為對嵌入式TCP Server的網(wǎng)絡(luò)測試實驗圖。其中TCP Server的IP為192.168.1.31,端口:2000,PC機作為客戶端,其物理網(wǎng)卡地址為192.168.1.50。在PC機的Windows控制臺中使用“ping 192.168.1.31 -t”命令測試網(wǎng)絡(luò)是否連通。通過Windows控制臺輸出可以看到,PC機發(fā)送的32 bit的數(shù)據(jù)均成功返回,耗時均小于1 ms,整個過程的數(shù)據(jù)收發(fā)正確,丟包率為0%。
圖7 TCP Server通信測試實驗圖
對于多客戶端連接測試,可采用多個物理PC機同時打開網(wǎng)絡(luò)調(diào)試助手作為客戶端連接到TCP Server。本文通過在一個物理PC機上創(chuàng)建多個虛擬機的方式,利用多個虛擬機的多個虛擬網(wǎng)卡進(jìn)行多客戶端連接測試。圖8所示為IP 92.168.1.51的虛擬機中的客戶端與TCP Server的數(shù)據(jù)通信測試圖。
圖8 TCP Server與客戶端數(shù)據(jù)通信測試圖
本文設(shè)計的TCP Server 作為云臺控制單元已應(yīng)用于一款分布式網(wǎng)絡(luò)架構(gòu)的掛軌型巡檢機器人,該系統(tǒng)的網(wǎng)絡(luò)交聯(lián)關(guān)系如圖9所示。其中TCP Server云臺控制單元可同時連接并響應(yīng)來自系統(tǒng)的主控模塊、行走升降模塊、遠(yuǎn)程監(jiān)控后臺,以及調(diào)試計算機的控制指令,并在其內(nèi)部的系統(tǒng)業(yè)務(wù)線程(任務(wù)2)中完成三軸云臺方位、左臂俯仰、右臂俯仰的角度控制[11]。
圖9 嵌入式TCP Server的多連接應(yīng)用案例示意圖
本文針對目前工業(yè)設(shè)備分布式網(wǎng)絡(luò)通信需求,設(shè)計了一種基于STM32,可最大支持4個客戶端同時連接訪問的嵌入式TCP Server模塊。目前,該TCP Server模塊已作為云臺控制單元集成于一款分布式架構(gòu)的光電檢測機器人中,完成三軸云臺控制功能。經(jīng)測試,該TCP Server具有工作穩(wěn)定、響應(yīng)實時的特點,在嵌入式控制系統(tǒng)中應(yīng)用該TCP Server的軟硬件方案,可有效提升系統(tǒng)的通信能力、拓展性和可維護(hù)性。