基于嵌入式實(shí)時(shí)操作系統的現場(chǎng)總線(xiàn)網(wǎng)關(guān)的設計
在μC/OS-Ⅱ中同樣實(shí)現了消息隊列結構OSQ及其相應操作函數,但在μC/OS-Ⅱ并沒(méi)有對消息隊列中的消息進(jìn)行管理,因此不能直接使用,所以sys_mbox_t結構定義如上面所述。對隊列本身的管理利用μC/OS-Ⅱ的OSQ操作完成;對消息的創(chuàng )建、使用、刪除回收使用μC/OS-Ⅱ中的內存管理模塊實(shí)現,兩部分綜合起來(lái)形成了LwIP的消息隊列功能。
2.網(wǎng)絡(luò )設備驅動(dòng)程序
驅動(dòng)程序主要包括:
(1) 初始化CPU芯片s3c4510b的ethernet controller的寄存器和PHY芯片ICS1890的控制寄存器;
(2) 中斷處理函數;
(3) 接收數據包和發(fā)送數據包處理函數。
四、μC/OS-Ⅱ在s3c4510b上的移值
μC/OS-Ⅱ是一個(gè)開(kāi)源的RTOS,其主要工作流程如圖4所示。任務(wù)切換的核心是利用出棧指令將每個(gè)任務(wù)的工作現場(chǎng)恢復,并且調整PC指針來(lái)完成任務(wù)的切換。μC/OS-Ⅱ移值的關(guān)鍵就是如何構造任務(wù)堆棧及切換任務(wù)時(shí)的出棧順序。在這個(gè)流程圖中我們可以看到在移值過(guò)程中需編寫(xiě)的幾個(gè)子程序的位置。
由圖4的工作流程可以看出要實(shí)現μC/OS-Ⅱ的移值,必須對系統源碼做必要的修改,主要集中在以下三個(gè)文件中。
(一) OS CPU.H文件
OS_CPU.H中包括了用#define定義的與處理器相關(guān)的常量、宏、數據類(lèi)型、堆棧單位和堆棧增長(cháng)方向。
1.數據類(lèi)型定義
不同的處理器有不同的字長(cháng),而且數據字長(cháng)和所用的編譯器也有關(guān)系,因此在移植中要定義一些數據類(lèi)型。在本網(wǎng)關(guān)的設計中所用的編譯器是開(kāi)源的GNU下的arm-elf-gCC,用戶(hù)需要做的就是查看所用的編譯器手冊,確定對應于μC/OS-Ⅱ的標準C數據類(lèi)型。
2.堆棧單位及增長(cháng)方向
任務(wù)堆棧的數據類(lèi)型必須和CPU的寄存器長(cháng)度一致,通過(guò)為OS_STK聲明正確的數據類(lèi)型來(lái)完成的,在本設計中的聲明如下:
typedef unsigned int OS_STK;
/ * Each stack entrY is 32_bit wide */
堆棧的增長(cháng)用OS_STK_GROWTH來(lái)設置,OS_STK_GROWTH為O表示堆棧從下向上增長(cháng),為1表示堆棧從上向下增長(cháng),在本設計中的定義如下:
#define OS_STK_GROWTH l
3.宏定義
宏定義包括開(kāi)關(guān)中斷及任務(wù)切換的宏定義:
#define OS_ENTER_CRITICAL( )ARMDis-ableInt( )
#define OS_EXIT_CRITICAL( )ARMEna-bleInt( )
#define OS_TASK_SW( )OSCtXSw( )
(二)OS_CPU_C.C
OS_CPU_C.C主要包括任務(wù)堆棧的初始化,及系統鉤子函數的定義。在這個(gè)文件中包括以下6個(gè)函數:
OSTaskStkInit( )
OSSTaskCreateHook( )
OSTaskDelHook( )
OSTaskSwHook( )
OSTaskStatHook( )
OSTimeTickHook( )
其中5個(gè)HOOK函數如果沒(méi)有特殊要求,只需聲明為空函數,必須修改的是OSTaskStkInit ( )。 OSTaskStkInit( )的實(shí)現如下:
void * OSTaskStkInit (void (* task) (void * pd),void * pdata,void * ptos,INTl6Uopt)
{
unsigned int * stk;
評論