Spec-Zone.ru › GCC 10

Следующая: Атрибуты функций Blackfin, Предыдущая: Атрибуты функций ARM, Вверх: Объявление атрибутов функций [Оглавление][Индекс]

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-10.5.0/gcc/AVR-Function-Attributes.html

Spec-Zone.ru

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