硬汉嵌入式论坛

 找回密码
 立即注册
查看: 919|回复: 3
收起左侧

[RL-RTX] 记录一次RTX调试组件显示栈异常的解决过程

[复制链接]

6

主题

72

回帖

90

积分

初级会员

积分
90
发表于 2025-1-19 19:06:03 | 显示全部楼层 |阅读模式
起因:STM32F407将任务栈切换到CCRAM,调试时发现一大片的任务显示红色
问题现象.png

看图片发现,个别不使用CCRAM的任务是正常的,只要用了CCRAM就是红的。
检查栈是否溢出:
任务信息.png
查看栈内存.png

发现根本没有出现溢出,标志(0xE25A2EA5U)和填充(0xCCCCCCCCU)都是正常的,就奇了怪了。

查看RTX5.scvd文件
溢出显示代码:
SCVD栈溢出显示代码.png

溢出检测代码:
SCVD栈溢出测试代码.png

__CalcMemUsed函数:
calc函数.png

看完都没发现不对的,只是这个函数__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.png

那现在尝试一下开启IRAM2看看
勾选IRAM2.png

代码调整一下:
[C] 纯文本查看 复制代码
uint8_t g_AppStackBuff[F4_CCRAM_SIZE] __attribute__((section(".ARM.__at_0x10000000")));


果然有效果了
恢复正常了.png


总结:
问题原因是使用了CCRAM但未在MDK的设置中启用,从而导致MDK的调试组件因为内存地址异常而报栈溢出
因为调试组件使用了__CalcMemUsed函数检查任务栈,该函数会返回栈溢出状态,函数内部参考了工程设置中RAM的设置,使用了不在设置中合法范围内的地址就会报溢出


评分

参与人数 1金币 +50 收起 理由
eric2013 + 50 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2025-1-20 06:34:42 | 显示全部楼层
谢谢楼主分享,很详细的解决过程。
回复

使用道具 举报

0

主题

36

回帖

36

积分

新手上路

积分
36
发表于 2025-1-20 09:32:26 | 显示全部楼层
请问楼主第一张图是什么调试工具的界面,是keil吗,freertos也可以用吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2025-1-21 08:33:27 | 显示全部楼层
bricle 发表于 2025-1-20 09:32
请问楼主第一张图是什么调试工具的界面,是keil吗,freertos也可以用吗?

这个是MDK的RTX5调试组件。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 20:31 , Processed in 0.274537 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表