μCos之堆栈空间初始化

来源:互联网 发布:ubuntu svn库 编辑:程序博客网 时间:2024/05/16 01:22

    最近在看μCos关于任务创建的部分,看到堆栈空间初始化部分开始有点迷糊,分析后才渐渐清晰。

    对应的函数是OSTaskCreate,再之后调用到OSTaskStkInit, 其中OSTaskCreate函数的第三个参数是初始化堆栈空间的相关参数。这个参数会根据OS_STK_GROWTH这个宏不同而不同:当OS_STK_GROWTH为1时,调用OSTaskCreate 要这样,

OSTaskCreate (task,pdata, &TaskStack[TASK_STACK_SIZE - 1], prio);

    其中TaskStack[TASK_STACK_SIZE - 1]是指要传递堆栈空间的起始地址,因为当宏OS_STK_GROWTH定义为1时代表堆栈是从内存高地址向低地址增长的,因此首次入栈的数据是放在数组的最高地址,因此把TaskStack[TASK_STACK_SIZE - 1]传进去。

   我们可以再进入到OSTaskStkInit这个函数中看一看,源码是:

OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt){    OS_STK *stk;    opt      = opt;        stk      = ptos;                    *(stk)   = (OS_STK)task;                   *(--stk) = (INT32U)0;             *(--stk) = (INT32U)0;             *(--stk) = (INT32U)0;             *(--stk) = (INT32U)0;             *(--stk) = (INT32U)0;             *(--stk) = (INT32U)0;             *(--stk) = (INT32U)0;             *(--stk) = (INT32U)0;             *(--stk) = (INT32U)0;             *(--stk) = (INT32U)0;             *(--stk) = (INT32U)0;             *(--stk) = (INT32U)0;             *(--stk) = (INT32U)0;             *(--stk) = (INT32U)p_arg;    *(--stk) = (INT32U)0x00000013L;              return (stk);}

可以看到对堆栈空间进行初始化时是对传入的地址不断做减减动作的,因此当堆栈从高地址向低地址增长时要传入数组的最高地址;相反当堆栈从低地址向高地址增长时要传入数组的最低地址。

即当OS_STK_GROWTH为0时,调用OSTaskCreate 要这样,

OSTaskCreate (task,pdata, &TaskStack[0], prio);


起初我的疑惑是误把&TaskStack[0]或&TaskStack[TASK_STACK_SIZE - 1]当作传出来的栈顶地址了,其实这个参数是堆栈的起始地址,刚开始时也可以看做栈顶地址(因为此时栈是空的)。明白了这个再看源码就清楚了。


0 0