6.31.5 Атрибуты функций AVR
Эти атрибуты функций поддерживаются бэкендом AVR:
interrupt-
Используйте этот атрибут, чтобы указать, что указанная функция является обработчиком прерывания. Компилятор генерирует последовательности входа и выхода функции, подходящие для использования в обработчике прерываний, когда этот атрибут присутствует.
В AVR аппаратное обеспечение глобально отключает прерывания во время выполнения прерывания. Первая инструкция обработчика прерывания, объявленного с этим атрибутом, это инструкция
SEIдля повторного включения прерываний. См. также атрибут функцииsignal, который не вставляет инструкциюSEI. Если оба атрибутаsignalиinterruptуказаны для одной функции,signalбудет проигнорирован. naked-
Этот атрибут позволяет компилятору построить необходимое объявление функции, позволяя при этом телу функции быть кодом ассемблера. Указанная функция не будет иметь пролога/эпилога, генерируемых компилятором. В нагих функциях безопасно включать только базовые
asmинструкции (см. Базовый Ассемблер). Использование расширенныхasmинструкций или смеси базовыхasmи C-кода может показаться работающим, но их надёжная работа не гарантируется, и они не поддерживаются. 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-7.5.0/gcc/AVR-Function-Attributes.html