Spec-Zone.ru › GCC 15

7.13.9 Встроенные функции AVR

Для каждой встроенной функции AVR определен одноименный встроенный макрос в верхнем регистре. Это позволяет пользователям легко проверять, реализована ли конкретная встроенная функция. Например, если доступна __builtin_avr_nop, макрос __BUILTIN_AVR_NOP определяется как 1, а в противном случае остается неопределенным.

Встроенная функция: void __builtin_avr_nop (void)
Встроенная функция: void __builtin_avr_sei (void)
Встроенная функция: void __builtin_avr_cli (void)
Встроенная функция: void __builtin_avr_sleep (void)
Встроенная функция: void __builtin_avr_wdr (void)
Встроенная функция: uint8_t __builtin_avr_swap (uint8_t)
Встроенная функция: uint16_t __builtin_avr_fmul (uint8_t, uint8_t)
Встроенная функция: int16_t __builtin_avr_fmuls (int8_t, int8_t)
Встроенная функция: int16_t __builtin_avr_fmulsu (int8_t, uint8_t)

Эти встроенные функции соответствуют соответствующим машинным инструкциям, а именно nop, sei, cli, sleep, wdr, swap, fmul, fmuls и fmulsu соответственно. Три встроенные функции fmul* реализуются как вызовы библиотечных функций, если аппаратный умножитель недоступен.

Встроенная функция: void __builtin_avr_delay_cycles (uint32_t ticks)

Задерживает выполнение на ticks тактов. Обратите внимание, что эта встроенная функция не учитывает влияние прерываний, которые могут увеличить время задержки. ticks должно быть целочисленной константой времени компиляции; задержки на переменное количество тактов не поддерживаются.

Встроенная функция: uint8_t __builtin_avr_insert_bits (uint32_t map, uint8_t bits, uint8_t val)

Вставляет биты из bits в val и возвращает полученное значение. Нибблы map определяют способ вставки: пусть X — n-й ниббл map.

  1. Если X равно 0xf, то n-й бит val возвращается без изменений.
  2. Если X находится в диапазоне 0…7, то n-й бит результата устанавливается равным X-му биту bits.
  3. Если X находится в диапазоне 8…0xe, то значение n-го бита результата не определено.

Один из типичных вариантов использования этой встроенной функции — настройка входных и выходных значений для непоследовательного расположения портов. Примеры:

// same as val, bits is unused
__builtin_avr_insert_bits (0xffffffff, bits, val);
// same as bits, val is unused
__builtin_avr_insert_bits (0x76543210, bits, val);
// same as rotating bits by 4
__builtin_avr_insert_bits (0x32107654, bits, 0);
// high nibble of result is the high nibble of val
// low nibble of result is the low nibble of bits
__builtin_avr_insert_bits (0xffff3210, bits, val);
// reverse the bit order of bits
__builtin_avr_insert_bits (0x01234567, bits, 0);
Встроенная функция: uint8_t __builtin_avr_mask1 (uint8_t mask, uint8_t offs)

Сдвигает циклически 8-битное константное значение mask на смещение offs, где mask принадлежит множеству { 0x01, 0xfe, 0x7f, 0x80 }. Эту встроенную функцию можно использовать вместо 8-битных выражений, таких как 1 << offs, если их вычисление занимает слишком много времени, а значение offs заведомо находится в диапазоне 0…7.

__builtin_avr_mask1 (1, offs)      // same like  1 << offs
__builtin_avr_mask1 (~1, offs)     // same like  ~(1 << offs)
__builtin_avr_mask1 (0x80, offs)   // same like  0x80 >> offs
__builtin_avr_mask1 (~0x80, offs)  // same like  ~(0x80 >> offs)

Вручную написанные варианты на C требуют не менее 5 + 4 * offs тактов (и 5 инструкций), тогда как встроенная функция требует 7 тактов и инструкций (8 тактов и инструкций в случае mask = 0x7f).

Встроенная функция: void __builtin_avr_nops (uint16_t count)

Вставляет count инструкций NOP. Количество инструкций должно быть целочисленной константой времени компиляции.

Все следующие встроенные функции доступны только в GNU-C

Встроенная функция: int8_t __builtin_avr_flash_segment (const __memx void*)

Эта встроенная функция принимает байтовый адрес в 24-битном именованном адресном пространстве __memx и возвращает номер сегмента флеш-памяти (блока размером 64 КиБ), на который указывает адрес. Отсчет начинается с 0. Если адрес не указывает на флеш-память, возвращается -1.

Встроенная функция: size_t __builtin_avr_strlen_flash (const __flash char*)
Встроенная функция: size_t __builtin_avr_strlen_flashx (const __flashx char*)
Встроенная функция: size_t __builtin_avr_strlen_memx (const __memx char*)

Эти встроенные функции возвращают длину строки, расположенной в именованном адресном пространстве __flash, __flashx или __memx соответственно. Они используются для поддержки таких функций, как strlen_F из заголовочного файла avr/flash.h библиотеки AVR-LibC.

Существует множество других встроенных функций, специфичных для AVR, которые используются для реализации функций арифметики с фиксированной запятой из раздела 7.18a.6 стандарта ISO/IEC TR 18037 «Встраиваемый C». Вам не нужно использовать эти встроенные функции напрямую. Вместо этого используйте объявления из заголовочного файла stdfix.h при работе с GNU-C99:

#include <stdfix.h>

// Re-interpret the bit representation of unsigned 16-bit
// integer uval as Q-format 0.16 value.
unsigned fract get_bits (uint_ur_t uval)
{
    return urbits (uval);
}

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

Spec-Zone.ru

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