• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

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

大伟 2019-09-10 浏览量:658
附上堆栈检测函数的代码
  1. #define         Usage_STK_SIZE                                                                        128u                //统计任务
  2. #define         IWDG_STK_SIZE                                                                        64u                        //看门狗任务
m data-ke-onclick="copycode($('code_VQ7'));">复制代码


  1. void usage_task(void *p_arg)
  2. {
  3.         OS_ERR err;
  4.         CPU_STK_SIZE freeused;
  5.         p_arg = p_arg;
  6. //        static u32 time = 0time1 = 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*4free*4(used*100)/(used+free));
  16.                
  17.                 OSTaskStkChk (&UsageTaskTCB&free&used&err);
  18.                 printf("UsageTaskTCB                        used/free:%d/%d                usage:%%%d\r\n"used*4free*4(used*100)/(used+free));

  19.                 printf("\r\n");
  20.                
  21.                 debug("%d end in   app_usage\r\n" OSTimeGet(&err));
  22.                 OSTimeDlyHMSM(0030(OS_OPT)OS_OPT_TIME_DLY(OS_ERR*)&err);
  23.         }
  24. }
m data-ke-onclick="copycode($('code_PFE'));">复制代码


代码就检测了喂狗任务的堆栈  和  检测任务的堆栈使用。
打印的地方 *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(000500OS_OPT_TIME_HMSM_STRICT&err);
  21.         }
  22. }
m data-ke-onclick="copycode($('code_QPc'));">复制代码

这是其中的两个打印的情况
mg id="aimg_149055" aid="149055" src="http://www.openedv.com/data/attachment/forum/201909/09/145308kf2lez53c32feif2.png" data-ke-src="http://www.openedv.com/data/attachment/forum/201909/09/145308kf2lez53c32feif2.png" zoomfile="data/attachment/forum/201909/09/145308kf2lez53c32feif2.png" file="data/attachment/forum/201909/09/145308kf2lez53c32feif2.png" class="zoom" data-ke-onclick="zoom(this this.src 0 0 0)" width="484">

mg id="aimg_149056" aid="149056" src="http://www.openedv.com/data/attachment/forum/201909/09/145310x0stakznnzffsskn.png" data-ke-src="http://www.openedv.com/data/attachment/forum/201909/09/145310x0stakznnzffsskn.png" zoomfile="data/attachment/forum/201909/09/145310x0stakznnzffsskn.png" file="data/attachment/forum/201909/09/145310x0stakznnzffsskn.png" class="zoom" data-ke-onclick="zoom(this this.src 0 0 0)" width="456">

总结出来的结果是:
当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字节增加。

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



0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答 数量:0

相关问题

问题达人换一批

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