Я работаю над книгой Архитектура встроенных систем Даниэля Лакамеры. В главе 4, Процедура загрузки, мы создаем таблицу векторов прерываний (для ARM Cortex M4) следующим образом:
__attribute__ ((section(".isr_vector"))) void (* const ivt[])(void) =
{
(void (*)(void))END_STACK,
isr_reset,
// Other ISRs
};
Не было показано, как END_STACK
было extern
ed, поэтому я сделал это так:
extern uint32_t END_STACK;
Сценарий компоновщика похож на следующий:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 48K
}
END_STACK = ORIGIN(RAM) + LENGTH(RAM)
Я получаю следующую ошибку:
arm-none-eabi-gcc -c main.c interrupt_vector.c -O0 -g -mthumb -mcpu=cortex-m4 -ffreestanding
interrupt_vector.c:14:5: error: initializer element is not constant
(void (*)(void))END_STACK,
^
Каков правильный способ справиться с этим? Можно ли привести это к адресу функции или мне следует создать новый раздел исключительно для указателя стека?
Я пробовал разбрызгивать const
в extern
и заливать, но не могу устранить ошибку.
&END_STACK
, компоновщик общается через адреса, сами символы не имеют значений - person Eugene Sh.   schedule 15.05.2020