FreeRTOS任务栈查看与运行时间统计(ESP-IDF框架为例)


在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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值