我有一个带有特殊类型闪存的 Cortex M3 部件。零件在这个 FLASH 上启动,但我需要运行一个函数来优化 FLASH 的速度。做到这一点的唯一方法是跳转到 RAM 并在那里执行这些功能(因为如果在它正在优化的 FLASH 上运行该功能将会崩溃)。
ARM 允许分散加载。这是一个解决方案,因为我可以将函数放入 RAM 并在我进入 main 时运行它们。但我不想在未优化的 FLASH 的情况下执行所有分散加载。所以我想在 main 之前运行该函数,这意味着从重置处理程序或 SystemInit(从重置处理程序调用)。
我已经编写了一些位于 ROM 中的汇编函数。在启动时,我调用我编写的 Relocate 函数,然后将其他函数复制到 RAM,然后我跳转到它们。这是有效的。
我的问题是:
- 这听起来很疯狂吗?有没有更简单的方法来完成这个(不等待分散加载)?
在 .s 文件中,我有要重新定位的函数。为了使用这些重新定位的函数,我加载了 PROC 标签,然后减去(FLASH - RAM)的偏移量。这感觉不便携。是否有另一种方法来计算重定位函数的正确 PROC 地址?例如:
foo PROC ... ... ENDP
foo 从 ROM 的 0x24000000 开始,我需要将它移动到 0x8000 的 RAM。有没有办法声明 foo 位于 0x8000,即使它必须存储在 ROM 中?或者有没有办法声明 foo_reloc 生活在 0x8000?这也适用于 THUMB 代码,因为 foo 可能从 0x24000001 开始,需要在 0x8001 处调用。
谢谢, 纳楚姆