FreeRTOS 常见问题——栈应该有多大?

FreeRTOS 常见问题——栈应该有多大?

可以使用 xTaskCreate() 或 xTaskCreateStatic() API 函数创建任务。该函数的 usStackDepth 参数指定将分配给正在创建的任务的栈大小(以栈宽度为单位,而不是字节!)。人们通常会问如何确定 usStackDepth 值,但是,除了下面描述的其中一种方向之外,在使用 RTOS 时确定需要多少栈与编写裸机应用程序(不使用操作系统的应用程序)时没有什么区别。

与编写裸机应用程序完全一样,所需的堆栈量取决于以下应用程序特定参数:

  • 函数调用嵌套深度
  • 函数作用域变量声明的数量和大小
  • 函数参数个数
  • 处理器架构
  • 编译器
  • 编译器优化级别
  • 中断服务程序的栈要求 —— 对于许多 RTOS 端口来说为零,因为 RTOS 将在进入中断服务程序时切换到使用专用中断栈。

每次调度程序临时停止运行任务以运行不同的任务时,处理器上下文都会保存到任务的栈中。保存的处理器上下文会在下次任务运行时从任务栈中弹出。保存处理器上下文所需的栈空间是任务的栈需求中唯一来自于 RTOS 本身的额外需求。

虽然确定一个任务要分配多少栈并不容易,但 RTOS 提供了一些功能,允许任务的栈大小通过实际的试错方法进行调整;可以使用 uxTaskGetStackHighWaterMark() API函数来查看实际使用了多少栈,如果分配的栈比需要的多,则可以减少栈大小,并且可以使用栈溢出检测特性来确定栈是否太小。此外,可以使用 uxTaskGetSystemState() API函数或众多支持 FreeRTOS 的 IDE 插件一次性查看所有 RTOS 任务的栈使用情况。

FreeRTOS 下载包含每个端口的演示应用程序,每个演示应用程序随附的 FreeRTOSConfig.h 文件定义了一个名为 configMINIMAL_STACK_SIZE 的常量 。强烈建议永远不要为任务分配小于端口演示应用程序中使用的 configMINIMAL_STACK_SIZE 设置的栈。

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值