Обработчик прерываний можно написать на любом языке, который компилируется в собственный код.
Он все еще должен использовать связь языка Си с соглашением о вызовах обработчика прерываний. Это означает, что нет функций-членов. (Формально статические функции-члены также недопустимы, хотя обычно они работают на практике. Нестатические функции-члены использовать нельзя.)
В C ++ сначала включите связь языка C с помощью extern "C"
. Также используйте любое специфичное для компилятора ключевое слово для обработчиков прерываний, которое вы использовали бы в C, например __interrupt
.
Внутри функции вы можете использовать всю мощь C ++ - объекты, циклы for-in, умные указатели, экземпляры шаблонов и т. Д. Хотя вы все еще хотите быть осторожными в отношении объема работы, выполняемой в контексте прерываний, и C ++ имеет тенденцию скрывать сложность, поэтому вы больше не чувствуете, сколько машинных инструкций генерируется.
На чипах ARM Cortex M имеется таблица указателей функций по заданному адресу памяти. Таблица может быть построена на C или сборке, и если ваши обработчики прерываний не будут экспортированы с правильным именем, компоновщик не сможет найти адреса, которые принадлежат таблице. Связывание языка C гарантирует, что любое искажение имени выполняется способом, совместимым со ссылками на символы в коде запуска.
Другие семейства процессоров используют фиксированный адрес только для вектора сброса и устанавливают другие обработчики прерываний, записывая каждый адрес обработчика в регистр специальной функции, соответствующий его прерыванию. Для них имеет значение только соглашение о вызовах, а не имя / связь функции. ARM Cortex-M позволяет вам написать специальный регистр функций для поиска всей таблицы векторов по альтернативному адресу, но не для перемещения отдельных обработчиков.