在本系統中,軟件一共分為兩個部分:即嵌入式系統實現部分和PC機用戶界面實現部分。嵌入式系統實現部分主要完成對網絡封包的過濾以及完成與PC的人機界面的接口。用戶可以通過USB2.0接口對網絡硬件防火墻進行設置,然后嵌入式系統根據用戶設置的安全規則來完成對網絡封包進行過濾。
3.1 底層軟件的實現
這部分軟件是網絡硬件防火墻實現的關鍵,它主要完成四個方面的工作,即對網絡封包的過濾,日志的記錄并發送,對用戶的報警以及跟PC機的接口。在本系統中我們采用實時操作系統UCOS,配合自己編寫的TCP/IP協議棧來實現對各個網絡層次封包的過濾。
3.1.1 UC/OSII在ARM7下的移植
UCOSII是一個完整、可移植、可固化及可剪裁的占先式實時多任務內核。它用ANSI C編寫,包含一小部分匯編代碼,使之可以供不同架構的微處理器使用。移植該實時操作系統是實現底層軟件的第一步。移植操作系統其實是一件不簡單的事情,它必須要求開發人員對目標硬件平臺有很深的了解;對UCOS的原理有相當的了解;對所使用的編譯器有較深入的了解。只有具備以上三點,才能成功移植該實時操作系統。要移植UCOS,只要編寫三個文件即可,它們分別是:OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM。下面就簡單介紹該移植的實現過程。
第一個是編寫OS_CPU.H。在該文件中主要完成以下幾個方面的工作。首先是幾個數據類型的定義,如INT8U、INT16U、INT16S等,之所以這樣做是因為ANSI C中并沒有明確定義short、int等數據類型的實際長度,它與處理器的類型有關,隱含著不可移植性。代之以移植性強的INT8U、INT16U等數據類型,即直觀又可移植。其次就是完成兩個中斷處理宏的定義,一個是關中斷宏OS_ENTER_CRITICAL( ),另一個就是開中斷宏OS_EXIT_CRITICAL( )。考慮到不是所有版本的C語言都支持C語言級的開關中斷,所以編寫此宏來實現C語言級的開關中斷。最后就是定義棧生長方向和棧的寬度,它們分別用變量OS_STK_GROWTH和OS_STK。
第二個是編寫OS_CPU_C.C。在該文件中主要完成函數OSTaskStkInit( )的編寫,該函數主要完成任務堆棧的的初始化工作,如初始化各個寄存器的狀態,以及用戶添加的一些任務變量等。
第三個是編寫OS_CPU_A.ASM。該文件的是移植的關鍵所在,在本文件中必須完成四個函數的編寫工作,它們分別為OSIntCtxSw( ),OSCtxSw( ), OSStartHighRdy( )和OSTickISR( )。其中前兩個函數是重中之重,它們必須用匯編語言編寫,主要完成任務環境的切換工作。
<!--ecms.*-->
在ARM7硬件平臺下移植UCOSII要注意幾個問題,首先是在移植系統函數或者系統宏時要盡量的調用軟件中斷,這樣有助于簡化移植工作;其次在初始化任務堆棧時,可以添加任務變量OSEnterSum這個變量來監視中斷開關次數,這是關于移植的一個技巧;最后要注意為了方便編寫中斷服務程序,在移植時還要提供相應的匯編宏來簡化用戶層代碼的編寫。
3.1.2 TCP/IP協議棧在UCOSII下的實現

TCP/IP協議分為四層,分別為應用層、傳輸層、網絡層,物理層。本系統中物理層主要包括8019的驅動程序,網絡層包括IP協議和ARP協議,傳輸層主要包括TCP協議和UDP協議,應用層主要包括FTP、HTTP、SNMP和一些用戶應用程序。由于該協議實現很復雜,這也是本系統實現的難點,下面給出該協議棧實現的函數框圖:<!--工控自動化,autooo.net-->