У меня есть функция, которую я хочу поместить в вектор исключений SVC, но я не могу найти синтаксис, необходимый для помещения адреса функции в этот вектор. Может ли кто-нибудь предложить ресурс, чтобы помочь?
Размещение обработчика SVC в векторе SVC в Arm Cortex M0
Ответы (3)
Хороший учебник написал клапаны для программирования Raspberry Pi на чистом железе. Несмотря на то, что ЦП не тот же, основная концепция исключения та же. Вам обязательно стоит туда заглянуть.
Мой бывший коллега написал HAL для Cortex M4. В нем он устанавливает обработчики прерываний на C, без каких-либо вызовов ассемблера, просто используя местоположение символа. Вам также следует взглянуть на RFLPC.
Предполагая, что у вас есть символ с именем your_function_name
, следующий код будет переходить к нему.
SVC_Handler
EXTERN your_function_name
ldr r0,=your_function_name
bx r0
Как правило, обработчики обычно слабо связаны, поэтому функция void SVC_Handler(void)
должна быть связана, а не обработчик, определенный в файле запуска.
Слишком расплывчато, это очень специфично для вашего кода, и есть несколько способов реализовать векторную таблицу cortex-m и использовать инструменты GNU, поэтому вы не предоставили достаточно информации, и при поиске этой информации для нас должно стать очевидным, где твой стол. Вы можете начать с дизассемблирования эльфийской версии вашего двоичного файла и найти имена меток в области векторной таблицы, а затем выполнить поиск этих имен в кодовой базе. Если вы едете поверх кучи чужих библиотек и т. д., это может быть еще более болезненным, могут быть вызовы функций и т. д. во время выполнения, которые вы используете для регистрации обработчика.
Есть миллион способов решить эту проблему, и все они могут работать, какой из них вы используете?