Spec-Zone.ru › GCC 9

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_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.

Это "безопасное" утверждение относится только к коду, сгенерированному компилятором, а не к структуре прерывания приложения, что является ответственностью приложения.

Если оба атрибута 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API