nac*_*hum 3 assembly arm cortex-m3
我有一个带有特殊类型FLASH存储器的Cortex M3部件.该部分在此FLASH上启动,但我需要运行一个函数来优化FLASH的速度.执行此操作的唯一方法是跳转到RAM并在那里执行这些功能(因为如果在正在优化的FLASH上运行,函数将崩溃).
ARM允许分散加载.这是一个解决方案,因为我可以将函数放入RAM并在我到达main后运行它们.但是我不想在没有优化的FLASH的情况下执行所有的分散加载.所以我想在main之前运行该函数,这意味着从重置处理程序,或从SystemInit(从重置处理程序调用).
我写了一些位于ROM中的汇编函数.在启动时,我调用我写的Relocate函数,然后将其他函数复制到RAM,然后我跳转到它们.这很有效.
我的问题是:
在.s文件中,我有我将重新定位的函数.要使用这些重定位函数,我加载PROC标签,然后减去(FLASH - RAM)的偏移量.这感觉不便携.是否有另一种方法来计算重定位函数的正确PROC地址?例如:
foo PROC
...
...
ENDP
Run Code Online (Sandbox Code Playgroud)foo从0x24000000的ROM开始,我需要将其移动到0x8000的RAM.有没有办法声明foo存在于0x8000,即使它必须存储在ROM中?或者有没有办法声明foo_reloc生活在0x8000?这也适用于THUMB代码,因为foo可能从0x24000001开始,需要在0x8001处调用.
谢谢,Nachum
将Flash配置功能放入分散文件中的单独执行区域.然后,您唯一需要做的就是修改分散加载代码,首先为Flash配置函数设置执行区域,然后调用它,然后继续其他区域的分散加载.
使用这样的分散文件:
LR 0x0
{
ROM 0x0
{
* (+RO)
* (+RW,+ZI)
}
RAM 0x18000 0x8000
{
foo.o (*)
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您应该获得一个以下列内容开头的图像:
$a
!!!main
__main
0x00000000: eb000000 .... BL __scatterload ; 0x8
0x00000004: eb000028 (... BL __rt_entry ; 0xac
Run Code Online (Sandbox Code Playgroud)
您可以使用"神奇"链接器符号(例如"Image $$ RAM $$ Base")编写自己的分散加载器,以手动执行RO,RW和ZI的加载(只需在链接器命令行上设置您自己的"条目"符号)绕过默认的分散加载器),然后调用__rt_entry.
由于Keil工具实际上是ARM工具,因此您可以在此处查看更多信息.
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0101a/armlink_chdcgbjd.htm