μCos之堆栈空间初始化

    最近在看μ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]当作传出来的栈顶地址了,其实这个参数是堆栈的起始地址,刚开始时也可以看做栈顶地址(因为此时栈是空的)。明白了这个再看源码就清楚了。


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值