当使用µ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[],通常 当使用µC/OS-III开发应用时,C启动堆栈可能会丢失,导致嵌入式应用中可用的RAM量减少。 本篇展示了如何恢复这段RAM空间,作为任务堆栈使用。
如下面的代码片段所示(基于IAR EWARM),很容易恢复用于CSTACK的存储区域,并且将其分配给应用任务。但是,CSTACK只能用于在多任务处理启动后创建的用户任务。 |