如何在Keil中使RAM在带电复位时保持数据?

最近关注的人比较多,非常感谢大家的认可,如何写点对大家有点借鉴作用的文章,也是我一直思考的问题。如果大家有什么想法,请留言或私信,谢谢。

在《被Keil坑了一天!实在太意外了!用Keil的来瞅瞅看》中,提到了在使用Keil设置栈空间时可能存在RAM空间被浪费的可能。那么在设置好heap和stack空间大小后,如何判断有没有多余的内存?

1.项目空间设置

STM32F303xC配置信息

首先要保证我们在Startup.S文件里设置的Stack和heap能够满足软件运行需求。在这种情况下,打开Keil的配置工具,可以看到IRAM1即主要RAM的大小为0xA0配置00。我们把这个数值减小到一个你认为合适的数据,比如0x9000。在这种情况下,重新编译项目、运行项目,看是否正常,如果能正常运行,然后再进一步测试。

2.剩余空间测试

为了进一步测试安全性,我们要定义一个变量,设置其地址在0x9000,即

int var __attribute__((at(0x20009000)));
//在程序中,给此变量赋值
var = 123;

并在程序中使用该变量,如果系统仍然能正常运行的话,那说明我们设置的RAM大小0x9000是合理的,也可以进一步减小此值,重新做测试。如果项目不能运行,则要增加RAM的大小,直到能正常运行。

3.如何使用多余RAM

对于多余的RAM空间,RAM带电复位是不会初始化的,即使我们在配置工具设置了要初始化IRAM1,如图。

利用这个特性,我们可以把多余的RAM当作临时存储器,保存系统数据或运行状态信息,只要MCU不掉电,这部分的RAM数据会一直保持。

举报
评论 0