金牌会员
 
- 积分
- 1790
- 金钱
- 1790
- 注册时间
- 2018-3-26
- 在线时间
- 294 小时
|
10金钱
附上堆栈检测函数的代码
- #define Usage_STK_SIZE 128u //统计任务
- #define IWDG_STK_SIZE 64u //看门狗任务
复制代码
- void usage_task(void *p_arg)
- {
- OS_ERR err;
- CPU_STK_SIZE free,used;
- p_arg = p_arg;
- // static u32 time = 0,time1 = 0;
-
- while(DEF_TRUE)
- {
- // time = OSTimeGet(&err);
- debug("%d run in app_usage\r\n", OSTimeGet(&err));
-
- printf("\r\n");
- OSTaskStkChk (&IwdgTaskTCB,&free,&used,&err);
- printf("IwdgTaskTCB used/free:%d/%d usage:%%%d\r\n",used*4,free*4,(used*100)/(used+free));
-
- OSTaskStkChk (&UsageTaskTCB,&free,&used,&err);
- printf("UsageTaskTCB used/free:%d/%d usage:%%%d\r\n",used*4,free*4,(used*100)/(used+free));
- printf("\r\n");
-
- debug("%d end in app_usage\r\n", OSTimeGet(&err));
- OSTimeDlyHMSM(0,0,3,0,(OS_OPT)OS_OPT_TIME_DLY,(OS_ERR*)&err);
- }
- }
复制代码
代码就检测了喂狗任务的堆栈 和 检测任务的堆栈使用。
打印的地方 *4 是为了表示为字节。
然后在喂狗函数里面测试,申请的局部变量与打印出来的堆栈使用情况
- #define num 21
-
- void iwdg_task(void *p_arg)
- {
- OS_ERR err;
- p_arg = p_arg;
- u8 i = 0;
-
- while(1)
- {
- u8 count[num]={0};
-
- // for(i=0; i<num; i++)
- // {
- // count[i] = i;
- // }
-
- IWDG_Feed(); //喂狗
-
- OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err);
- }
- }
复制代码
这是其中的两个打印的情况
总结出来的结果是:
当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字节增加。
请问这是咋回事,有知道的可以谈谈吗?
|
|