CH573使用MRS编译,.S堆栈空间定义在哪里?临时变量使用老是不正常。全局变量又没问题。

CH573使用MRS编译,.S堆栈空间定义在哪里?临时变量使用老是不正常。全局变量又没问题。

变量使用内存是自低地址向高地址分配,堆栈是从高地址向低地址,默认都是全部RAM可用。
看下RAM编译是多少,如果超过95%,就很危险了。


如果RAM用的不多,那就要打印看看到底是在什么位置导致变量被改变的。


如果根据这个文章里的内容: RISC-V MCU堆栈机制

修改Link.ld文件去主动设置stack的大小, 是否有助于解决这种问题呢?

我这边开发好像也遇到了stack溢出后, 可能覆盖了highcode区域的问题.


意思是这个堆栈是默认的,反正一直从高地址往下压。


我用ch582也发现有这个问题,由于堆栈使用剩余内存,一个向下增长,一个向上增长,控制不好就容易堆栈溢出,最要命的是还不报异常,有时RAM编译后使用80%时,就莫名出现跑飞或死机,降到70%时就能通过,自己的程序中也控制malloc的使用,但库里的使用情况就不知道了,有什么方法能查看堆栈使用情况,堆栈溢出时有报异常的机制吗


RISC-V MCU 堆栈机制 - Wahahahehehe - 博客园 (cnblogs.com)
这个是通过修改ld文件给堆栈预留空间;

但是这个实际是解决不了各位代码的问题的,假设当前RAM使用已经很紧张了,给堆栈划分空间,也就是是缩小用户区RAM,这样好处是超出预期内存可以直观看到报错信息,解决不了RAM过多消耗的问题;

其实这个问题要分程度来看,比如如果差的不多,比如几百字节RAM,还能紧凑紧凑代码和全局变量,省出来一部分RAM,如果差的比较多,比如超了2K左右,甚至更多RAM,那说明这个芯片就不适合当前应用,应该选RAM打一个档次的芯片;

关于堆栈,其实解决办法也是有的,就是函数嵌套深度适当缩减,比如通过2到3层代码能解决的,就不要用4-5层甚至更深层数去调用,这样也能省以一些堆栈;


有的代码异常可能是因为变量未初始化,或者某个变量在中断和外部都有对它进行写操作,这种情况也会导致变量异常;


只有登录才能回复,可以选择微信账号登录