|
发表于 2014-11-22 16:24:10
|
显示全部楼层
你说的的资源是指什么?关于任务的结束,是跟移植密切相关的,目前的ARM移植,都是把OS_TaskReturn函数指针赋给LR。这样你的任务结束前可以先释放自己占有的资源,然后直接return就可以了,就像main一样。因为当你return之后,任务函数返回,也就是回到OS_TaskReturn了,这个函数会负责删除任务的TCB控制块。
具体的知识你参看移植代码os_cpu_c.c文件。
ARM7,ARM9的参考代码:
- OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
- {
- OS_STK *stk;
- INT32U task_addr;
-
- opt = opt; /* 'opt' is not used, prevent warning */
- stk = ptos; /* Load stack pointer */
- task_addr = (INT32U)task & ~1; /* Mask off lower bit in case task is thumb mode */
- *(stk) = (INT32U)task_addr; /* Entry Point */
- *(--stk) = (INT32U)OS_TaskReturn; /* R14 (LR) */
- stk -= 12; /* R12 - R1 */
- *(--stk) = (INT32U)p_arg; /* R0 : argument */
- if ((INT32U)task & 0x01) { /* See if task runs in Thumb or ARM mode */
- *(--stk) = (INT32U)ARM_SVC_MODE_THUMB; /* CPSR (Enable both IRQ and FIQ interrupts, THUMB-mode) */
- } else {
- *(--stk) = (INT32U)ARM_SVC_MODE_ARM; /* CPSR (Enable both IRQ and FIQ interrupts, ARM-mode) */
- }
-
- return (stk);
- }
复制代码
Cortex-M系列参考代码:
- OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
- {
- OS_STK *stk;
- (void)opt; /* 'opt' is not used, prevent warning */
- stk = ptos + 1; /* Load stack pointer */
- stk = (OS_STK *)((INT32U)stk & ~7u); /* 为了兼容AEABI规范,使堆栈指针8字节对齐 */
- /* Registers stacked as if auto-saved on exception */
- *(--stk) = (INT32U)0x01000000L; /* xPSR */
- *(--stk) = (INT32U)task; /* Entry Point */
- *(--stk) = (INT32U)OS_TaskReturn; /* R14 (LR) (init value will jump to OS_TaskReturn()) */
- stk -= 4; /* R12, R3, R2, R1 */
- *(--stk) = (INT32U)p_arg; /* R0 : argument */
- /* Remaining registers saved on process stack */
- stk -= 8; /* R11 - R4 */
- return (stk);
- }
复制代码 |
|