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。测试发现不再进硬件错误中断了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏