6.62.10 Встроенные функции 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соответственно. Триfmul*встроенных функции реализованы как вызов библиотеки, если отсутствует аппаратный умножитель.
-
Встроенная функция:
void__builtin_avr_delay_cycles(uint32_t ticks) Задержка выполнения на ticks циклов. Обратите внимание, что эта встроенная функция не учитывает влияние прерываний, которые могут увеличить время задержки. ticks должно быть целочисленной константой, вычисляемой во время компиляции; задержки с переменным числом циклов не поддерживаются.
-
Встроенная функция:
int8_t__builtin_avr_flash_segment(const __memx void*) Эта встроенная функция принимает байтовый адрес 24-битного адресного пространства
__memxи возвращает номер флеш-сегмента (64 Кбайтовый фрагмент), к которому относится адрес. Счёт начинается с0. Если адрес не указывает на флеш-память, возвращается-1.
-
Встроенная функция:
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 равно
-
Встроенная функция:
void__builtin_avr_nops(uint16_t count) Вставка count инструкций
NOP. Количество инструкций должно быть целочисленной константой, вычисляемой во время компиляции.
Существует множество других специфичных для AVR встроенных функций, используемых для реализации функций с фиксированной точкой ISO/IEC TR 18037 «Встроенный C» раздела 7.18a.6. Вам не нужно использовать эти встроенные функции напрямую. Вместо этого используйте объявления, предоставленные заголовком 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-14.2.0/gcc/AVR-Built_002din-Functions.html