2.2 數字顯示終端的軟件實現
數字顯示終端的操作系統選用μCOS-II 實時操作系統。它是一種簡單高效、源代碼公開的實時嵌入式操作系統, 具有良好的擴展性和可移植性, 被廣泛應用到各種嵌入式處理器上。
μC/OSII 的核心源代碼不用修改, 移植中需要修改的是涉及處理器的OS_CPU_C.C, OS_CPU_A.
ASM, OS_CPU.H 三個文件。
1) OS_CPU.H 文件包含μC/OSII 所需要的常量、宏和自定義類型等。
OS_CPU.H 定義的數據類型。在這次移植中μC/OSII 重新定義了數據類型。
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned short INT16U;
typedef signed short INT16S;
typedef unsigned int INT32U;
typedef signed int INT32S;
typedef float FP32;
typedef double FP64;
typedef unsigned int OS_STK;
typedef unsigned int OS_CPU_SR.
不同處理器的堆棧增長方向是不一樣的,LPC1758 的堆棧是從高地址往低地址增長的,OS_STK_GROWTH設為1, 程序為:
#define OS_STK_GROWTH 1.
2) OS_CPU_C.C文件。在OS_CPU_C.C定義的C函數中,OSTaskStkInit()函數與處理器相關,所以移植代碼需要修改該函數。其程序為(初始化任務時調用此函數初始化任務使用的堆棧)。
OS_STK * OSTaskStkInit (void (*task) (void
*p_arg),void *p_arg,OS_STK *ptos,INT16U opt)
{
OS_STK *stk;
(void) opt; //防止編譯警告
stk=ptos; //裝載棧頂指針, 即堆棧數組最后的地址模擬中斷發生的堆棧情況
*(stk)=(INT32U)0x01000000L; //xPSR
*(stk)=(INT32U)task; //PC, 任務入口
*(stk)=(INT32U)0xFFFFFFFEL; //R14(LR)
*(stk)=(INT32U)0x12121212L; //R12
*(stk)=(INT32U)0x03030303L; //R3
*(stk)=(INT32U)0x02020202L; //R2
*(stk)=(INT32U)0x01010101L; //R1
* (stk) =(INT32U)p_arg; //R0, 輸入參數p_arg 模擬任務進程, 保存其他寄存器到堆棧
*(stk)=(INT32U)0x11111111L; //R11
*(stk)=(INT32U)0x10101010L; //R10
*(stk)=(INT32U)0x09090909L; //R9
*(stk)=(INT32U)0x08080808L; //R8
*(stk)=(INT32U)0x07070707L; //R7
*(stk)=(INT32U)0x06060606L; //R6
*(stk)=(INT32U)0x05050505L; //R5
*(stk)=(INT32U)0x04040404L; /R4
return(stk);
}
3) OS_CPU_A.ASM 文件。μC/OSII 的移植需要編寫5 個簡單的匯編語言函數。
OS_EXIT_CRITICAL (): 重開中斷源;
OSStartHighRdy (): 運行當前優先級最高的任務;
OSCtxSw (): 一個任務放棄CPU 使用權時調用;
OSIntCtxSw (): 在退出中斷服務函數OSIntExit() 中被調用, 實現中斷級任務切換。
LPC1758使用OSPendSV()函數快捷地進行上下文切換。OSPendSV()的C語言表述程序為OSPendSV: 關中斷;
if (PSP ! =NULL)
{
//保存R4~R11 到任務堆棧SP_process;
OSTCBCur》OSTCBStkPtr = SP_process;
}
OSTaskSwHook ();
OSPrioCur = OSPrioHighRdy;
OSTCBCur = OSTCBHighRdy;
PSP = OSTCBHighRdy》OSTCBStkPtr;
//從新任務堆棧中恢復R4~R11;
/恢復中斷;
//異常返回;
完成上述工作后, 只要再根據目標板的實際情況編寫Target 目錄中的3 個文件, μC/OSII 就可以運行在處理器上了。
評論
查看更多