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.
- Если X равно
0xf, то n-й бит val возвращается без изменений. - Если X находится в диапазоне 0…7, то n-й бит результата устанавливается равным X-му биту bits.
- Если 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);
- Если X равно
-
Встроенная функция:
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