FreeRTOS新建任务时 xTaskCreate 函数有这样一段注释
#if ( portSTACK_GROWTH > 0 )
{
pxNewTCB = ( TCB_t * ) pvPortMallocTcbMem( sizeof( TCB_t ) );
pxNewTCB->pxStack = ( StackType_t * ) pvPortMallocStackMem( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) );
}
#else
{
StackType_t * = pvPortMallocStackMem( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) );
pxNewTCB = ( TCB_t * ) pvPortMallocTcbMem( sizeof( TCB_t ) ); .
pxNewTCB->pxStack = pxStack;
}
#endif
会有疑问:那么为什么栈的增长方向与tcb和stack空间申请的顺序有关?
此处有个约定俗成的知识点:默认内存高地址在上,低地址在下。
portSTACK_GROWTH > 0 即 栈向上生长
portSTACK_GROWTH < 0 即 栈向下生长
下图以栈向下生长为例:
![在这里插入图片描述](https://img-blog.csdnimg.cn/7e064b6c1240454a9b33d696e2235ed6.png)
当栈向下生长时,需在堆上先申请Stack、后申请TCB(谁先申请谁在堆上的地址较小),否则,Stack在生长的过程中可能会覆盖到TCB的区域:
![在这里插入图片描述](https://img-blog.csdnimg.cn/a424ddd876384ee2b6e9ce16fb9e7ee3.png)
同理当栈向上生长时需要先申请TCB后申请Stack。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)