当使用μC/OS-III开发应用时,C启动堆栈可能会丢失,导致嵌入式应用中可用的RAM量减少。本笔记展示了如何恢复这段RAM空间,作为任务堆栈使用。
在Cortex-M架构的处理器上,向量表中包含堆栈指针的初始值,该值自动分配给CPU的主堆栈指针(MSP)。对于IAR工具链(EWARM),初始堆栈的存储空间由链接器命令文件设置,堆栈空间称为CSTACK。启动完成后,MSP通常保持不变, CSTACK用于中断服务程序(ISR)。
默认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只能用于在多任务处理启动后创建的用户任务。