У меня проблемы с пониманием моего компилятора. Мы используем утилиту Scons для компиляции кода ARM для процессора M0+ (в Windows, если это имеет значение. Это компиляция ARMCC). Я пытаюсь захватить адрес указателя стека во время прерывания, используя ответ на этот вопрос.
Для моего компилятора я получаю следующее: Error: #20: identifier "asm" is undefined
Единственный способ, которым я смог заставить его (в основном) компилироваться, заключался в следующем:
void IRQHandler_real( uint32_t *sp )
{
// Do some work
}
__asm void IRQHandler( void )
{
MOV R0,SP
ADDS R0, #1
LDR R1, =IRQHandler_real //<<-- This line fails
BX R1
}
Код ошибки
Error: A1516E: Bad symbol 'IRQHandler_real', not defined or external
Замена двух последних сборочных линий на BL IRQHandler_real
приводит к той же ошибке.
Этот ответ объясняет, что встроенная сборка сильно зависит от компилятора, поэтому мне не удалось найти пример, соответствующий моему коду. .
Я прочитал здесь, что мне нужен вызов "extern C", но Подробностей о том, как это выглядит, я пока не нашел.
Я дважды проверил свой синтаксис скомпилированного кода процессора, и он выглядит идентично командам, которые я использую. Я думаю, что символ не определен во время оценки сборки. Я просто не понял, как определить и связать символы.
TL:DR, мне нужно вызвать функцию C из сборки ARM, но я не прошел компилятор.
IRQHandler_real
:_IRQHandler_real
- person Thomas Jager   schedule 26.06.2018=
при использовании в этом контексте, попробовавldr r0,=123456789
. Если вы можете использовать векторную таблицу в ОЗУ, другой возможностью, которая позволит избежать необходимости в коде, зависящем от компилятора, будет определение структурыstruct { uint64_t code; void (*func)(uint32_t *sp);} intBoing
, сохранение 0xBF00470849014668 вcode
, а адрес функции вfunc
. Затем сохраните адресintBoing
плюс 1 в нужный вектор прерывания. Если я правильно понял, кстати, код такой: - person supercat   schedule 26.06.2018