我使用的是MBD9F126(ARM Cortex R4)微控制器。因为我将代码闪存到ROM中,然后在RAM复制后执行RAM中的代码。我使用的是Green hills编译器。在RAM复制之前,我正在执行基本的线路板初始化代码。
LDR r12, ADDRESS_START_PREINIT
BLX r12
ADDRESS_START_PREINIT:DCD Start_PreInitStart_PreInit是板卡初始化函数。如果我在BLX之后像这样给出,它会转移到RAM位置。由于RAM复制尚未完成,因此它将转到未知区域。
而不是这个,如果我在写
bl Start_PreInit它的工作正常,这是去ROM位置的代码。我不明白为什么编译器会有这样的行为?
还有ADDRESS_START_PREINIT:DCD Start_PreInit。是在链接过程中完成的吗?
发布于 2012-09-05 14:47:10
bl Start_PreInit指令之所以有效,是因为分支目标在指令操作码中被编码为相对于当前PC (r15)的偏移量。由于r15指向只读存储器,因此目标是另一个只读存储器地址。
blx r12指令分支到加载到r12寄存器中的绝对地址。
当您将ADDRESS_START_PREINIT的内容加载到寄存器中时,您得到的是链接器为Start_PreInit地址计算的绝对地址。显然,链接器已将其固定为RAM的绝对地址。
您也许能够通过链接器配置来修复这个问题,或者在分支之前使用内存地址(类似于(r12 - RAM_START) + ROM_START)加载r12时对其执行一些转换。或者,如果目标地址在范围内,则对分支指令使用pc相对编码而不是寄存器绝对编码。
https://stackoverflow.com/questions/12275354
复制相似问题