OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2908|回复: 2

ucosiii 堆栈检测函数运用的小疑问

[复制链接]

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2019-9-9 15:01:32 | 显示全部楼层 |阅读模式
10金钱
附上堆栈检测函数的代码
  1. #define         Usage_STK_SIZE                                                                        128u                //统计任务
  2. #define         IWDG_STK_SIZE                                                                        64u                        //看门狗任务
复制代码


  1. void usage_task(void *p_arg)
  2. {
  3.         OS_ERR err;
  4.         CPU_STK_SIZE free,used;
  5.         p_arg = p_arg;
  6. //        static u32 time = 0,time1 = 0;
  7.        
  8.         while(DEF_TRUE)
  9.         {
  10. //                time = OSTimeGet(&err);
  11.                 debug("%d run in   app_usage\r\n", OSTimeGet(&err));
  12.                
  13.                 printf("\r\n");
  14.                 OSTaskStkChk (&IwdgTaskTCB,&free,&used,&err);
  15.                 printf("IwdgTaskTCB                        used/free:%d/%d                usage:%%%d\r\n",used*4,free*4,(used*100)/(used+free));
  16.                
  17.                 OSTaskStkChk (&UsageTaskTCB,&free,&used,&err);
  18.                 printf("UsageTaskTCB                        used/free:%d/%d                usage:%%%d\r\n",used*4,free*4,(used*100)/(used+free));

  19.                 printf("\r\n");
  20.                
  21.                 debug("%d end in   app_usage\r\n", OSTimeGet(&err));
  22.                 OSTimeDlyHMSM(0,0,3,0,(OS_OPT)OS_OPT_TIME_DLY,(OS_ERR*)&err);
  23.         }
  24. }
复制代码


代码就检测了喂狗任务的堆栈  和  检测任务的堆栈使用。
打印的地方 *4 是为了表示为字节。

然后在喂狗函数里面测试,申请的局部变量与打印出来的堆栈使用情况

  1. #define num        21
  2.   
  3. void iwdg_task(void *p_arg)
  4. {
  5.         OS_ERR err;
  6.         p_arg = p_arg;
  7.         u8 i = 0;
  8.        
  9.         while(1)
  10.         {
  11.                 u8 count[num]={0};
  12.                
  13. //                for(i=0; i<num; i++)
  14. //                {
  15. //                        count[i] = i;
  16. //                }

  17.                
  18.                 IWDG_Feed();                //喂狗

  19.                
  20.                 OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err);
  21.         }
  22. }
复制代码

这是其中的两个打印的情况
1.png

2.png

总结出来的结果是:
当count 数组的类型是 u8 时,
num 大小  0 -12  打印的used 为 156
num 大小 13 -20 打印的used 为 164
num 大小 21 -28 打印的used 为 172
num 大小 29 -36 打印的used 为 180
num 大小 37 -45 打印的used 为 188
num 大小 45      打印的used 为 196


当count 数组的类型是 u32 时,
num 大小  0 -  3  打印的used 为 156
num 大小  4 -  5  打印的used 为 164
num 大小  6 -  7  打印的used 为 172
num 大小  8 -  9  打印的used 为 180
num 大小 10 -11  打印的used 为 188
num 大小 12       打印的used 为 196


打印出来的数据怎么是8个字节进行的跳变?

然后刚开始定义数组的时候,都超多了8字节也不会跳变,到后面才有规律的8字节增加。

请问这是咋回事,有知道的可以谈谈吗?



最佳答案

查看完整内容[请看2#楼]

再给自己顶一下。。。
茵茵猪头
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
 楼主| 发表于 2019-9-9 15:01:33 | 显示全部楼层
再给自己顶一下。。。
茵茵猪头
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
 楼主| 发表于 2019-9-9 18:11:26 | 显示全部楼层
给自己顶一下
茵茵猪头
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 11:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表