对OS_CPU.H文件的编写主要包括对以下4个宏进行设置:
① OS_ENTER_CRITICAL()
② OS_EXIT_ CRITICAL()
③ OS_STK_GROWTH
④ OS_TASK_SW()
其中,OS_ENTER_CRITICAL()和OS_EXIT_ CRITICAL()是关于关中断和开中断的设置,由于在TMS320LF2407A中C编译器可以嵌入汇编语言,所以本文设置:
#define OS_ENTER_CRITICAL() asm(" SETC INTM") //关中断
#define OS_EXIT_CRITICAL() asm(" CLRC INTM") //开中断
OS_STK_GROWTH是关于堆栈的使用方式,由于TMS320LF2407A中堆栈是从低地址向高地址递增的,所以本文设置:
#define OS_STK_GROWTH 0
OS_TASK_SW()是在任务切换中使用的,任务切换其实就是将原来任务的相关寄存器值入栈保存,以便以后这个任务被再次调用时可以恢复原先的相关寄存器值。本文设置OS_TASK_SW()作为中断调用软中断指令OSCtxSw。
对OS_CPU_C.C文件的编写包括编写以下10个C语言函数:
① OSTaskStkInit()② OSTaskCreatHook()③ OSTaskDelHook()④ OSTaskSwHook()
⑤ OSTaskIdleHook()⑥ OSTaskStatHook()⑦ OSTimeTickHook()⑧ OSIintHookBegin()
⑨ OSInitHookEnd()⑩ OSTCBInitHook()
在本文的实时嵌入式系统设计中,只对OSTaskStkInit()函数进行了编写,OSTaskStkInit()函数的作用是初始化任务的栈结构,将任务所有寄存器的值都保存到堆栈中。OSTaskStkInit()函数的示意性代码如下所示。
OS_STK *OSTaskStkInit(void (*task)(void *pd),
void *pdata,
OS_STK *ptos,
INT16U opt)
{
opt = opt;
*ptos++ = (OS_STK)pdata; /* augument */
*ptos++ = (OS_STK)0; /* blank */
*ptos++ = (OS_STK)0x27FC;/* ST1 */
*ptos++ = (OS_STK)0x2600;/* ST0 */
*ptos++ = (OS_STK)0; /* ACCH */
*ptos++ = (OS_STK)0; /* ACCL */
*ptos++ = (OS_STK)0; /* PH */
*ptos++ = (OS_STK)0; /* PL */
*ptos++ = (OS_STK)0; /* T */
*ptos++ = (OS_STK)0; /* AR0 */
*ptos++ = (OS_STK)0; /* AR2 */
*ptos++ = (OS_STK)0; /* AR3 */
*ptos++ = (OS_STK)0; /* AR4 */
*ptos++ = (OS_STK)0; /* AR5 */