ARM Cortex-M обработчик прерываний в C ++ - PullRequest
2 голосов
/ 29 мая 2019

Можно ли написать обработчик прерываний на C ++ для чипов ARM Cortex, таких как ST и NXP.

В настоящее время я разрабатываю много кода на C ++ для чипов ARM Cortex.Мне немного надоело вызывать статический / глобальный / синглтонный объект C ++ из функции обратного вызова Си.Есть ли способ, чтобы не иметь через функцию C.

Есть ли способ прямого вызова объектных функций C ++ при возникновении прерывания?

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

Можно ли напрямую вызывать объектную функцию C ++ при возникновении прерывания?

Короче говоря, нет.Даже если вы объявите свой нестатический метод как void (void), он все равно имеет неявный аргумент - this.С другой стороны, обработчик прерываний вообще не имеет аргументов.

2 голосов
/ 29 мая 2019

Обработчик прерываний можно написать на любом языке, который компилируется в собственный код.

Он все еще должен использовать связь языка Си с соглашением о вызовах обработчика прерываний. Это означает, что нет функций-членов. (Формально статические функции-члены также недопустимы, хотя обычно они работают на практике. Нестатические функции-члены использовать нельзя.)

В C ++ сначала включите связь языка C с помощью extern "C". Также используйте любое специфичное для компилятора ключевое слово для обработчиков прерываний, которое вы использовали бы в C, например __interrupt.

Внутри функции вы можете использовать всю мощь C ++ - объекты, циклы for-in, умные указатели, экземпляры шаблонов и т. Д. Хотя вы все еще хотите быть осторожными в отношении объема работы, выполняемой в контексте прерываний, и C ++ имеет тенденцию скрывать сложность, поэтому вы больше не чувствуете, сколько машинных инструкций генерируется.


На чипах ARM Cortex M имеется таблица указателей функций по заданному адресу памяти. Таблица может быть построена на C или сборке, и если ваши обработчики прерываний не будут экспортированы с правильным именем, компоновщик не сможет найти адреса, которые принадлежат таблице. Связывание языка C гарантирует, что любое искажение имени выполняется способом, совместимым со ссылками на символы в коде запуска.

Другие семейства процессоров используют фиксированный адрес только для вектора сброса и устанавливают другие обработчики прерываний, записывая каждый адрес обработчика в регистр специальной функции, соответствующий его прерыванию. Для них имеет значение только соглашение о вызовах, а не имя / связь функции. ARM Cortex-M позволяет вам написать специальный регистр функций для поиска всей таблицы векторов по альтернативному адресу, но не для перемещения отдельных обработчиков.

...