【简介】
在 FreeRtos 中对任务栈的管理方式可以通过软件的方式来配站栈的生长方向是向上还是向下生长,软件可以配置portSTACK_GROWTH 宏的值来配置任务栈的生长方向,portSTACK_GROWTH > 0 栈的生长方向为向上生长(从低地址向高地址使用),portSTACK_GROWTH < 0 栈的生长方向为向下生长(从高地址向低地址使用)。
【任务栈和TCB内存布局】
如果使用动态创建任务栈的方式创建任务的场景,在任务创建的接口 xTaskCreate 有如下的代码段。
pxTopOfStack
仔细观察这两个编译分支的代码在栈向上和向下生长的配置时,分配 TCB 和 任务栈的顺序是不同的,这个顺序的不同是刻意设计的实际上跟栈的生长方向是相关的。
对于portSTACK_GROWTH < 0 的栈向下生长的场景,代码是先分配的任务栈空间然后分配的Tcb 的空间,对应的内存布局如下:

这样在任务栈溢出的场景不会修改到TCB 的空间,但如果上面堆空间存储了其他任务的TCB 信息块的话是会被异常touch 的。
同理在portSTACK_GROWTH > 0任务栈是向上生长的分支,是回先分配TCB 然后分配任务栈,对应的内存布局如下:

同样也是在任务栈溢出的场景不会异常的覆盖当前任务的TCB信息。
【TCB中栈帧管理】
在TCB 中跟栈相关的成员如下:

其中 pxStack 代表的栈内存的起始地址,pxEndOfStack 代表的栈内存的最大地址,pxTopOfStack 代表中的当前栈使用的地址。
portSTACK_GROWTH < 0 时对应的栈帧管理布局如下
portSTACK_GROWTH > 0 时对应的栈帧管理布局如下

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


我要赚赏金
