ARM Cortex-M7 длинная ветвь получает ошибку "перемещение усечено до соответствия: R_ARM_PREL31" во время компиляции - PullRequest
0 голосов
/ 04 октября 2018

Я разрабатываю встраиваемую систему с чипом 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.Но я не знаю почему?

...