任务堆栈计算的疑问?描述如下: 环境:cortex M3+ ucos + IAR 创建两个任务如下,任务中均没用使用APP的局部变量,也即除了系统的堆栈消耗,没用另外加入堆栈消耗: static void Task_COM_Slave (void *p_arg) { while(1) { OSTimeDly(2); } } static void Task_COM_Master (void *p_arg) { while(1) { OSTimeDly(2); } } 任务堆栈统计如下: 如上图,稳定下来的值在88字节。这和系统堆栈最小消耗吻合。在函数OSTaskStkInit()中。此函数需要22个int型的局部变量,对任务堆栈的消耗为4*22 = 88字节。和上图统计吻合。函数图下:
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; /* Load stack pointer */
/* Registers stacked as if auto-saved on exception */
*(stk) = (INT32U)0x01000000L; /* xPSR */
*(--stk) = (INT32U)task; /* Entry Point */
*(--stk) = (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will cause fault if ever used)*/
*(--stk) = (INT32U)0x12121212L; /* R12 */
*(--stk) = (INT32U)0x03030303L; /* R3 */
*(--stk) = (INT32U)0x02020202L; /* R2 */
*(--stk) = (INT32U)0x01010101L; /* R1 */
*(--stk) = (INT32U)p_arg; /* R0 : argument */
/* Remaining registers saved on process stack */
*(--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);
}
但是我想不通,如上图的堆栈消耗304字节是怎么统计出来的呢?系统除了OSTaskStkInit()函数中,还有可能在哪消耗堆栈呢? 我也没用在任务中去申请额外的局部变量啊!怎么去具体计算任务的堆栈消耗?304字节的栈消耗我想不通。实际调试的时候是在系统第6次调度这个任务时,栈统计最大值达到304的。请高人解释!
|