打印
[ZLG-ARM]

uC/OS-II 的任务栈

[复制链接]
1793|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ht_chb|  楼主 | 2008-1-23 09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人刚刚接触uC/OS-II,问的问题不知道和不合理

#define    TaskStkLengh    64            //Define the Task0 stack length 定义用户任务0的堆栈长度
 
OS_STK    TaskStk [TaskStkLengh];        //Define the Task0 stack 定义用户任务0的堆栈

void     Task0(void *pdata);            //Task0 任务0

        int main (void)
{
    OSInit ();                                                                                                        
    OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);        
    OSStart ();
    return 0;                                                            
}

以上是uC/OS-II任务调用的常见方式,我想那个用
#define    TaskStkLengh    64        //Define the Task0 stack length 定义用户任务0的堆栈长度 
OS_STK    TaskStk [TaskStkLengh];        //Define the Task0 

能不能用动态方式计算内存长度。这样的方法用根据什么算出来的64、512等。个人想是可能跟函数的形参和嵌套有关吧!我觉得那些64、512等可能浪费大量我们宝贵的RAM啊。

相关帖子

沙发
zlgarm| | 2008-1-23 11:01 | 只看该作者

uC/OS-II

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

使用特权

评论回复
板凳
ht_chb|  楼主 | 2008-1-23 13:16 | 只看该作者

这样可以吗

我也是在LPC2131上跑。
那可以在
OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);       

之前计算出Task0 需要的堆栈。
比如
OS_STK *TaskStk;

//fun( task0 ) ;用也个函数计算出task0 需要的堆栈长度(最大长度)。

malloc( sizeof( fun( task0 ) )) ;
OSTaskCreate (Task0,(void *)0, TaskStk ,2); 



使用特权

评论回复
地板
dld2| | 2008-1-23 13:27 | 只看该作者

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

比如递归调用,比如函数指针。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

56

帖子

0

粉丝