μC/OS-II 任务堆栈的初始化

任务堆栈的作用

应用程序在创建一个新任务的时候,必须把在系统启动这个任务时 CPU 各寄存器所需要的初始数据(任务指针、任务堆栈指针、程序状态字等等),事先存放在任务的堆栈中,以备任务切换等操作时调用。

初始化函数的调用

μC/OS-II 是在创建任务函数 OSTaskCreate( ) 中通过调用任务堆栈初始化函数 OSTaskStkInit( ) 来完成任务堆栈初始化工作的。

它的原型如下:

OS_STK *OSTaskStkInit(
		void (*task)(void *pd),  
		void *pdato, 
		OS_STK *ptos, 
		INT16U opt
		);

由于各种处理器的寄存器及对堆栈的操作方式不尽相同,因此该函数需要用户在进行 μC/OS-II 的移植时,需按所使用的处理器由用户来编写。

以 S3c2440 处理器的堆栈初始化函数为例:

OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt)
{
    OS_STK *stk;

    opt      = opt;                 /* 'opt' is not used, prevent warning */
    stk      = ptos;                /* Load stack pointer */
    
    *(stk)   = (OS_STK)task;        /* Entry Point */
    *(--stk) = (INT32U)0;         	/* LR */
    *(--stk) = (INT32U)0;         	/* R12 */
    *(--stk) = (INT32U)0;         	/* R11 */
    *(--stk) = (INT32U)0;         	/* R10 */
    *(--stk) = (INT32U)0;         	/* R9 */
    *(--stk) = (INT32U)0;         	/* R8 */
    *(--stk) = (INT32U)0;         	/* R7 */
    *(--stk) = (INT32U)0;         	/* R6 */
    *(--stk) = (INT32U)0;         	/* R5 */
    *(--stk) = (INT32U)0;         	/* R4 */
    *(--stk) = (INT32U)0;         	/* R3 */
    *(--stk) = (INT32U)0;         	/* R2 */
    *(--stk) = (INT32U)0;         	/* R1 */
    *(--stk) = (INT32U)p_arg;		/* R0 : argument */
    *(--stk) = (INT32U)0x00000053L; /* CPSR  (SVC mode, Enable only IRQ disable FIQ ) */
 									         
    return (stk);
}
posted @ 2018-04-01 21:40  Zackary丶Liu  阅读(549)  评论(0)    收藏  举报