这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【FreeRtos】FreeRtos任务栈的生长方向管理方式

共5条 1/1 1 跳转至

【FreeRtos】FreeRtos任务栈的生长方向管理方式

高工
2026-02-04 16:09:53     打赏

【简介】

             在 FreeRtos  中对任务栈的管理方式可以通过软件的方式来配站栈的生长方向是向上还是向下生长,软件可以配置portSTACK_GROWTH  宏的值来配置任务栈的生长方向,portSTACK_GROWTH > 0 栈的生长方向为向上生长(从低地址向高地址使用),portSTACK_GROWTH <  0 栈的生长方向为向下生长(从高地址向低地址使用)。

【任务栈和TCB内存布局】

如果使用动态创建任务栈的方式创建任务的场景,在任务创建的接口 xTaskCreate  有如下的代码段。

 image.pngpxTopOfStack 

仔细观察这两个编译分支的代码在栈向上和向下生长的配置时,分配 TCB 和 任务栈的顺序是不同的,这个顺序的不同是刻意设计的实际上跟栈的生长方向是相关的。

对于portSTACK_GROWTH <  0 的栈向下生长的场景,代码是先分配的任务栈空间然后分配的Tcb 的空间,对应的内存布局如下:

image.png

这样在任务栈溢出的场景不会修改到TCB 的空间,但如果上面堆空间存储了其他任务的TCB 信息块的话是会被异常touch 的。

同理在portSTACK_GROWTH >  0任务栈是向上生长的分支,是回先分配TCB 然后分配任务栈,对应的内存布局如下:

image.png

同样也是在任务栈溢出的场景不会异常的覆盖当前任务的TCB信息。


【TCB中栈帧管理】

在TCB 中跟栈相关的成员如下:

image.png

其中 pxStack 代表的栈内存的起始地址,pxEndOfStack 代表的栈内存的最大地址,pxTopOfStack  代表中的当前栈使用的地址。

portSTACK_GROWTH < 0 时对应的栈帧管理布局如下


image.png


portSTACK_GROWTH > 0 时对应的栈帧管理布局如下


image.png

以下代码为FreeRtos 对TCB 栈管理成员赋值的处理

image.png

image.png


高工
2026-02-06 07:27:33     打赏
2楼

画图还是建议手工画为好,辅助输出的图表看起来比较别扭。


高工
2026-02-08 22:50:46     打赏
3楼

如果我没记错的话,freertos的栈生长方向是可以同时向上和向下生长的。之前用过一家供应商配置的栈管理,默认配置的是向上生长。但是在音效相关的buffer的管理上,使用的是从栈顶向下生长的方式配置的。没记错的话是vPortMalloc_FromEnd来管理的


专家
2026-02-09 07:28:20     打赏
4楼

谢谢分享!


院士
2026-02-09 18:41:56     打赏
5楼

还好,我做应用项目比较多。

可以把对栈的理解交由编译器管理


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]