我正在使用NXP的I.MXRT系列Cortex-M7芯片开发嵌入式系统。我需要在RAM(ITCM)中重定位某些C函数,而不是在Flash中重定位。 ITCM的地址从0x00000000开始,Flash的地址从0x60000000开始。因此,定位在Flash上的函数调用在ITCM上的函数将执行一个长分支。但这会导致编译错误
(。ARM.exidx.itcm.text + 0x0):重新定位以适合以下位置:R_ARM_PREL31针对`.itcm.text'
这是我的代码
__attribute__ ((long_call,section(".itcm.text"),noinline))
int foo(int k)
{
return k + 1;
}
我的链接脚本
MEMORY
{
/*
* SPI Flash
*
*
*/
ITCM(xrw) : ORIGIN = 0x00000000, LENGTH = 128K
DTCM (xrw) : ORIGIN = 0x20000000, LENGTH = 256K
RAM (xrw) : ORIGIN = 0x20200000, LENGTH = 256K
FLASH (rx) : ORIGIN = 0x60000000, LENGTH = 4096K
}
/*************omit***************/
_siitcm = LOADADDR(.itcm.text);
.itcm.text : ALIGN(4)
{
__itcm_start__ = .;
*(.itcm.text .itcm.text.*)
. = ALIGN(4);
__itcm_end__ = .;
} >ITCM AT>FLASH
编译器标志为
arm-none-eabi-gcc -mcpu = cortex-m7 -mthumb $ {FP_FLAGS} -std = c ++ 11 -O3 -munaligned-access -ffunction-sections -fdata-sections -ffreestanding
链接器标志为
“ arm-none-eabi-gcc -mcpu = cortex-m7 -mthumb $ {FP_FLAGS} -std = c ++ 11 -O3 -munaligned-access -ffunction-sections -fdata-sections -ffreestanding -T $ { MEM_LD_FILE} -T $ {LIBS_LD_FILE} -T $ {SECTIONS_LD_FILE} -nostartfiles -Xlinker -gc-sections -u _printf_float -Wl,-Map = $ {TARGET_MAP} --specs = nano.specs“
当分支地址大于0x40000000时,似乎会发生错误。那么,如何解决此问题?
/ *第二版* /
我已经通过添加编译器标志-fno-exceptions解决了该问题。但是我不知道为什么?