μ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
- μCos之堆栈空间初始化
- STM32学习笔记之堆栈空间
- 堆栈空间
- μcos-II任务堆栈、任务控制块和任务代码
- COS开发之ReadMeFirst
- TI C6000 系列 DSP 之系统初始化和系统堆栈
- uCOSIII学习笔记之任务堆栈的初始化
- μCOS-II系统之时间管理函数OSTimeDly()
- μCOS-II系统之时间管理函数OSTimeDlyHMSM()
- μCOS-II系统之时间管理函数OSTimeDlyResume()
- μCOS-II系统之时间管理函数OSTimeGet()
- μCOS-II源码文件之OS_CORE.C
- μCOS-II源码文件之OS_FLAG.C
- μCOS-II源码文件之OS_MBOX.C
- μCOS-II源码文件之OS_MEM.C
- μCOS-II源码文件之OS_MUTEX.C
- μCOS-II源码文件之OS_Q.C
- μCOS-II源码文件之OS_SEM.C
- [C++_6]运算符重载
- Eclipse和vs2010自动排版快捷键
- 如何让你做软件测试不再迷茫?
- JOIN用法 INNER JOIN/LEFT JOIN/RIGHT JOIN/OUTER JOIN
- 素数定理
- μCos之堆栈空间初始化
- POJ1036类似数塔
- cf(cards)数学题
- 线性表的简单实现
- 关于ldr、adr指令的总结
- VS2008编译错误:fatal error C1902: 程序数据库管理器不匹配;请检查安装
- 1-2-标准体重问题
- 媒体编解码
- VS2008中的 fatal error C1902: 程序数据库管理器不匹配