FreeRTOS调试

FreeRTOS调试
THEDI前言
在实际开发过程中,经常会遇见卡死的情况,大多数都是因为FreeRTOS的堆栈溢出
造成,无论是分配给FreeRTOS的总Heap
溢出,或者是单个任务的堆栈
不够,都会造成卡死。
所以在FreeRTOS学会定位很重要,可以节省大量的时间,下面就来介绍一下常见的调式手段,在优化内存
、定位堆栈溢出
有着重要作用
启用FreeRTOS堆栈溢出钩子
具体见FreeRTOS中钩子函数相关笔记
输出所有任务的信息
vTaskList()
是 FreeRTOS 提供的一个非常有用的调试API,可以输出所有任务的运行状态、剩余栈空间等信息,有助于我们监控对应任务堆栈是否足够,堆栈是否分配过多造成浪费等
要使用vTaskList
需要配置这两个宏,具体位置见下方
1 |
- configUSE_TRACE_FACILITY: 打开后,FreeRTOS 内核会收集更多和任务相关的运行数据,并使部分调试/统计API可用,在
FreeRTOSConfig.h
中开启 - configUSE_STATS_FORMATTING_FUNCTIONS: 启用后,FreeRTOS 会包含“格式化输出”相关的辅助函数,主要是把系统状态数据整理成表格字符串,在
FreeRTOS.h
开启
然后在某个任务中输出即可
1 |
|
输出结果如下所示:
- Task Name:任务名(你创建任务时指定的字符串)
- State:任务状态
- R:运行态
- B:阻塞态
- S:挂起态
- D:已被删除
- X:就绪态
- Prio:分配的优先级
- Stack:当前剩余最小栈空间(单位为字/word,通常1word = 4字节)
- Num:任务号
输出FreeRTOS剩余Heap大小
我们可以在程序中输出FreeRTOS剩余Heap大小,监视是否发生Heap不够,Heap溢出的情况
这是我们在FreeRTOSConfig.h
中配置的FreeRTOS使用Heap的总大小
我们使用xPortGetFreeHeapSize
即可获取剩余Heap的总字节数
,可以结合vTaskList
一起输出调试
1 | char taskListBuffer[512]; |
输出结果如下: