Spec-Zone.ru › GCC 12

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

Spec-Zone.ru

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