μC/OS-III的应用中CSTACK重用

浏览:1975来源:本站时间:2019-05-10

当使用μC/OS-III开发应用时,C启动堆栈可能会丢失,导致嵌入式应用中可用的RAM量减少。本笔记展示了如何恢复这段RAM空间,作为任务堆栈使用。


在Cortex-M架构的处理器上,向量表中包含堆栈指针的初始值,该值自动分配给CPU的主堆栈指针(MSP)。对于IAR工具链(EWARM),初始堆栈的存储空间由链接器命令文件设置,堆栈空间称为CSTACK。启动完成后,MSP通常保持不变, CSTACK用于中断服务程序(ISR)。


在EWARM中,CSTACK的大小(以字节为单位)和存储空间在链接器命令脚本中定义,如下所示(参见MCU工程中对应的*.icf文件):
define symbol__ICFEDIT_size_cstack__= 0x400;
define block  CSTACK  with alignment = 8, size = __ICFEDIT_size_cstack__ { };


默认CSTACK为1KB,对于典型启动代码来说是足够的。但是,如果您的启动代码需要更多(或更少)的堆栈空间,可以简单地更改其值以满足应用需要。


Cortex-M架构还包含一个进程堆栈指针(PSP),用于任务级代码。

μC/OS-III供了设置独立的ISR堆栈的能力,允许应用代码控制ISR堆栈大小;允许RTOS计算堆栈使用率,并可以在运行时显示ISR堆栈使用情况。在μC/OS-III中,ISR堆栈称为OSCfg_ISRStk[],通常设置为小于512字节。为ISR分配单独堆栈的副作用是CSTACK未使用,因此丢失。


如下面的代码片段所示(基于IAR EWARM),很容易恢复用于CSTACK的存储区域,并且将其分配给应用任务。但是,CSTACK只能用于在多任务处理启动后创建的用户任务。




京ICP备:京ICP备05011254号-1 版权归北京麦克泰软件技术有限公司所有
北京麦克泰软件技术有限公司