4362|5

5

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

任务堆栈计算 [复制链接]

任务堆栈计算的疑问?描述如下:
环境:cortex M3+ ucos + IAR
创建两个任务如下,任务中均没用使用APP的局部变量,也即除了系统的堆栈消耗,没用另外加入堆栈消耗:
static void Task_COM_Slave (void *p_arg)
{
         while(1)
   {      
                   OSTimeDly(2);
    }
}
static void Task_COM_Master (void *p_arg)
{
         while(1)
    {
                   OSTimeDly(2);
    }
}
任务堆栈统计如下:



如上图,稳定下来的值在88字节。这和系统堆栈最小消耗吻合。在函数OSTaskStkInit()中。此函数需要22int型的局部变量,对任务堆栈的消耗为4*22 = 88字节。和上图统计吻合。函数图下:


OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
{
    OS_STK *stk;


    (void)opt;                                   /* 'opt' is not used, prevent warning                 */
    stk       = ptos;                            /* Load stack pointer                                 */

                                                 /* Registers stacked as if auto-saved on exception    */
    *(stk)    = (INT32U)0x01000000L;             /* xPSR                                               */
    *(--stk)  = (INT32U)task;                    /* Entry Point                                        */
    *(--stk)  = (INT32U)0xFFFFFFFEL;             /* R14 (LR) (init value will cause fault if ever used)*/
    *(--stk)  = (INT32U)0x12121212L;             /* R12                                                */
    *(--stk)  = (INT32U)0x03030303L;             /* R3                                                 */
    *(--stk)  = (INT32U)0x02020202L;             /* R2                                                 */
    *(--stk)  = (INT32U)0x01010101L;             /* R1                                                 */
    *(--stk)  = (INT32U)p_arg;                   /* R0 : argument                                      */

                                                 /* Remaining registers saved on process stack         */
    *(--stk)  = (INT32U)0x11111111L;             /* R11                                                */
    *(--stk)  = (INT32U)0x10101010L;             /* R10                                                */
    *(--stk)  = (INT32U)0x09090909L;             /* R9                                                 */
    *(--stk)  = (INT32U)0x08080808L;             /* R8                                                 */
    *(--stk)  = (INT32U)0x07070707L;             /* R7                                                 */
    *(--stk)  = (INT32U)0x06060606L;             /* R6                                                 */
    *(--stk)  = (INT32U)0x05050505L;             /* R5                                                 */
    *(--stk)  = (INT32U)0x04040404L;             /* R4                                                 */

    return (stk);
}
但是我想不通,如上图的堆栈消耗304字节是怎么统计出来的呢?系统除了OSTaskStkInit()函数中,还有可能在哪消耗堆栈呢? 我也没用在任务中去申请额外的局部变量啊!怎么去具体计算任务的堆栈消耗?304字节的栈消耗我想不通。实际调试的时候是在系统第6次调度这个任务时,栈统计最大值达到304的。请高人解释!

最新回复

任务的栈空间问题是一个很麻烦的问题。软件的检测可以做到95%以上,但是做不到100%。100%的保证还是要有mmu或者mpu的模块去保证。  详情 回复 发表于 2014-5-17 15:59
点赞 关注

回复
举报

5

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

自己顶一个

关于任务栈空间的大小,大家有没好的经验分享。我在实际应用时,遇到一个情况是,我实际申请的局部变量只有1K,但是工具统计出 最大出现 3K的栈使用,虽然系统没用死机。也会去怀疑工具统计的是否有问题。但是没用确切的证据,想听听看大家的看法?
 
 

回复

420

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
我的建议是看一下反汇编,推算一下哪里的sp指针压的最多。应该能看出来的。还有个办法是代码边加边查栈空间使用,直到某个地方突然使用增大,就是那个地方出问题了。

[ 本帖最后由 jorya_txj 于 2013-6-13 22:46 编辑 ]
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

4
 
恩,谢谢陈老师。此问题会继续跟进的!
 
 
 

回复

159

帖子

0

TA的资源

一粒金砂(中级)

5
 
你这是什么工具啊?
 
 
 

回复

420

帖子

0

TA的资源

纯净的硅(初级)

6
 
任务的栈空间问题是一个很麻烦的问题。软件的检测可以做到95%以上,但是做不到100%。100%的保证还是要有mmu或者mpu的模块去保证。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表