Spec-Zone.ru › GCC 11

Следующее: Атрибуты функций 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-11.4.0/gcc/AVR-Function-Attributes.html

Spec-Zone.ru

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