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будет проигнорирован.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/AVR-Function-Attributes.html