在FreeRTOS中,监控任务的堆栈使用情况和运行时间统计是优化系统性能、排查资源问题的重要手段。一开始在创建任务时需要分配的栈大小,一般都是用自己的经验,但是任务栈空间的实际使用量会随着任务执行和中断处理过程上下浮动
分配栈过小会溢出,导致触发看门狗一直复位,如果分配过大则又导致资源的浪费。这时就需查看任务线程栈的大小了,使用栈情况,进行针对优化
检查任务栈最高水位
有一个函数可以查看任务剩余栈的最高水位,也就是还有多少空余的栈空间
原理是创建任务时候,栈固定的填充了0xa5(FreeRTOS的作法,这里无需自己实现),从栈底往栈顶逐个字节地判断,它们的值持续是 0xa5 就表示它是空闲的
UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );
任务运行时、任务被切换时,都会用到栈。栈里原来值(0xa5)就会
被覆盖。逐个函数从栈的尾部判断栈的值连续为 0xa5 的个数,它就是任务运行过程中空闲内存容量的最小值。注意:假设从栈尾开始连续为 0xa5 的栈空间是 N 字节,返回值是 N/4。
返回值为这个任务栈使用的最高水位线,所谓最高水位线即自任务开始运行以来,任务所使用的栈最大时所剩余的栈大小。因此此值越大,代表任务栈剩余量越大
例如
typedef struct
{
uint32_t highWater; // the high water mark in words
uint32_t remainByte; // this is the number of byte
uint8_t remainPercent;
} TaskStackCheckInfoStruct;
/**
* ******************************************************************************
* @brief : 更新任务堆栈信息
* @param : taskName - 任务名称
* @param : taskHandle - 任务句柄
* @param : pStackInfo - 用于存储堆栈信息的结构体指针
* @param : taskStackSize - 任务堆栈大小
* @note : None
* ******************************************************************************
*/
static void taskStackInfoUpdate(char *taskName,
TaskHandle_t taskHandle,
TaskStackCheckInfoStruct *pStackInfo,
uint32_t taskStackSize)
{
// check if the parameter is

最低0.47元/天 解锁文章
1837

被折叠的 条评论
为什么被折叠?



