【FreeRTOS】栈生长方向 portSTACK_GROWTH

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。

### 将 FreeRTOS 移植到 Cortex-M4 内核的方法 #### 准备工作 在准备移植 FreeRTOS 至 Cortex-M4 内核之前,需确保拥有必要的开发环境和工具链。通常情况下,Cortex-M4 设备会配备特定的 IDE 或编译器,如 Keil MDK、IAR Embedded Workbench 或 GCC 工具链。 #### 获取并理解 FreeRTOS 源码结构 FreeRTOS 文件夹下的 `Source` 文件夹里包含的是 FreeRTOS 内核的源代码[^1]。对于移植而言,这部分源代码至关重要。此外,`Demo` 文件夹中的官方示例项目提供了丰富的参考案例,特别是针对不同硬件平台优化过的启动脚本和其他辅助函数。 #### 复制必要文件 为了简化移植过程,建议从现有的 Demo 中复制相关配置文件。具体来说,`FreeRTOSConfig.h` 是非常重要的工程配置文件,它允许用户根据目标系统的特性调整操作系统的行为[^3]。此文件应被放置于项目的适当位置,并依据实际需求进行定制化设置。 #### 配置内存管理方案 考虑到资源的有效利用,可以选择合适的内存分配策略。例如,在 MemMang 文件夹中仅保留 heap_4.c 即可满足大多数应用场景的需求[^2]。Heap 4 提供了一种灵活且高效的动态内存管理模式,适用于多种嵌入式系统设计。 #### 创建启动文件与中断向量表 创建适合 Cortex-M4 架构的启动汇编文件(startup.s),定义初始化堆指针、重定位数据段以及跳转至主程序入口点等功能。同时构建中断向量表,用于映射各类异常处理和服务调用。 #### 编写端口层接口实现 编写符合 ARM CMSIS 标准的 port 层代码,主要包括上下文切换机制、临界区保护方法等核心功能模块。这一步骤涉及到对底层寄存器的操作及调度算法的设计,务必严格按照文档指导完成。 ```c // 示例:portmacro.h 中的部分宏定义 #define portSTACK_GROWTH ( -1 ) #define configMAX_SYSCALL_INTERRUPT_PRIORITY 5 ``` #### 测试验证 最后通过一系列单元测试来检验整个移植工作的正确性和稳定性。可以借助 JTAG 调试器连接目标板卡运行调试版本的应用程序,观察任务间的交互情况及其响应时间是否正常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值