diff --git a/sys/include/architecture.h b/sys/include/architecture.h new file mode 100644 index 0000000000..12b1941dbf --- /dev/null +++ b/sys/include/architecture.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2020 Otto-von-Guericke-Universität Magdeburg + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License v2.1. See the file LICENSE in the top level directory for more + * details. + */ + +/** + * @defgroup sys_architecture Platform-independent access to architecture + * details + * @ingroup sys + * + * This module provides architecture-independent access to architecture details. + * + * @{ + * + * @file + * @brief Platform-independent access to architecture details + * + * @author Marian Buschsieweke + */ + +#ifndef ARCHITECTURE_H +#define ARCHITECTURE_H + +#include + +#include "architecture_arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Provide doxygen doc centrally, instead of in every architecture_arch.h */ +#ifdef DOXYGEN +/** + * @brief Size of a word in bits + * + * @details Depending on architecture, this can have a value of 8, 16, or 32 + */ +#define ARCHITECTURE_WORD_BITS +/** + * @brief Size of a word in bytes + * + * @details Depending on architecture, this can have a value or 1, 2, or 4. + */ +#define ARCHITECTURE_WORD_BYTES +/** + * @brief Word sized unsigned integer + * + * @details Synonym to `uint8_t`, `uint16_t` or `uint32_t` depending on + * architecture + */ +typedef uint_t uword_t; +/** + * @brief Word sized signed integer + * + * @details Synonym to `int8_t`, `int16_t` or `int32_t` depending on + * architecture + */ +typedef int_t sword_t; +#elif (ARCHITECTURE_WORD_BITS == 8) +#define ARCHITECTURE_WORD_BYTES (1U) +typedef uint8_t uword_t; +typedef int8_t sword_t; +#elif (ARCHITECTURE_WORD_BITS == 16) +#define ARCHITECTURE_WORD_BYTES (2U) +typedef uint16_t uword_t; +typedef int16_t sword_t; +#elif (ARCHITECTURE_WORD_BITS == 32) +#define ARCHITECTURE_WORD_BYTES (4U) +typedef uint32_t uword_t; +typedef int32_t sword_t; +#else +#error "Unsupported word size (check ARCHITECTURE_WORD_BITS in architecture_arch.h)" +#endif + +/** + * @brief Type qualifier to use to align data on word boundaries + * + * Use like this: + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * char WORD_ALIGNED thread_stack[THREAD_STACKSIZE_DEFAULT]; + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define WORD_ALIGNED __attribute__((aligned(ARCHITECTURE_WORD_BYTES))) + +#ifdef __cplusplus +} +#endif + +#endif /* ARCHITECTURE_H */ +/** @} */