6.33.6 Атрибуты функций AVR
Эти атрибуты функций поддерживаются бэкендом AVR:
interrupt-
Используйте этот атрибут, чтобы указать, что указанная функция является обработчиком прерывания. Компилятор генерирует последовательности входа и выхода из функции, подходящие для использования в обработчике прерываний, когда этот атрибут присутствует.
В AVR аппаратное обеспечение глобально отключает прерывания при выполнении прерывания. Первая инструкция обработчика прерывания, объявленного с этим атрибутом, является инструкцией
SEIдля повторного включения прерываний. Также см. атрибут функцииsignal, который не вставляет инструкциюSEI. Если оба атрибутаsignalиinterruptуказаны для одной функции,signalбудет проигнорирован без предупреждения. naked-
Этот атрибут позволяет компилятору создать требуемое объявление функции, позволяя при этом телу функции быть кодом на ассемблере. Указанная функция не будет иметь пролога/эпилога, сгенерированных компилятором. В функциях `naked` безопасно включать только базовые
asmоператоры (см. Базовый ассемблер). Использование расширенныхasmили смеси базовыхasmи C-кода, возможно, будет работать, но их надежная работа не гарантируется, и они не поддерживаются. no_gccisr-
Не используйте
__gcc_isrпсевдоинструкции в функции с атрибутомinterruptилиsignal, т.е. обработчиком прерывания (ISR). Используйте этот атрибут, если преамбула пролога ISR должна всегда бытьpush __zero_reg__ push __tmp_reg__ in __tmp_reg__, __SREG__ push __tmp_reg__ clr __zero_reg__
и аналогично для постэмбулы эпилога — независимо от того, действительно ли упомянутые регистры используются в ISR или нет. Ситуации, когда вам может потребоваться использовать этот атрибут, включают:
- Код, который (фактически) изменяет биты
SREGпомимо флагаIпутем записи в ячейку памятиSREG. - Код, который использует встроенный ассемблер для перехода к другой функции, которая ожидает (часть) кода пролога, как описано выше.
Для отключения генерации
__gcc_isrдля всего блока компиляции есть опция -mno-gas-isr-prologues, см. Опции AVR. - Код, который (фактически) изменяет биты
OS_mainOS_task-
На AVR функции с атрибутами
OS_mainилиOS_taskне сохраняют/восстанавливают никакие сохраненные при вызове регистры в своём прологе/эпилоге.Атрибут
OS_mainможет быть использован, когда гарантировано, что прерывания отключены в момент входа в функцию. Это экономит ресурсы, когда указатель стека должен быть изменён для подготовки кадра для локальных переменных.Атрибут
OS_taskможет быть использован, когда нет гарантии, что прерывания отключены в момент входа в функцию, как, например, для функций задач в многопоточной операционной системе. В этом случае изменение регистра указателя стека защищено сохранением/обнулением/восстановлением флага глобального разрешения прерываний.Различия с атрибутом функции
naked:- Функции
nakedне имеют инструкции возврата, в то время как функцииOS_mainиOS_taskимеют инструкцию возвратаRETилиRETI. - Функции
nakedне создают кадра для локальных переменных или указателя кадра, в то время как функцииOS_mainиOS_taskделают это по мере необходимости.
- Функции
signal-
Используйте этот атрибут для AVR, чтобы указать, что указанная функция является обработчиком прерывания. Компилятор генерирует последовательности входа и выхода из функции, подходящие для использования в обработчике прерываний, если этот атрибут присутствует.
См. также атрибут функции
interrupt.Аппаратное обеспечение AVR глобально отключает прерывания при выполнении прерывания. Функции обработчиков прерываний, определённые с атрибутом
signal, не включают прерывания повторно. Безопасно включать прерывания в обработчикеsignal.Это "безопасное" утверждение относится только к коду, сгенерированному компилятором, а не к структуре прерывания приложения, что является ответственностью приложения.
Если оба атрибута
signalиinterruptуказаны для одной функции,signalбудет проигнорирован без предупреждения.
Далее: Атрибуты функций Blackfin, Предыдущее: Атрибуты функций ARM, Наверх: Атрибуты функций [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/AVR-Function-Attributes.html