2.2 數(shù)字顯示終端的軟件實(shí)現(xiàn)
數(shù)字顯示終端的操作系統(tǒng)選用μCOS-II 實(shí)時(shí)操作系統(tǒng)。它是一種簡(jiǎn)單高效、源代碼公開(kāi)的實(shí)時(shí)嵌入式操作系統(tǒng), 具有良好的擴(kuò)展性和可移植性, 被廣泛應(yīng)用到各種嵌入式處理器上。
μC/OSII 的核心源代碼不用修改, 移植中需要修改的是涉及處理器的OS_CPU_C.C, OS_CPU_A.
ASM, OS_CPU.H 三個(gè)文件。
1) OS_CPU.H 文件包含μC/OSII 所需要的常量、宏和自定義類型等。
OS_CPU.H 定義的數(shù)據(jù)類型。在這次移植中μC/OSII 重新定義了數(shù)據(jù)類型。
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.
不同處理器的堆棧增長(zhǎng)方向是不一樣的,LPC1758 的堆棧是從高地址往低地址增長(zhǎng)的,OS_STK_GROWTH設(shè)為1, 程序?yàn)椋?/p>
#define OS_STK_GROWTH 1.
2) OS_CPU_C.C文件。在OS_CPU_C.C定義的C函數(shù)中,OSTaskStkInit()函數(shù)與處理器相關(guān),所以移植代碼需要修改該函數(shù)。其程序?yàn)椋ǔ跏蓟蝿?wù)時(shí)調(diào)用此函數(shù)初始化任務(wù)使用的堆棧)。
OS_STK * OSTaskStkInit (void (*task) (void
*p_arg),void *p_arg,OS_STK *ptos,INT16U opt)
{
OS_STK *stk;
?。╲oid) opt; //防止編譯警告
stk=ptos; //裝載棧頂指針, 即堆棧數(shù)組最后的地址模擬中斷發(fā)生的堆棧情況
*(stk)=(INT32U)0x01000000L; //xPSR
*(stk)=(INT32U)task; //PC, 任務(wù)入口
*(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, 輸入參數(shù)p_arg 模擬任務(wù)進(jìn)程, 保存其他寄存器到堆棧
*(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 個(gè)簡(jiǎn)單的匯編語(yǔ)言函數(shù)。
OS_ENTER _CRITICAL (): 關(guān)閉中斷源;
OS_EXIT_CRITICAL (): 重開(kāi)中斷源;
OSStartHighRdy (): 運(yùn)行當(dāng)前優(yōu)先級(jí)最高的任務(wù);
OSCtxSw (): 一個(gè)任務(wù)放棄CPU 使用權(quán)時(shí)調(diào)用;
OSIntCtxSw (): 在退出中斷服務(wù)函數(shù)OSIntExit() 中被調(diào)用, 實(shí)現(xiàn)中斷級(jí)任務(wù)切換。
LPC1758使用OSPendSV()函數(shù)快捷地進(jìn)行上下文切換。OSPendSV()的C語(yǔ)言表述程序?yàn)镺SPendSV: 關(guān)中斷;
if (PSP ! =NULL)
{
//保存R4~R11 到任務(wù)堆棧SP_process;
OSTCBCur》OSTCBStkPtr = SP_process;
}
OSTaskSwHook ();
OSPrioCur = OSPrioHighRdy;
OSTCBCur = OSTCBHighRdy;
PSP = OSTCBHighRdy》OSTCBStkPtr;
//從新任務(wù)堆棧中恢復(fù)R4~R11;
/恢復(fù)中斷;
//異常返回;
完成上述工作后, 只要再根據(jù)目標(biāo)板的實(shí)際情況編寫Target 目錄中的3 個(gè)文件, μC/OSII 就可以運(yùn)行在處理器上了。
評(píng)論
查看更多