ChibiOS/os/rt/include/chearly.h

229 lines
9.1 KiB
C

/*
ChibiOS - Copyright (C) 2006,2007,2008,2009,2010,2011,2012,2013,2014,
2015,2016,2017,2018,2019,2020,2021 Giovanni Di Sirio.
This file is part of ChibiOS.
ChibiOS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation version 3 of the License.
ChibiOS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file chearly.h
* @brief Early forward types declarations header.
*
* @addtogroup os_structures
* @{
*/
#ifndef CHEARLY_H
#define CHEARLY_H
/* Port architecture-related definitions.*/
#if !defined(PORT_NEW_TYPES)
#include "chtypes.h"
#else
#include "chporttypes.h"
#endif
/*===========================================================================*/
/* Module constants. */
/*===========================================================================*/
/*===========================================================================*/
/* Module pre-compile time settings. */
/*===========================================================================*/
/*===========================================================================*/
/* Derived constants and error checks. */
/*===========================================================================*/
#if defined(PORT_DOES_NOT_PROVIDE_TYPES)
#if !defined(PORT_ARCH_SIZEOF_DATA_PTR)
#error "PORT_ARCH_SIZEOF_DATA_PTR not defined in chtypes.h"
#endif
#if !defined(PORT_ARCH_SIZEOF_CODE_PTR)
#error "PORT_ARCH_SIZEOF_CODE_PTR not defined in chtypes.h"
#endif
#if !defined(PORT_ARCH_REGISTERS_WIDTH)
#error "PORT_ARCH_REGISTERS_WIDTH not defined in chtypes.h"
#endif
#if !defined(PORT_ARCH_REVERSE_ORDER)
#error "PORT_ARCH_REVERSE_ORDER not defined in chtypes.h"
#endif
#endif
/*===========================================================================*/
/* Module data structures and types. */
/*===========================================================================*/
#if defined(PORT_DOES_NOT_PROVIDE_TYPES) || defined(__DOXYGEN__)
/**
* @name Kernel types
* @{
*/
typedef port_rtcnt_t rtcnt_t; /**< Realtime counter. */
typedef port_rttime_t rttime_t; /**< Realtime accumulator. */
typedef port_syssts_t syssts_t; /**< System status word. */
typedef port_stkalign_t stkalign_t; /**< Stack alignment type. */
#if (PORT_ARCH_REGISTERS_WIDTH == 32) || defined(__DOXYGEN__)
typedef uint8_t tmode_t; /**< Thread flags. */
typedef uint8_t tstate_t; /**< Thread state. */
typedef uint8_t trefs_t; /**< Thread references counter. */
typedef uint8_t tslices_t; /**< Thread time slices counter.*/
typedef uint32_t tprio_t; /**< Thread priority. */
typedef int32_t msg_t; /**< Inter-thread message. */
typedef int32_t eventid_t; /**< Numeric event identifier. */
typedef uint32_t eventmask_t; /**< Mask of event identifiers. */
typedef uint32_t eventflags_t; /**< Mask of event flags. */
typedef int32_t cnt_t; /**< Generic signed counter. */
typedef uint32_t ucnt_t; /**< Generic unsigned counter. */
#elif PORT_ARCH_REGISTERS_WIDTH == 16
typedef uint8_t tmode_t; /**< Thread flags. */
typedef uint8_t tstate_t; /**< Thread state. */
typedef uint8_t trefs_t; /**< Thread references counter. */
typedef uint8_t tslices_t; /**< Thread time slices counter.*/
typedef uint16_t tprio_t; /**< Thread priority. */
typedef int16_t msg_t; /**< Inter-thread message. */
typedef int16_t eventid_t; /**< Numeric event identifier. */
typedef uint16_t eventmask_t; /**< Mask of event identifiers. */
typedef uint16_t eventflags_t; /**< Mask of event flags. */
typedef int16_t cnt_t; /**< Generic signed counter. */
typedef uint16_t ucnt_t; /**< Generic unsigned counter. */
#elif PORT_ARCH_REGISTERS_WIDTH == 8
typedef uint8_t tmode_t; /**< Thread flags. */
typedef uint8_t tstate_t; /**< Thread state. */
typedef uint8_t trefs_t; /**< Thread references counter. */
typedef uint8_t tslices_t; /**< Thread time slices counter.*/
typedef uint8_t tprio_t; /**< Thread priority. */
typedef int16_t msg_t; /**< Inter-thread message. */
typedef int8_t eventid_t; /**< Numeric event identifier. */
typedef uint8_t eventmask_t; /**< Mask of event identifiers. */
typedef uint8_t eventflags_t; /**< Mask of event flags. */
typedef int8_t cnt_t; /**< Generic signed counter. */
typedef uint8_t ucnt_t; /**< Generic unsigned counter. */
#else
#error "unsupported PORT_ARCH_REGISTERS_WIDTH value"
#endif
/** @} */
#endif /* defined(PORT_DOES_NOT_PROVIDE_TYPES) */
/**
* @brief Type of a core identifier.
* @note Core identifiers have ranges from 0 to @p PORT_CORES_NUMBER - 1.
*/
typedef unsigned core_id_t;
/**
* @brief Type of a thread structure.
*/
typedef struct ch_thread thread_t;
/**
* @brief Type of an OS instance structure.
*/
typedef struct ch_os_instance os_instance_t;
/*===========================================================================*/
/* Module macros. */
/*===========================================================================*/
/**
* @brief Utility to make the parameter a quoted string.
*
* @param[in] a literal to be string-ified
*/
#define __CH_STRINGIFY(a) #a
/**
* @brief Structure field offset utility.
*
* @param[in] st structured type name
* @param[in] m field name in the structured type
* @return The offset of the field in the structured type.
*/
#define __CH_OFFSETOF(st, m) \
/*lint -save -e9005 -e9033 -e413 [11.8, 10.8, 1.3] Normal pointers
arithmetic, it is safe.*/ \
((size_t)((char *)&((st *)0)->m - (char *)0)) \
/*lint -restore*/
/**
* @brief Marks an expression result as used.
*
* @param[in] x a valid expression
*/
#define __CH_USED(x) (void)(x)
/**
* @brief Marks a boolean expression as likely true.
* @note No namespace prefix for this macro because it is commonly defined
* by operating systems.
*
* @param[in] x a valid expression
*/
#if defined(PORT_LIKELY) || defined(__DOXYGEN__)
#define likely(x) PORT_LIKELY(x)
#else
#define likely(x) x
#endif
/**
* @brief Marks a boolean expression as likely false.
* @note No namespace prefix for this macro because it is commonly defined
* by operating systems.
*
* @param[in] x a valid expression
*/
#if defined(PORT_UNLIKELY) || defined(__DOXYGEN__)
#define unlikely(x) PORT_UNLIKELY(x)
#else
#define unlikely(x) x
#endif
/**
* @brief Safe cast of a queue pointer to a thread pointer.
* @note Casting to a thread pointer should always be performed using
* this macro. Casting to threads pointer is allowed by design
* and this is the single check point for this operation.
*
* @param[in] p pointer to a queue/list structure
* @return The pointer to the thread containing the queue/list
* element.
*/
#define threadref(p) ((thread_t *)(void *)(p))
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
/* Early function prototypes required by the following headers.*/
#ifdef __cplusplus
extern "C" {
#endif
void chSysHalt(const char *reason);
#ifdef __cplusplus
}
#endif
/*===========================================================================*/
/* Module inline functions. */
/*===========================================================================*/
#endif /* CHEARLY_H */
/** @} */