【FreeRTOS】栈生长方向 portSTACK_GROWTH

6 篇文章 1 订阅
1 篇文章 0 订阅

FreeRTOS新建任务时 xTaskCreate 函数有这样一段注释

// 代码已简化
/* If the stack grows down then allocate the stack then the TCB so the stack
 * does not grow into the TCB.  Likewise if the stack grows up then allocate
 * the TCB then the stack. */
#if ( portSTACK_GROWTH > 0 )	// 栈向上生长
{
	pxNewTCB = ( TCB_t * ) pvPortMallocTcbMem( sizeof( TCB_t ) );
    pxNewTCB->pxStack = ( StackType_t * ) pvPortMallocStackMem( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); 
}
#else /* portSTACK_GROWTH */	// 栈向下生长
{
    StackType_t * = pvPortMallocStackMem( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) );
    pxNewTCB = ( TCB_t * ) pvPortMallocTcbMem( sizeof( TCB_t ) ); .
    pxNewTCB->pxStack = pxStack;
}
#endif /* portSTACK_GROWTH */

会有疑问:那么为什么栈的增长方向与tcb和stack空间申请的顺序有关

此处有个约定俗成的知识点:默认内存高地址在上,低地址在下。
portSTACK_GROWTH > 0 即 栈向上生长
portSTACK_GROWTH < 0 即 栈向下生长

下图以栈向下生长为例:
在这里插入图片描述

当栈向下生长时,需在堆上先申请Stack、后申请TCB(谁先申请谁在堆上的地址较小),否则,Stack在生长的过程中可能会覆盖到TCB的区域:
在这里插入图片描述
同理当栈向上生长时需要先申请TCB后申请Stack。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值