[ZLG-ARM] uC/OS-II 的任务栈

[复制链接]
2531|3
 楼主| ht_chb 发表于 2008-1-23 09:24 | 显示全部楼层 |阅读模式
本人刚刚接触uC/OS-II,问的问题不知道和不合理<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;TaskStkLengh&nbsp;&nbsp;&nbsp;&nbsp;64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Define&nbsp;the&nbsp;Task0&nbsp;stack&nbsp;length&nbsp;定义用户任务0的堆栈长度<br />&nbsp;<br />OS_STK&nbsp;&nbsp;&nbsp;&nbsp;TaskStk&nbsp;[TaskStkLengh];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Define&nbsp;the&nbsp;Task0&nbsp;stack&nbsp;定义用户任务0的堆栈<br /><br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task0(void&nbsp;*pdata);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Task0&nbsp;任务0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;main&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OSInit&nbsp;();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OSTaskCreate&nbsp;(Task0,(void&nbsp;*)0,&nbsp;&TaskStk[TaskStkLengh&nbsp;-&nbsp;1],&nbsp;2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OSStart&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />以上是uC/OS-II任务调用的常见方式,我想那个用<br />#define&nbsp;&nbsp;&nbsp;&nbsp;TaskStkLengh&nbsp;&nbsp;&nbsp;&nbsp;64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Define&nbsp;the&nbsp;Task0&nbsp;stack&nbsp;length&nbsp;定义用户任务0的堆栈长度&nbsp;<br />OS_STK&nbsp;&nbsp;&nbsp;&nbsp;TaskStk&nbsp;[TaskStkLengh];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Define&nbsp;the&nbsp;Task0&nbsp;<br /><br />能不能用动态方式计算内存长度。这样的方法用根据什么算出来的64、512等。个人想是可能跟函数的形参和嵌套有关吧!我觉得那些64、512等可能浪费大量我们宝贵的RAM啊。
zlgarm 发表于 2008-1-23 11:01 | 显示全部楼层

uC/OS-II

ht_chb&nbsp;您好:<br />&nbsp;&nbsp;&nbsp;在uC/OS-II中,堆栈的大小在任务开始时就必须确定,不能动态分配。对于具体应该分配多大的空间,需根据函数的形参、嵌套参数等来计算,一般给一个合适的估算值即可。如果在51上跑的话,对RAM空间来说比较紧张,但在ARM下,大多数应用中RAM都是足够用的,不用担心这一点RAM空间的浪费。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By&nbsp;zlgarm_zhp
 楼主| ht_chb 发表于 2008-1-23 13:16 | 显示全部楼层

这样可以吗

我也是在LPC2131上跑。<br />那可以在<br />OSTaskCreate&nbsp;(Task0,(void&nbsp;*)0,&nbsp;&TaskStk[TaskStkLengh&nbsp;-&nbsp;1],&nbsp;2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />之前计算出Task0&nbsp;需要的堆栈。<br />比如<br />OS_STK&nbsp;*TaskStk;<br /><br />//fun(&nbsp;task0&nbsp;)&nbsp;;用也个函数计算出task0&nbsp;需要的堆栈长度(最大长度)。<br /><br />malloc(&nbsp;sizeof(&nbsp;fun(&nbsp;task0&nbsp;)&nbsp;))&nbsp;;<br />OSTaskCreate&nbsp;(Task0,(void&nbsp;*)0,&nbsp;TaskStk&nbsp;,2);&nbsp;<br /><br /><br /><br />
dld2 发表于 2008-1-23 13:27 | 显示全部楼层

堆栈使用情况可以动态跟踪,很难静态计算

比如递归调用,比如函数指针。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

56

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部