FreeRTOS 打印任务执行情况 进硬件错误中断

学习FreeRTOS的时候,打印任务执行情况,发现每次都会进入硬件错误中断 。
而硬件中断一般是发生在堆栈溢出,数组越界等情况。
 
开始一步步分析错误位置:
1,发现注释掉打印部分,则不会出现错误,则错误出现在打印部分
        printf("=================================================\r\n");
printf("TaskName    Status  Priority  Stack  Index \r\n");
vTaskList((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
printf("\r\nTaskName         RunTimes           CPU\r\n");
vTaskGetRunTimeStats((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
2,感觉操作系统部分应该不会有问题,于是注释掉操作系统函数
       printf("=================================================\r\n");
printf("TaskName    Status  Priority  Stack  Index \r\n");
// vTaskList((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
printf("\r\nTaskName         RunTimes           CPU\r\n");
// vTaskGetRunTimeStats((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
     但是,注释掉操作系统函数后,发现不进硬件中断了,所有问题出在注释掉的这两个函数里面。
3,进入vTaskList里面,发现有这样的语句:
sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber );
      使用sprint函数把任务信息存储到数组 pcWriteBuffer里,单步运行到这里,就出现了错误。可以定位问题出现在了这里。在继续查看pcWriteBuffer是在任务函数里面定义的
uint8_t pcWriteBuffer[64];,
对应这个数组,有两个可能出错的地方:
(1)首先这个数组定义太小了,可能会导致sprintf调用的时候就数组溢出
(2)在函数内部定义的变量是存储在函数堆栈里的,不能定义很大的数组。
把这个数组定义放在全局变量里面,同时长度定义到300。测试发现不再进硬件错误中断了。
posted @   勇敢蘑菇  阅读(808)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示