Spec-Zone.ru › GCC 13

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

Spec-Zone.ru

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