Commonly used includes, types and macros.
Copyright (c) 2010-2018 Microchip Technology Inc. and its subsidiaries.
#include <avr/io.h>
#include <avr/builtins.h>
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
#include <stdlib.h>
#include <parts.h>
#include "bit_handling/clz_ctz.h"
#include "unit_test/suite.h"
#include "preprocessor.h"
#include "progmem.h"
#include "interrupt.h"
Data Structures | |
struct | StructCPtr |
Structure of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. More... | |
struct | StructCVPtr |
Structure of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. More... | |
struct | StructPtr |
Structure of pointers to 64-, 32-, 16- and 8-bit unsigned integers. More... | |
struct | StructVPtr |
Structure of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. More... | |
union | Union16 |
16-bit union. More... | |
union | Union32 |
32-bit union. More... | |
union | Union64 |
64-bit union. More... | |
union | UnionCPtr |
Union of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. More... | |
union | UnionCVPtr |
Union of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. More... | |
union | UnionPtr |
Union of pointers to 64-, 32-, 16- and 8-bit unsigned integers. More... | |
union | UnionVPtr |
Union of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. More... | |
Macros | |||
#define | __always_inline inline __attribute__((__always_inline__)) | ||
The function should always be inlined. More... | |||
#define | ADDR_COPY_DST_SRC_16(dst, src) memcpy((&(dst)), (&(src)), sizeof(uint16_t)) | ||
#define | ADDR_COPY_DST_SRC_64(dst, src) memcpy((&(dst)), (&(src)), sizeof(uint64_t)) | ||
#define | barrier() asm volatile("" ::: "memory") | ||
Memory barrier. More... | |||
#define | CCPU_ENDIAN_TO_LE16(x) (x) | ||
#define | CCPU_ENDIAN_TO_LE32(x) (x) | ||
#define | CCPU_ENDIAN_TO_LE64(x) (x) | ||
#define | CLE16_TO_CPU_ENDIAN(x) (x) | ||
#define | CLE32_TO_CPU_ENDIAN(x) (x) | ||
#define | CLE64_TO_CPU_ENDIAN(x) (x) | ||
#define | CMD_ID_OCTET (0) | ||
#define | COMPILER_ALIGNED(a) __attribute__((__aligned__(a))) | ||
Set aligned boundary. More... | |||
#define | COMPILER_PACK_RESET(alignment) | ||
#define | COMPILER_PACK_SET(alignment) | ||
#define | COMPILER_PRAGMA(arg) _Pragma(#arg) | ||
Emit the compiler pragma arg. More... | |||
#define | COMPILER_WORD_ALIGNED __attribute__((__aligned__(2))) | ||
Set word-aligned boundary. More... | |||
#define | convert_16_bit_to_byte_address(value, data) ((*(uint16_t *)(data)) = (uint16_t)(value)) | ||
#define | convert_16_bit_to_byte_array(value, data) ((*(uint16_t *)(data)) = (uint16_t)(value)) | ||
#define | convert_32_bit_to_byte_array(value, data) ((*(uint32_t *)(data)) = (uint32_t)(value)) | ||
#define | convert_64_bit_to_byte_array(value, data) memcpy((data), (&(value)), sizeof(uint64_t)) | ||
#define | convert_byte_array_to_16_bit(data) (*(uint16_t *)(data)) | ||
#define | convert_byte_array_to_32_bit(data) (*(uint32_t *)(data)) | ||
#define | convert_byte_array_to_64_bit(data) (*(uint64_t *)(data)) | ||
#define | convert_spec_16_bit_to_byte_array(value, data) ((*(uint16_t *)(data)) = (uint16_t)(value)) | ||
#define | CPU_ENDIAN_TO_LE16(x) (x) | ||
#define | CPU_ENDIAN_TO_LE32(x) (x) | ||
#define | CPU_ENDIAN_TO_LE64(x) (x) | ||
#define | div_ceil(a, b) (((a) + (b) - 1) / (b)) | ||
Calculate \( \left\lceil \frac{a}{b} \right\rceil \) using integer arithmetic. More... | |||
#define | FLASH_DECLARE(x) const x __attribute__((__progmem__)) | ||
#define | FLASH_EXTERN(x) extern const x | ||
#define | FUNC_PTR void * | ||
#define | LE16_TO_CPU_ENDIAN(x) (x) | ||
#define | LE32_TO_CPU_ENDIAN(x) (x) | ||
#define | LE64_TO_CPU_ENDIAN(x) (x) | ||
#define | Long_call(addr) ((*(void (*)(void))(addr))()) | ||
Calls the routine at address addr. More... | |||
#define | MEMCPY_ENDIAN memcpy | ||
#define | nop() do { __asm__ __volatile__ ("nop"); } while (0) | ||
#define | PGM_READ_BLOCK(dst, src, len) memcpy_P((dst), (src), (len)) | ||
#define | PGM_READ_BYTE(x) pgm_read_byte(x) | ||
#define | PGM_READ_WORD(x) pgm_read_word(x) | ||
#define | SHORTENUM __attribute__ ((packed)) | ||
#define | UNUSED(v) (void)(v) | ||
Marking v as a unused parameter or value. More... | |||
#define | unused(v) do { (void)(v); } while(0) | ||
Marking v as a unused parameter or value. More... | |||
Tag functions as deprecated | |||
Tagging a function as deprecated will produce a warning when and only when the function is called. Usage is to add the DEPRECATED symbol before the function definition. E.g.: DEPRECATED uint8_t some_deprecated_function (void) { ... }
| |||
#define | __DEPRECATED__ __attribute__((__deprecated__)) | ||
Usual Constants | |||
#define | DISABLE 0 | ||
#define | ENABLE 1 | ||
#define | false 0 | ||
#define | true 1 | ||
#define | PASS 0 | ||
#define | FAIL 1 | ||
#define | LOW 0 | ||
#define | HIGH 1 | ||
Compile time error handling | |||
#define | ERROR_FUNC(name, msg) extern int name(void) | ||
Fail compilation if function call isn't eliminated. More... | |||
Optimization Control | |||
#define | __always_optimize __attribute__((optimize(3))) | ||
The function should always be optimized. More... | |||
#define | likely(exp) (exp) | ||
The expression exp is likely to be true. More... | |||
#define | unlikely(exp) (exp) | ||
The expression exp is unlikely to be true. More... | |||
#define | is_constant(exp) __builtin_constant_p(exp) | ||
Determine if an expression evaluates to a constant value. More... | |||
Bit-Field Handling | |||
#define | Rd_bits(value, mask) ((value)&(mask)) | ||
Reads the bits of a value specified by a given bit-mask. More... | |||
#define | Wr_bits(lvalue, mask, bits) | ||
Writes the bits of a C lvalue specified by a given bit-mask. More... | |||
#define | Tst_bits(value, mask) (Rd_bits(value, mask) != 0) | ||
Tests the bits of a value specified by a given bit-mask. More... | |||
#define | Clr_bits(lvalue, mask) ((lvalue) &= ~(mask)) | ||
Clears the bits of a C lvalue specified by a given bit-mask. More... | |||
#define | Set_bits(lvalue, mask) ((lvalue) |= (mask)) | ||
Sets the bits of a C lvalue specified by a given bit-mask. More... | |||
#define | Tgl_bits(lvalue, mask) ((lvalue) ^= (mask)) | ||
Toggles the bits of a C lvalue specified by a given bit-mask. More... | |||
#define | Rd_bitfield(value, mask) (Rd_bits( value, (uint32_t)mask) >> ctz(mask)) | ||
Reads the bit-field of a value specified by a given bit-mask. More... | |||
#define | Wr_bitfield(lvalue, mask, bitfield) (Wr_bits(lvalue, mask, (uint32_t)(bitfield) << ctz(mask))) | ||
Writes the bit-field of a C lvalue specified by a given bit-mask. More... | |||
Bit Reversing | |||
This macro is used to test fatal errors. The macro tests if the expression is false. If it is, a fatal error is detected and the application hangs up. If TEST_SUITE_DEFINE_ASSERT_MACRO is defined, a unit test version of the macro is used, to allow execution of further tests after a false expression.
| |||
#define | bit_reverse8(u8) ((U8)(bit_reverse32((U8)(u8)) >> 24)) | ||
Reverses the bits of u8. More... | |||
#define | bit_reverse16(u16) ((U16)(bit_reverse32((U16)(u16)) >> 16)) | ||
Reverses the bits of u16. More... | |||
#define | bit_reverse32(u32) | ||
Reverses the bits of u32. More... | |||
#define | bit_reverse64(u64) | ||
Reverses the bits of u64. More... | |||
Alignment | |||
#define | Test_align(val, n) (!Tst_bits( val, (n) - 1 ) ) | ||
Tests alignment of the number val with the n boundary. More... | |||
#define | Get_align(val, n) ( Rd_bits( val, (n) - 1 ) ) | ||
Gets alignment of the number val with respect to the n boundary. More... | |||
#define | Set_align(lval, n, alg) ( Wr_bits(lval, (n) - 1, alg) ) | ||
Sets alignment of the lvalue number lval to alg with respect to the n boundary. More... | |||
#define | Align_up(val, n) (((val) + ((n) - 1)) & ~((n) - 1)) | ||
Aligns the number val with the upper n boundary. More... | |||
#define | Align_down(val, n) ( (val) & ~((n) - 1)) | ||
Aligns the number val with the lower n boundary. More... | |||
Mathematics | |||
Compiler optimization for non-constant expressions, only for abs under WinAVR | |||
#define | Abs(a) (((a) < 0 ) ? -(a) : (a)) | ||
Takes the absolute value of a. More... | |||
#define | abs(a) Abs(a) | ||
#define | Min(a, b) (((a) < (b)) ? (a) : (b)) | ||
Takes the minimal value of a and b. More... | |||
#define | min(a, b) Min(a, b) | ||
#define | Max(a, b) (((a) > (b)) ? (a) : (b)) | ||
Takes the maximal value of a and b. More... | |||
#define | max(a, b) Max(a, b) | ||
System Register Access | |||
#define | Get_system_register(sysreg) __builtin_mfsr(sysreg) | ||
Gets the value of the sysreg system register. More... | |||
#define | Set_system_register(sysreg, value) __builtin_mtsr(sysreg, value) | ||
Sets the value of the sysreg system register to value. More... | |||
Debug Register Access | |||
#define | Get_debug_register(dbgreg) __builtin_mfdr(dbgreg) | ||
Gets the value of the dbgreg debug register. More... | |||
#define | Set_debug_register(dbgreg, value) __builtin_mtdr(dbgreg, value) | ||
Sets the value of the dbgreg debug register to value. More... | |||
MCU Endianism Handling | |||
xmega is a MCU little endianism. | |||
#define | MSB(u16) (((uint8_t* )&u16)[1]) | ||
#define | LSB(u16) (((uint8_t* )&u16)[0]) | ||
#define | MSW(u32) (((uint16_t*)&u32)[1]) | ||
#define | LSW(u32) (((uint16_t*)&u32)[0]) | ||
#define | MSB0W(u32) (((uint8_t*)&(u32))[3]) | ||
Most significant byte of 1st rank of u32. More... | |||
#define | MSB1W(u32) (((uint8_t*)&(u32))[2]) | ||
Most significant byte of 2nd rank of u32. More... | |||
#define | MSB2W(u32) (((uint8_t*)&(u32))[1]) | ||
Most significant byte of 3rd rank of u32. More... | |||
#define | MSB3W(u32) (((uint8_t*)&(u32))[0]) | ||
Most significant byte of 4th rank of u32. More... | |||
#define | LSB3W(u32) MSB0W(u32) | ||
Least significant byte of 4th rank of u32. More... | |||
#define | LSB2W(u32) MSB1W(u32) | ||
Least significant byte of 3rd rank of u32. More... | |||
#define | LSB1W(u32) MSB2W(u32) | ||
Least significant byte of 2nd rank of u32. More... | |||
#define | LSB0W(u32) MSB3W(u32) | ||
Least significant byte of 1st rank of u32. More... | |||
#define | MSB0(u32) (((uint8_t*)&u32)[3]) | ||
#define | MSB1(u32) (((uint8_t*)&u32)[2]) | ||
#define | MSB2(u32) (((uint8_t*)&u32)[1]) | ||
#define | MSB3(u32) (((uint8_t*)&u32)[0]) | ||
#define | LSB0(u32) MSB3(u32) | ||
#define | LSB1(u32) MSB2(u32) | ||
#define | LSB2(u32) MSB1(u32) | ||
#define | LSB3(u32) MSB0(u32) | ||
#define | LE16(x) (x) | ||
#define | le16_to_cpu(x) (x) | ||
#define | cpu_to_le16(x) (x) | ||
#define | LE16_TO_CPU(x) (x) | ||
#define | CPU_TO_LE16(x) (x) | ||
#define | BE16(x) Swap16(x) | ||
#define | be16_to_cpu(x) swap16(x) | ||
#define | cpu_to_be16(x) swap16(x) | ||
#define | BE16_TO_CPU(x) Swap16(x) | ||
#define | CPU_TO_BE16(x) Swap16(x) | ||
#define | LE32(x) (x) | ||
#define | le32_to_cpu(x) (x) | ||
#define | cpu_to_le32(x) (x) | ||
#define | LE32_TO_CPU(x) (x) | ||
#define | CPU_TO_LE32(x) (x) | ||
#define | BE32(x) Swap32(x) | ||
#define | be32_to_cpu(x) swap32(x) | ||
#define | cpu_to_be32(x) swap32(x) | ||
#define | BE32_TO_CPU(x) Swap32(x) | ||
#define | CPU_TO_BE32(x) Swap32(x) | ||
Endianism Conversion | |||
The same considerations as for clz and ctz apply here but AVR32-GCC's __builtin_bswap_16 and __builtin_bswap_32 do not behave like macros when applied to constant expressions, so two sets of macros are defined here:
| |||
#define | Swap16(u16) | ||
Toggles the endianism of u16 (by swapping its bytes). More... | |||
#define | Swap32(u32) | ||
Toggles the endianism of u32 (by swapping its bytes). More... | |||
#define | Swap64(u64) | ||
Toggles the endianism of u64 (by swapping its bytes). More... | |||
#define | swap16(u16) Swap16(u16) | ||
Toggles the endianism of u16 (by swapping its bytes). More... | |||
#define | swap32(u32) Swap32(u32) | ||
Toggles the endianism of u32 (by swapping its bytes). More... | |||
#define | swap64(u64) | ||
Toggles the endianism of u64 (by swapping its bytes). More... | |||
Typedefs | |
Usual Types | |
typedef unsigned char | Bool |
Boolean. More... | |
typedef unsigned char | bool |
Boolean. More... | |
typedef int8_t | S8 |
8-bit signed integer. More... | |
typedef uint8_t | U8 |
8-bit unsigned integer. More... | |
typedef int16_t | S16 |
16-bit signed integer. More... | |
typedef uint16_t | U16 |
16-bit unsigned integer. More... | |
typedef uint16_t | le16_t |
typedef uint16_t | be16_t |
typedef int32_t | S32 |
32-bit signed integer. More... | |
typedef uint32_t | U32 |
32-bit unsigned integer. More... | |
typedef uint32_t | le32_t |
typedef uint32_t | be32_t |
typedef int64_t | S64 |
64-bit signed integer. More... | |
typedef uint64_t | U64 |
64-bit unsigned integer. More... | |
typedef float | F32 |
32-bit floating-point number. More... | |
typedef double | F64 |
64-bit floating-point number. More... | |
typedef uint16_t | iram_size_t |
Status Types | |
typedef Bool | Status_bool_t |
Boolean status. More... | |
typedef U8 | Status_t |
8-bit-coded status. More... | |
Functions | |
Logarithmic functions | |
int_fast8_t | ilog2_undefined (void) |
static int_fast8_t | ilog2 (uint32_t x) |
Calculate the base-2 logarithm of a number rounded down to the nearest integer. More... | |
Function call demultiplexing | |
#define | compiler_demux_size(size, func,...) |
Demultiplex function call based on size of datatype. More... | |
ERROR_FUNC (compiler_demux_bad_size,"Invalid parameter size") | |
Error function for failed demultiplexing. More... | |
Target Abstraction | |
#define | _GLOBEXT_ extern |
extern storage-class specifier. More... | |
#define | _CONST_TYPE_ const |
const type qualifier. More... | |
#define | _MEM_TYPE_SLOW_ |
Slow memory type. More... | |
#define | _MEM_TYPE_MEDFAST_ |
Fairly fast memory type. More... | |
#define | _MEM_TYPE_FAST_ |
Fast memory type. More... | |
#define | memcmp_ram2ram memcmp |
Target-specific memcmp of RAM to RAM. More... | |
#define | memcmp_code2ram memcmp |
Target-specific memcmp of RAM to NVRAM. More... | |
#define | memcpy_ram2ram memcpy |
Target-specific memcpy from RAM to RAM. More... | |
#define | memcpy_code2ram memcpy |
Target-specific memcpy from NVRAM to RAM. More... | |
typedef U8 | Byte |
8-bit unsigned integer. More... | |