Spec-Zone.ru › GCC 8

6.31.5 Атрибуты функций 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 . Эта «безопасность» относится только к коду, сгенерированному компилятором, а не к планированию прерываний приложения, которое является ответственностью приложения.

Если оба signal и interrupt указаны для одной функции, signal будет проигнорировано.

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

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/AVR-Function-Attributes.html

Spec-Zone.ru

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