这个函数是一定要放在SRAM区的
这也是关键啊,我就是因为这里不懂,上一篇报告才没有写存储。
因为我使用KEIL并没有经过培训,完全都是自己学的。至于keil的一些配置和很多功能其实都不曾知晓。
当看到这一句的时候懵逼了!什么是放在SRAM运行?程序不都是在RAM跑的吗?
好了,现在我想现学现卖,讲讲我的个人理解。
拿51单片机来说事吧。
我们知道51的RAM从0X00-0XFF,什么8字节工作寄存器四组R0-R7还有SFR,像P0,TMOD这些都是在RAM里面的,他们有固定的位置,所以叫特殊寄存器啊。RAM里还有普通的就用来存放我们定义的数组啊,变量啊一类的。
平时我们说程序是在RAM中跑的,是因为程序从ROM一条一套读出来在RAM中的这些寄存器之间运算处理,也就是说,单片机在跑程序的时候离不开ROM,在NV32都叫FLASH了。
51ROM地址从0000H开始,我们程序就从0000H开始往里面写入。PC指针就在ROM区跳来跳去。
在来看NV32是ARM_M0+内核,flash从0x0000 0000开始,RAM从0x1fff f800开始RAM有8K。
这8K RAM都是相当于51里面的普通RAM,因为NV的特殊寄存器还有它们的位置。
那这8KRAM可不是小空间啊,甚至比大部分51的ROM都要大。
而如果一段程序编译完成后发现RAM只会占用2K,flash只占用3K。那么在KEIL里我么甚至可以设置我们的RAM从0X2000 1000开始。那从0x1fff f800到0X2000 0000中间的6K就浪费了吗?
No No No,我们都知道RAM运行速度快,当我们程序在放在FLASH运行的时候每一条指令都需要去FLASH读取,然后在RAM里面进行计算处理等等。。那如果我们把部分程序加载到空闲的RAM中去运行不就快了很多!
想想我们整个占用FLASH才3K,而我们的RAM还有6K剩余,完全都可以加载到RAM中运行。
这里你或许会说RAM不是断电不保存吗?怎么能把程序放在RAM中呢?
如果这样问,那就是你理解错了,我们并不是把程序存到RAM中,还是放在flash中。单片机上电后,可以把我们指定的一些函数从FLASH中搬到了RAM中,所以刚才我说加载。这样当执行到这些函数的时候PC指针就不用跳到FLASH中读取指令,而是在RAM中读取,一个好处是速度快了,另外一个好处是,当运行这些函数的时候已经完全脱离了flash,这个时候甚至可以修改FLASH了。
好了,NV32能擦写FLASH 的原因,或许到这里就清楚了,为什么这个函数要放在RAM中运行,或许读者也能明白了。
至少我自己说服了我自己。
那下面就讲一下如何把指定的函数放到RAM中运行吧。
首先看一下自己的RAM配置
从图中我们看到,我的目前主程序运行在0X2000 0000-0x2000 1800这6K的空间中,上面还有我们剩余的0x1fff f800-0x2000 0000这2K空间我配置成IRAM1。
接下来,在DRIVER里找到flash.c这个官方库。
在flash.c上右键
选择配置flash.c
把整个FLASH.C里面的函数到时候都加载到RAM中运行,自然flash.c中的那个EFM_LaunchCMD函数也被加载进去啦。这回符合要求了吧。
好了,我就讲这么多,希望对你有所帮助。也或许你已经知道了,如果我理解的不对,还请指正。
这里放上一个简单的EEPROM读取写入的代码,下一篇再写详细的EEPROM应用和FLASH的读写。
如果有任何错误请,自行对比,或者留言讨论。
谢谢关注,我会继续更新的。