起因:STM32F407将任务栈切换到CCRAM,调试时发现一大片的任务显示红色
看图片发现,个别不使用CCRAM的任务是正常的,只要用了CCRAM就是红的。
检查栈是否溢出:
发现根本没有出现溢出,标志(0xE25A2EA5U)和填充(0xCCCCCCCCU)都是正常的,就奇了怪了。
查看RTX5.scvd文件
溢出显示代码:
溢出检测代码:
__CalcMemUsed函数:
看完都没发现不对的,只是这个函数__CalcMemUsed怎么处理溢出的无法知晓。
然后想到,是不是因为内存地址的问题,查看我的代码,是通过指针的方式引用的CCRAM:
[C] 纯文本查看 复制代码 // <o>Stack address (CC RAM) <0x0-0xF0000000:0x400>
// <i> 用于任务堆栈
#define F4_CCRAM_ADDR 0x10000000
// <o>Stack size (CC RAM) [Kbytes] <0-64> <#*1024>
// <i> 用于任务堆栈
#define F4_CCRAM_SIZE 65536
// </h>
uint8_t *g_AppStackBuff = (uint8_t *)F4_CCRAM_ADDR;
而且设置中并没有勾选IRAM2
那现在尝试一下开启IRAM2看看
代码调整一下:
[C] 纯文本查看 复制代码 uint8_t g_AppStackBuff[F4_CCRAM_SIZE] __attribute__((section(".ARM.__at_0x10000000")));
果然有效果了
总结:
问题原因是使用了CCRAM但未在MDK的设置中启用,从而导致MDK的调试组件因为内存地址异常而报栈溢出
因为调试组件使用了__CalcMemUsed函数检查任务栈,该函数会返回栈溢出状态,函数内部参考了工程设置中RAM的设置,使用了不在设置中合法范围内的地址就会报溢出
|