元澤懷
(肇慶學(xué)院電子信息與機(jī)電工程學(xué)院,廣東肇慶526061)
LwIP在嵌入式Nios II軟核處理器上的移植及應(yīng)用
元澤懷
(肇慶學(xué)院電子信息與機(jī)電工程學(xué)院,廣東肇慶526061)
Nios II是專門為SOPC設(shè)計的一種軟核CPU,它以IP核的形式提供給嵌入式設(shè)計者.它的可配置特性給嵌入式系統(tǒng)設(shè)計帶來了更大的靈活性,可以說它為嵌入式系統(tǒng)的設(shè)計提供了一種全新的思路.討論了LwIP在NIOS II處理器上的移植實現(xiàn)方法,并將其成功地應(yīng)用于簡單socket服務(wù)器的設(shè)計中.
LwIP;Nios II;嵌入式系統(tǒng);μC/OS II
Nios II處理器是用戶可隨時配置和構(gòu)建的32位指令集和數(shù)據(jù)通道的嵌入式系統(tǒng)微處理器IP軟核,采用avalon總線結(jié)構(gòu)通信接口,帶有增強(qiáng)的內(nèi)存調(diào)試和軟件功能,它可以與各種外設(shè)相結(jié)合,構(gòu)成一個可定制的可編程片上系統(tǒng)SOPC(System On a Programable Chip).網(wǎng)絡(luò)協(xié)議LwIP(Light weight Internet Protocol),即輕量級網(wǎng)絡(luò)協(xié)議,是一種專門針對嵌入式系統(tǒng)應(yīng)用而設(shè)計的網(wǎng)絡(luò)通信協(xié)議,LwIP實現(xiàn)的重點是在保持TCP/IP協(xié)議主要功能的基礎(chǔ)上減少對RAM的占用,一般它只需要幾十Kbyte的RAM和40Kbyte左右的ROM就可以運行,非常適合在以Nios II處理器為核心的系統(tǒng)中使用.Nios II處理器系統(tǒng)的網(wǎng)絡(luò)開發(fā)平臺的系統(tǒng)模型如圖1.
圖1 Nios II的網(wǎng)絡(luò)開發(fā)模型
圖2 Nios II軟件模型
Altera使用μC/OS-ⅡRTOS多線程環(huán)境移植LwIP,因此,要使用LwIP,必須建立基于μC/OS-ⅡRTOS上的C/C++項目.Altera對LwIP的移植是基于Nios II硬件抽象層HAL通用網(wǎng)絡(luò)設(shè)備模式的.通過這個模式,我們可以自編新驅(qū)動程序去支撐目標(biāo)媒體訪問控制器(MAC),維持HAL和socket API訪問硬件[1].Nios II軟件體系結(jié)構(gòu)見圖2.
1.1 初始化LwIP協(xié)議棧
在調(diào)用OSStart()函數(shù)開始μC/OS-Ⅱ調(diào)度程序前,必須先初始化LwIP[2].
Lwip_stack_init(),這個函數(shù)執(zhí)行協(xié)議棧設(shè)置.
init_done_func(),這個函數(shù)在棧初始化后被調(diào)用,函數(shù)必須調(diào)用lwip_devices_init()初始化所有安裝的網(wǎng)絡(luò)設(shè)備驅(qū)動程序,然后創(chuàng)建接收任務(wù).
lwip_devices_init(),這個函數(shù)說明了所有在system.h文件里定義的已安裝的網(wǎng)絡(luò)設(shè)備驅(qū)動程序.函數(shù)返回非0值,表示初始化成功.如果成功,TCP/IP棧是可見的,然后就可為程序創(chuàng)建任務(wù).
get_mac_addr()和get_ip_addr(),這2個函數(shù)在設(shè)備初始化期間被LwIP系統(tǒng)代碼調(diào)用.這些函數(shù)是LwIP系統(tǒng)代碼設(shè)置MAC和IP地址所必需的.
通過編寫這些函數(shù),系統(tǒng)可以在任意位置存儲MAC地址和IP地址.
1.2 調(diào)用socket接口
一旦網(wǎng)絡(luò)設(shè)備被初始化,程序的其余部分必須使用socket API訪問IP棧.
要使用socket API建立和IP棧對話的新任務(wù),必須使用sys_thread_new()函數(shù),這個函數(shù)是LwIP OS移植層創(chuàng)建線程的一部分.sys_thread_new()調(diào)用μC/OS-ⅡOSTaskCreate()函數(shù)并執(zhí)行其他LwIP指定的動作[3].我們可以通過在應(yīng)用程序里加入語句#include″lwip/sys.h″調(diào)用它.
1.3 在Nios II IDE里配置LwIP
LwIP協(xié)議棧有很多配置選項,這些選項可以通過使用lwipopts.h文件里的#define來進(jìn)行配置.Nios II IDE集成開發(fā)環(huán)境提供了一個圖形化的用戶接口GUI,見圖3.通過GUI可以配置LwIP選項(也就是修改lwipopts.h文件里的#define)而不必編輯源代碼,當(dāng)然有些選項是必須通過lwipopts.h文件才能改變的.
圖3 Light wight TCP/IP棧選項
在圖中,提供了IP、TCP、ARP、UDP、DHCP等各選項的配置選擇,用戶可直接根據(jù)實際需要進(jìn)行設(shè)置.至此,就完成了LwIP在Nios II上的整個移植過程[4].
1.4 測試
完成上面的移植修改工作后,就可以在μC/OS-Ⅱ中初始化LwIP,并創(chuàng)建TCP或UDP任務(wù)進(jìn)行測試了.這部分是用C語言實現(xiàn)的.關(guān)鍵部分的代碼和說明如下:
主程序中,創(chuàng)建了Lwip_init_task初始化LwIP任務(wù)(優(yōu)先級0)和user_task用戶任務(wù)(優(yōu)先級1).1wip_init_task任務(wù)中除了初始化硬件時鐘和LwIP之外,還創(chuàng)建了tcp ip_thread(優(yōu)先級3)和tcpecho_thread(優(yōu)先級4).實際上tcp ip_thread才是LwIP的主線程,多線程的Berkley API也是基于這個線程實現(xiàn)的,即上面的tcpecho_thread線程也要依靠tcp ip_thread線程來與外界通信.
編譯下載運行,用ping ip地址命令可以得到ICMP reply響應(yīng),用telnet ip地址30(登錄30號端口)命令可以看到echo server的回顯效果.說明ARP、IP、ICMP、TCP協(xié)議都已正確運行.
本系統(tǒng)使用Nios II開發(fā)板進(jìn)行應(yīng)用程序的調(diào)試,開發(fā)板以微控制器EP1C6Q240C8N為核心,外擴(kuò)2MB FLASH和1MB SRAM存儲器,用來存放調(diào)試過程中所用到的系統(tǒng)軟件、用戶代碼和數(shù)據(jù).該開發(fā)板不含網(wǎng)卡部分,網(wǎng)卡由自己實現(xiàn).
下面在Nios II處理器系統(tǒng)上設(shè)計了一個簡單的socket服務(wù)器實例,實現(xiàn)LwIP功能,構(gòu)建一個嵌入式網(wǎng)絡(luò)開發(fā)平臺.該socket服務(wù)器實現(xiàn)的數(shù)據(jù)流程圖如圖4.
圖4 簡單socket服務(wù)器實現(xiàn)的數(shù)據(jù)流程圖
該數(shù)據(jù)流程圖的工作過程是:
(1)LwIP軟件組件接收網(wǎng)絡(luò)數(shù)據(jù)包(包含發(fā)自遠(yuǎn)程客戶端程序的一個LED命令).
(2)LwIP通過TCP/IP協(xié)議處理進(jìn)來的網(wǎng)絡(luò)數(shù)據(jù)包,并通過套接字接口(socket API)將數(shù)據(jù)包提交給socket server task.
(3)包含在數(shù)據(jù)包中的LED命令被提取并發(fā)給LED命令隊列,等待LED management tasks進(jìn)行處理.
測試時,可以根據(jù)個人的網(wǎng)絡(luò)設(shè)置情況改變開發(fā)板的IP地址(本測試中IP為192.168.1.120,端口為30),應(yīng)用程序編譯下載運行后,在Nios II IDE的console窗口出現(xiàn)如下提示:
Simple Socket Server starting up
Static IP Address is 192.168.1.120
[sss_task]Simple Socket Server listening on port 30
說明簡單Socket服務(wù)器已準(zhǔn)備就緒,開始運行.
用ping ip地址命令可以得到ICMP reply響應(yīng),用telnet ip地址30(登錄30號端口)命令可以看到socket服務(wù)器的回顯效果.見圖5.
這時,輸入相應(yīng)的數(shù)字,開發(fā)板上相應(yīng)的LED燈就閃爍.在Nios II IDE的console窗口出現(xiàn)如下提示:
[sss_handle_accept]accepted connection request from 192.168.1.113
[sss_handle_receive]processing RX data
Value for LED_PIO_BASE set to 1.
Value for LED_PIO_BASE set to 3.
Value for LED_PIO_BASE set to 7.
Value for LED_PIO_BASE set to 15.
Value for LED_PIO_BASE set to 31.
Value for LED_PIO_BASE set to 63.
Value for LED_PIO_BASE set to 127.
Value for LED_PIO_BASE set to 255.
說明ARP、IP、ICMP、TCP協(xié)議都已正確運行.
圖5 簡單Socket服務(wù)器的響應(yīng)窗口
借助以太網(wǎng)和嵌入式技術(shù),把嵌入式系統(tǒng)連接到internet上,已成為嵌入式系統(tǒng)今后發(fā)展的一個重要的方向.本文的創(chuàng)新點是在Nios II處理器上實現(xiàn)了LwIP網(wǎng)絡(luò)協(xié)議的移植,并成功應(yīng)用于簡單socket服務(wù)器的設(shè)計.該內(nèi)容后續(xù)可應(yīng)用于嵌入式系統(tǒng)的遠(yuǎn)程智能控制等網(wǎng)絡(luò)開發(fā).
[1]李良仁,彭雪峰.LwIP協(xié)議棧在NIOS II系統(tǒng)中的移植[J].機(jī)電技術(shù),2009(4):25-28.
[2]張翠,鄧志良.LwIP協(xié)議棧在μC/OS-II上的移植和應(yīng)用[J].微計算機(jī)信息,2010(3):84-85.
[3]楊玉佳,李廣軍,郊志勇.基于LwIP的串口以太網(wǎng)協(xié)議轉(zhuǎn)換器的設(shè)計與實現(xiàn)[J].電子設(shè)計應(yīng)用,2009(3):63-65.
[4]時建雷,肖鐵軍.面向LwIP的Nios II網(wǎng)絡(luò)驅(qū)動程序開發(fā)[J].微計算機(jī)信息,2008(24):36-38.
The Porting of LwIP in Nios II soft-core Processor and its Application
YUAN Zehuai
(College of Electronic InformationandMechatronic Engineering,Zhaoqing University,Zhaoqing,Guangdong 526061,China)
Nios II is a kind of soft CPU designed forSOPC specially.Forembedded system designer,it is a kind of IP core.Nios II has the characteristics of reconfiguration,which brings more flexibility to the designer. Nios II has offered a kind of brand-new train of thought to Embedded System designer.The porting of LwIP in Nios IIProcessoris discussed,anditis successfully appliedto the designof asimple socketserver.
LwIP;NiosII;EmbeddedSystems;μC/OS II
TP399
A
1009-8445(2010)05-0021-04
(責(zé)任編輯:徐生然)
2010-07-15
元澤懷(1975-),男,廣東惠來人,肇慶學(xué)院電子信息與機(jī)電工程學(xué)院高級實驗師,碩士.