ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

FreeRTOS查看栈大小的使用历史最高

FreeRTOS查看栈大小的使用历史最高 一、一个查任务栈用量的 API嵌入式开发里任务栈开多大是个经典难题——开小了溢出死机开大了浪费宝贵的 RAM。FreeRTOS 给了一个现成的检查工具uxTaskGetStackHighWaterMark()返回任务栈的历史最小剩余空间栈高水位单位是字wordSTM32 上 1 字 4 字节。返回值越小→ 栈用得越多返回0→ 剩余空间归零说明栈曾经溢出过vTaskGetInfo()更完整的接口一次性拿到任务状态、优先级、栈高水位等信息。CubeMX 里启用Middleware → FREERTOS → Config parameters → INCLUDE parameters把INCLUDE_uxTaskGetStackHighWaterMark设为Enabled。我实测的一组数据高水位单位字场景高水位说明不调 printf第一次调用118变量声明在循环外整个函数栈帧一直占着不调 printf稳定后106循环内变量被复用栈占用更稳定调 printf 后84比上面少 22 字 ≈ 88 字节这就是 printf 的栈消耗二、高水位是怎么数出来的0xA5 填充法原理非常朴素创建任务时FreeRTOS 把整块任务栈预填充 0xA5这个固定值任务运行时会往栈里写数据把 0xA5 覆盖掉调用高水位 API 时从栈底往上扫描数一数还有多少连续的 0xA5没被覆盖——这个数量就是从来没被用到过的栈空间。由这个机制还能得到一个编程启示变量的声明位置会影响栈峰值。声明在循环外变量在整个函数生命周期里都占着栈帧声明在循环内编译器可能复用空间栈峰值更低、更稳定。
返回列表