Я разрабатываю встраиваемую систему с чипом NXP I.MXRT Series Cortex-M7.Мне нужно переместить некоторую функцию C в RAM (ITCM), а не во 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 -ограниченный доступ -функция-разделы -fdata-секции -ffreestanding
Флаги компоновщика
"arm-none-eabi-gcc -mcpu = cortex-m7 -mthumb $ {FP_FLAGS} -std = c ++ 11 -O3 -настроенный доступ -функция-разделы -fdata-секции -ffreestanding -T $ {MEM_LD_FILE} -T$ {LIBS_LD_FILE} -T $ {SECTIONS_LD_FILE} -nostartfiles -Xlinker -gc-section -u _printf_float -Wl, -Map = $ {TARGET_MAP} --specs = nano.specs "
Кажетсяошибка возникает, когда адрес филиала превышает 0x40000000.Итак, как решить эту проблему?
/ * Второе издание * /
Я решил проблему, добавив флаг компилятора -fno-exception.Но я не знаю почему?