田青峰,盧泳兵,劉志鵬
(中國電子科技集團公司第五十四研究所,河北石家莊050081)
基于IP的數據業務已經成為很多系統的標準接口,IP數據業務接口具有接口豐富、簡單和容易二次開發等優點,因此得到了廣泛的應用。隨著設備小型化需求的增強,嵌入式的IP處理平臺研究和應用越來越廣。NIOS軟核和μC/OS-II以低功耗、低成本、高實時性成為應用廣泛的一個開發平臺,該平臺軟、硬件均可按照用戶要求進行配置,最大程度地提高了系統的設計靈活性。
NIOS是ALTERA推出的一種軟核處理器,是一種完全面向用戶、高度可定制的通用精簡指令架構(RISC)的32位嵌入式CPU。用戶使用SOPC工具對所使用的軟核進行包括CPU內部結構、指令集補充等的高級設計,并由QUARTUS工具綜合生成可以運行在FPGA內部的邏輯結構。NIOS的優勢在于其靈活性,其可以根據用戶需要進行靈活的配置和裁剪。并且,NIOS內部所有外設通過統一的Avalon總線與CPU相連,提高了CPU對外設控制的效率。
開發平臺主要由FPGA與片外SRAM存儲器IDT71V416、片外 FLASH 存儲器 AM29LV065D、網絡接口芯片LXT971A以及其他部分組成,如圖1所示。

圖1 系統組成
FPGA支持2種啟動模式:從外部EPCS串行存貯器中啟動和從外部并行FLASH中啟動。本例中由于EPCS串行存貯器片內資源有限,所以選擇使用片外FLASH作為程序存貯器,并從其中啟動。NIOS的程序可以存儲在片內RAM中。本文使用ALTERA的EP2C35F484芯片作為載體,而該片內RAM容量為483 840 bits,這對于移植一個標準版的μC/OS-II是遠遠不夠的,所以使用片外SRAM作為數據存儲器,用作數據存儲器及堆棧,FLASH用作程序存儲器,用來保存用戶程序。
SRAM與FLASH(CFI接口)是NIOS認可的標準外設,具有訪問的標準讀寫時序。SOPC也提供了相應的HAL的實例user_defined_interface,user_defined_interface是一個標準的AVALON總線接口,可以提供讀寫時序、控制信號,如讀寫端口、數據總線和地址總線等。按照AVALON總線端口類型和位寬等分別建立端口,可以提供對 SRAM的訪問[1]。建立的端口如表1所示。

表1 user_defined_interface端口類型
表1中,s_Data和s_Addr共享表示FLASH和SRAM共享數據總線和地址總線,由SOPC分配不同的地址空間來分別訪問。由于FLASH和SRAM共享地址空間,需要通過三態門來分配CPU對2個空間的訪問。
由于FLASH和SRAM共享數據端口,而SRAM是16位數據位寬,FLASH是8位數據位寬,二者共用數據總線就引發了地址對齊問題。不管Avalon master的端口寬度是多少,其地址線的最低位都代表字節地址,即Avalon master的地址只有一種就是字節地址。另外,Avalon三態橋出來的地址Addr也是字節地址,所以連接Avalon三態橋的8位數據寬度的器件,最低位地址與三態橋的 Addr0相連;16位數據寬度的器件,最低地址位必須和三態橋的Addr1相連,而不是Addr0。同理,連接Avalon三態橋的32位數據寬度的器件,其最低地址位必須和三態橋的 Addr2 相連[2]。
完成NIOS和FLASH以及SRAM的連接,即完成了硬件平臺的搭建,可以基于此平臺移植μC/OSII。與很多嵌入式操作系統一樣,μC/OS-II也不具有通用性,用戶要在目標處理器上創建一個多任務的實時嵌入式系統,首先要將操作系統移植到目標處理器上,然后在移植好的操作系統平臺上開發應用程序[3]。在操作系統上開發程序,主要是可以依托操作系統的API函數、線程操作等,實現一些較復雜的算法和功能。
因為不同的處理器有不同的字長,為了保證μC/OS-II的可移植性,就必須定義μC/OS-II認可的數據格式,而標準C中的short、int和long等數據類型是編譯器相關的,是不被μC/OS-II認可的。μC/OS-II的數據類型關鍵字包括 BOOLEAN、INT8U、INT8S和 INT16U等,在移植 μC/OS-II到NIOS之前,需要將OS_CPU.H中數據類型定義的部分進行更改,以適應NIOS中GCC編譯器的數據類型。
μC/OS-II是建立在硬件平臺上的內核,當然需要對底層硬件進行操作。μC/OS-II的移植需要用戶編寫4個與硬件平臺相關的函數:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()和 OSTickISR()[4]。
μC/OS-II為占先式的實時內核,支持多任務操作,并且每個任務都有自己的堆棧,這樣就清晰了各任務之間的界限,增強了系統的穩定性。μC/OS-II還提供了很多的系統服務,例如郵箱、消息隊列、信號量、塊大小固定的內存的申請和釋放、時間函數等,并且還支持多達255層的中斷嵌套。利用這些系統服務就能完成復雜邏輯的要求。
首先在主函數中調用OSInit()函數初始化系統,然后建立用戶任務,最后調用 OSStart()函數啟動多任務。當然,在建立主函數之前必須定義各個任務的堆棧,系統的全局變量和相關宏[5]。
有關μC/OS-II的移植,任務實現及其他相關操作請參見文獻[1]。
LXT971A是Intel公司生產的單端口10/100 Mbps以太網收發器。該模塊集成了IEEE802.3協議,提供MII(Media Independent Interface)接口,可以支持物理層數據處理。
LXT971A通過一個變換器(Transformer)與外部線路相連,實現內外電路電平轉換。在發端,編解碼器將MAC層數據并串變換,編解碼為曼徹斯特碼并發送給變換器。在收端則是一個相反的過程。CPU從LXT971A收到的數據中讀取到該數據幀的源地址以及目的地址,得到外部設備的地址以及數據發送的目的地址。經過NIOS的處理,生成相應的發送數據。
μC/OS-II是多任務操作系統,在系統內部建立專門的讀寫任務,通過AVALON總線對外部雙口RAM進行讀寫,實現與LXT971A的數據交換。
在數據發送時,AVALON總線將以太網數據包寫入雙口RAM中,發模塊(NET_T)負責將雙口RAM中的以太網包由 MII接口寫入 LXT971A[6]。由于NIOS組幀是按字節處理的,而MII接口是半字節,因此,在雙口RAM與發模塊之間需要進行字節到半字節的轉換(D8TO4)。在數據接收時,將MII的半字節轉換成字節(D4TO8),再寫入雙口RAM,由指示NIOS進行讀取。數據交換以雙口RAM為緩存介質,全部以硬件獨立完成,不需要軟件的干預,這樣實現的一個好處就是實現了 NIOS和LXT971A的硬隔離,在NIOS里不需要對LXT971A的時序進行控制,而專心處理數據信息,提高了信息的處理速度[7]。
CPU通過LXT971接口與外部網絡進行數據交換。TCP/IP協議棧就是CPU與外部接口的協議。基于TCP/IP協議棧實現ARP協議和IP協議等,在IP協議基礎上實現ICMP協議等,以實現CPU與外部的網絡接口。
TCP/IP協議棧的工作即是解析與封裝網絡接口包,當接收到以太網幀時即解析,根據以太網幀頭部將數據包分配給IP協議處理模塊和ARP模塊等;如果是發送數據,即對需要發送的數據按照協議進行封裝,然后發送至以太網。
在嵌入式系統中,由于資源有限,一般對TCP/IP協議棧進行裁剪,只需要實現基本的ARP、ICMP等即足以滿足CPU與外部交換數據的需求[8]。
地址解析協議(Address Resolution Protocol,ARP)主要工作是將網絡地址(IP地址)轉換成物理地址(MAC)地址。
ARP工作時,請求主機首先廣播一個含有希望到達的IP地址的數據包,網絡中所有的主機在收到這個ARP請求后,檢查數據包中的目的IP是否和自己的IP地址一致。如果不一致即忽略此數據包,如果一致,則將本機的MAC地址添入一個ARP響應數據包,返回給網絡。
ARP的協議類型字為0x0806,ARP請求操作字為0x01,ARP應答操作字為0x02,ARP協議的以太網包主要字段如圖2所示。在響應ARP請求時,如果主機檢測到ARP地址請求目的地址與本機地址相同,則將以太網包內目的地址換為發起主起地址,源地址換為本機地址,將ARP操作字置為0x02,即可完成ARP請求的響應[9]。

圖2 ARP協議的以太網包格式
網際控制報文協議 (Internet Control Message Protocol,ICMP)是網絡層的差錯和控制報文協議。ICMP協議可以通過PING和TRACERT命令網絡網絡。PING用于檢測網絡的可達性,本文主要討論了PING命令的實現。
由于ICMP命令是基于IP的,所以其協議字為0x0800(IP協議)。PING請求命令的ICMP協議字為0x08,PING響應命令的ICMP協議字為0x00。在PING協議的以太網幀格式主要字段如圖3所示。在響應PING命令時,只需要將目的地址與源地址,源IP地址與源目的地址進行交換,不可改變IP數據字段部分,即可完成 PING 命令的響應[10,11]。這樣,省略了對校驗字段的計算,大大加快了PING命令響應的速度。

圖3 PING協議的以太網包格式
在響應PING命令時,只需要在IP層將目的IP地址與源IP地址調換,目的MAC地址與源MAC地址進行調換,再將ICMP協議置位即可。
硬件方面,通過雙口RAM以信號燈為指示靈活的在操作系統軟件和網絡接口芯片之間進行數據交換,保證了信息的實時、快速的傳輸,為網絡數據的處理提供了通道;軟件方面,NIOS和μC/OS-II的結合,從以前的基于硬件的編程提升到基于操作系統的編程,大大提高了系統設計的靈活性。在μC/OS-II操作系統上完成簡單網絡協議棧的移植,實現IP、ARP等協議的處理,完成了網絡終端的設計。
[1] Altera Corporation.SOPC Builder User Guide[M].USA:Altera Corporation,2012:59-66.
[2] Altera Corporation.Nios II Processor Reference Handbook V5.1[M].USA:Altera Corporation,2008:42-43.
[3] LABROSSE J J.嵌入式實時操作系統μC/OS II[M].邵貝貝,譯.北京:北京航空航天大學出版社,2003:2-4.
[4] 胡 玨.基于μC/OS-II的實時多任務應用研究[J].計算技術與自動化,2008,27(1):115-119.
[5] 呂小納,徐力平.μC/OS-Ⅱ在51單片機上的移植[J].電子設計工程,2012(6):52-54.
[6] Intel Corporation.Intel LXT971A Single-Port 10/100 Mbps PHY Transceiver Datasheet[M].USA:Intel Corp,2005:50-51.
[7] 趙 研,屈 超,岳新宇.千兆以太網SOPC系統的實現[J].無線電工程,2006,36(12):10-12.
[8] 王 珊,程志洪,李 光,等.同步數據轉以太網的接口設計[J].無線電工程,2009,39(3):53-55.
[9] 陳 勇,王 群.TCP/IP網絡中IP地址原理及IP子網的劃分[J].無線電通信技術,2000,26(2):57-61.
[10]周兆清,陳立軍.TCP/IP協議在衛星鏈路上的應用研究[J].無線電工程,2006,36(1):47-50.
[11]李士東.開源Linux中IP協議棧的移植方法[J].無線電工程,2012,42(6):5-7.