For each built-in function for AVR, there is an equally named,
uppercase built-in macro defined. That way users can easily query if
or if not a specific built-in is implemented or not. For example, if
__builtin_avr_nop is available the macro
__BUILTIN_AVR_NOP is defined to 1 and undefined otherwise.
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)unsigned char __builtin_avr_swap (unsigned char)unsigned int __builtin_avr_fmul (unsigned char, unsigned char)int __builtin_avr_fmuls (char, char)int __builtin_avr_fmulsu (char, unsigned char)nop, sei, cli, sleep,
wdr, swap, fmul, fmuls
resp. fmulsu. The three fmul* built-ins are implemented
as library call if no hardware multiplier is available.
void __builtin_avr_delay_cycles (unsigned long ticks)char __builtin_avr_flash_segment (const __memx void*)__memx and returns
the number of the flash segment (the 64 KiB chunk) where the address
points to. Counting starts at 0.
If the address does not point to flash memory, return -1.
uint8_t __builtin_avr_insert_bits (uint32_t map, uint8_t bits, uint8_t val)0xf,
then the n-th bit of val is returned unaltered.
0xe,
then the n-th result bit is undefined.
One typical use case for this built-in is adjusting input and output values to non-contiguous port layouts. Some examples:
// 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 (unsigned count)NOP instructions.
The number of instructions must be a compile-time integer constant.
There are many more AVR-specific built-in functions that are used to
implement the ISO/IEC TR 18037 “Embedded C” fixed-point functions of
section 7.18a.6. You don't need to use these built-ins directly.
Instead, use the declarations as supplied by the stdfix.h header
with 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);
}