6.33.6 Атрибуты функций AVR
Эти атрибуты функций поддерживаются бэкендом AVR:
-
interrupt -
Используйте этот атрибут, чтобы указать, что указанная функция является обработчиком прерывания. Компилятор генерирует последовательности входа и выхода функции, подходящие для использования в обработчике прерывания, когда этот атрибут присутствует.
В AVR аппаратное обеспечение глобально отключает прерывания при выполнении прерывания. Первая инструкция обработчика прерывания, объявленного с этим атрибутом, является инструкцией
SEI, чтобы снова включить прерывания. См. также атрибут функцииsignal, который не вставляет инструкциюSEI. Если обаsignalиinterruptуказаны для одной и той же функции,signalигнорируется молчаливо. -
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_main OS_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. Это «безопасность» относится только к коду, сгенерированному компилятором, а не к схеме IRQ приложения, что является обязанностью приложения.Если оба
signalиinterruptуказаны для одной и той же функции,signalигнорируется молчаливо.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/AVR-Function-Attributes.html