近期在实现cortex-R内核上的BootLoader,涉及到片上FLASH的erase,write。
FLASH都有个特性就是非RWW(ready while write),即不能在进行擦写操作时,同时进行read,即其内存储的代码也不能执行。
所以要把部分flash操作转移到RAM中,这样在操作flash时,程序运行在RAM中,不会冲突。
具体讲程序放在RAM中运行的方式,可以参考大佬痞子衡的两篇文章,以及编译器相关说明:
《在IAR开发环境下将整个源文件代码重定向到任意RAM中的方法》
另外有一个细节问题:
把什么代码放在RAM中运行能够顺利操作flash?
答:放入RAM中的code至少是能够单独执行完一次完整操作,并等待FLASH恢复到ready状态后,才能返回的完整function。 即:在一次erase或者write全部完成之前,是不能返回到flash中去执行其中的code。
记录:调试过程中遇到一个问题:把临时代码整理后,把一个APP_VALID_FLAG数组传参进写FLASH的函数(次函数已被重定位到RAM)后,MCU 出现prefetch异常,什么问题?
解:APP_VALID_FLAG数组是一个16B的固定数组,习惯性使用了const作为前缀,而const数组会被编译器存放在flash数据区,即当flash_write尝试访问此数组时,即需要在write的同时在内部总线上读取此数据,而此时FLASH控制器正被占用,无法读取,造成prefetch异常。解决办法是:把const去掉即可。