Размещение обработчика SVC в векторе SVC в Arm Cortex M0

У меня есть функция, которую я хочу поместить в вектор исключений SVC, но я не могу найти синтаксис, необходимый для помещения адреса функции в этот вектор. Может ли кто-нибудь предложить ресурс, чтобы помочь?


person Michael Stachowsky    schedule 17.01.2017    source источник


Ответы (3)


Хороший учебник написал клапаны для программирования Raspberry Pi на чистом железе. Несмотря на то, что ЦП не тот же, основная концепция исключения та же. Вам обязательно стоит туда заглянуть.

Мой бывший коллега написал HAL для Cortex M4. В нем он устанавливает обработчики прерываний на C, без каких-либо вызовов ассемблера, просто используя местоположение символа. Вам также следует взглянуть на RFLPC.

person Aif    schedule 17.01.2017

Предполагая, что у вас есть символ с именем your_function_name, следующий код будет переходить к нему.

SVC_Handler
    EXTERN your_function_name
    ldr r0,=your_function_name
    bx r0

Как правило, обработчики обычно слабо связаны, поэтому функция void SVC_Handler(void) должна быть связана, а не обработчик, определенный в файле запуска.

person Colin    schedule 17.01.2017
comment
И будет ли это работать с GCC? Нужно ли мне изменять скрипт компоновщика? Извините, я немного новичок в этом. Для справки, я использую реализацию на основе Arduino, поэтому я не слишком усердно изучал материал компоновщика. - person Michael Stachowsky; 17.01.2017

Слишком расплывчато, это очень специфично для вашего кода, и есть несколько способов реализовать векторную таблицу cortex-m и использовать инструменты GNU, поэтому вы не предоставили достаточно информации, и при поиске этой информации для нас должно стать очевидным, где твой стол. Вы можете начать с дизассемблирования эльфийской версии вашего двоичного файла и найти имена меток в области векторной таблицы, а затем выполнить поиск этих имен в кодовой базе. Если вы едете поверх кучи чужих библиотек и т. д., это может быть еще более болезненным, могут быть вызовы функций и т. д. во время выполнения, которые вы используете для регистрации обработчика.

Есть миллион способов решить эту проблему, и все они могут работать, какой из них вы используете?

person old_timer    schedule 17.01.2017