在实际项目开发中,有时候我们需要将一部分程序从 FLASH 拷贝到 RAM 中运行,以提高程序运行的速度。本文基于 IAR Embedded Workbench 列出了一些方法,可以在系统启动时自动从 FLASH 中将这部分程序拷贝到 RAM 中运行。本文使用的软件为IAR EWARM 8.40,硬件为STM32F401 NUCLEO。 利用关键字__ramfunc IAR 中提供了“__ramfunc”关键字来声明将某个函数放在 RAM 中运行。函数使用该关键字声明后,编译器会将函数的代码放在一个具有读/写属性的区域(RAM),并在只读区域(ROM)创建该代码的初始式,系统启动时自动将需要初始化的函数代码从ROM 拷贝到 RAM。使用 __ramfunc 关键字的缺点就是不能指定函数在RAM中的具体位置。 编译后的 map 文件中,可以看到函数 GennerateRandomNumber()的地址在 RAM 范围: 在定义为 __ramfunc 的函数中调用非 __ramfunc 函数,会出现下面的警告: “Warning[Ta022]: Possible rom access (array) from within a ramfunc function ” 而且在 __ramfunc 的函数中调用不是 __ramfunc 的函数会降低执行速度。
关于如何生成map文件,可参考此篇技术文 https://mp.weixin.qq.com/s?__biz=MzA4ODE3MjMzMA==&mid=2652300676&idx=1&sn=b5132e3c6555edf6ae40fe1f8f2b7f7d&chksm=8bcc77c1bcbbfed70fe374f1c53ac6685c3abe051ab111e06cfff82cb885e771f281f12af5fd&token=1552170208&lang=zh_CN#rd
|