Spec-Zone.ru › GCC 14

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

  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);
Встроенная функция: 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

Spec-Zone.ru

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