From d447fd6ceeda74abded59704247d259e0f710fff Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Fri, 24 Nov 2017 07:59:12 +0000 Subject: New hooks added to RT, stronger checks on RT chconf.h files. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11071 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/rt/include/ch.h | 39 ++++-- os/rt/include/chchecks.h | 280 +++++++++++++++++++++++++++++++++++------ os/rt/include/chrestrictions.h | 106 ++++++++++++++++ os/rt/include/chschd.h | 13 +- os/rt/include/chsys.h | 20 --- os/rt/include/chthreads.h | 12 -- os/rt/include/chtrace.h | 4 - os/rt/src/chsys.c | 3 + os/rt/templates/chconf.h | 16 +++ 9 files changed, 394 insertions(+), 99 deletions(-) create mode 100644 os/rt/include/chrestrictions.h (limited to 'os') diff --git a/os/rt/include/ch.h b/os/rt/include/ch.h index d3bd8217b..a81916522 100644 --- a/os/rt/include/ch.h +++ b/os/rt/include/ch.h @@ -66,19 +66,33 @@ #define CH_KERNEL_PATCH 0 /** @} */ -/* Configuration headers and checks.*/ -#include "chtypes.h" -#include "chconf.h" - -#if !defined(_CHIBIOS_RT_CONF_) -#error "invalid configuration file" +/** + * @name Constants for configuration options + */ +/** + * @brief Generic 'false' preprocessor boolean constant. + * @note It is meant to be used in configuration files as switch. + */ +#if !defined(FALSE) || defined(__DOXYGEN__) +#define FALSE 0 #endif -#if !defined(_CHIBIOS_RT_CONF_VER_5_0_) -#error "obsolete or unknown configuration file" +/** + * @brief Generic 'true' preprocessor boolean constant. + * @note It is meant to be used in configuration files as switch. + */ +#if !defined(TRUE) || defined(__DOXYGEN__) +#define TRUE 1 #endif +/** @} */ + +/* Configuration headers, checks and licensing restrictions.*/ +#include "chconf.h" +#include "chchecks.h" +#include "chlicense.h" +#include "chrestrictions.h" -/* Early function prototypes required by the following headers.*/ +/* Early function prototype required by the following headers.*/ #ifdef __cplusplus extern "C" { #endif @@ -87,9 +101,8 @@ extern "C" { } #endif -/* Including everything else.*/ -#include "chlicense.h" -#include "chchecks.h" +/* Base kernel headers.*/ +#include "chtypes.h" /* TODO: Rename and rework.*/ #include "chsystypes.h" #include "chdebug.h" #include "chtime.h" @@ -111,6 +124,8 @@ extern "C" { #include "chcond.h" #include "chevents.h" #include "chmsg.h" + +/* OSLIB headers.*/ #include "chmboxes.h" #include "chmemcore.h" #include "chheap.h" diff --git a/os/rt/include/chchecks.h b/os/rt/include/chchecks.h index a7d1fb34f..68a528061 100644 --- a/os/rt/include/chchecks.h +++ b/os/rt/include/chchecks.h @@ -19,7 +19,7 @@ /** * @file chchecks.h - * @brief Configuration checks macros and structures. + * @brief Configuration file checks header. */ #ifndef CHCHECKS_H @@ -33,59 +33,261 @@ /* Module pre-compile time settings. */ /*===========================================================================*/ -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ +/* Configuration file checks.*/ +#if !defined(_CHIBIOS_RT_CONF_) +#error "invalid configuration file" +#endif -#if CH_CUSTOMER_LIC_RT == FALSE -#error "ChibiOS/RT not licensed" +#if !defined(_CHIBIOS_RT_CONF_VER_5_0_) +#error "obsolete or unknown configuration file" #endif -#if (CH_LICENSE_FEATURES != CH_FEATURES_FULL) && \ - (CH_LICENSE_FEATURES != CH_FEATURES_INTERMEDIATE) && \ - (CH_LICENSE_FEATURES != CH_FEATURES_BASIC) -#error "invalid CH_LICENSE_FEATURES setting" +/* System timers checks.*/ +#if !defined(CH_CFG_ST_RESOLUTION) +#error "CH_CFG_ST_RESOLUTION not defined in chconf.h" #endif -/* Restrictions in basic and intermediate modes.*/ -#if (CH_LICENSE_FEATURES == CH_FEATURES_INTERMEDIATE) || \ - (CH_LICENSE_FEATURES == CH_FEATURES_BASIC) +#if !defined(CH_CFG_ST_FREQUENCY) +#error "CH_CFG_ST_FREQUENCY not defined in chconf.h" +#endif -/* System tick limited to 1000hz.*/ -#if CH_CFG_ST_FREQUENCY > 1000 -#undef CH_CFG_ST_FREQUENCY -#define CH_CFG_ST_FREQUENCY 1000 +#if !defined(CH_CFG_INTERVALS_SIZE) +#error "CH_CFG_INTERVALS_SIZE not defined in chconf.h" #endif -/* Restricted subsystems.*/ -#undef CH_DBG_STATISTICS -#undef CH_DBG_TRACE_MASK +#if !defined(CH_CFG_TIME_TYPES_SIZE) +#error "CH_CFG_TIME_TYPES_SIZE not defined in chconf.h" +#endif -#define CH_DBG_STATISTICS FALSE -#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED +#if !defined(CH_CFG_ST_TIMEDELTA) +#error "CH_CFG_ST_TIMEDELTA not defined in chconf.h" +#endif -#endif /* (CH_LICENSE_FEATURES == CH_FEATURES_INTERMEDIATE) || - (CH_LICENSE_FEATURES == CH_FEATURES_BASIC) */ +/* Kernel parameters and options checks.*/ +#if !defined(CH_CFG_TIME_QUANTUM) +#error "CH_CFG_TIME_QUANTUM not defined in chconf.h" +#endif -/* Restrictions in basic mode.*/ -#if CH_LICENSE_FEATURES == CH_FEATURES_BASIC +#if !defined(CH_CFG_MEMCORE_SIZE) +#error "CH_CFG_MEMCORE_SIZE not defined in chconf.h" +#endif -/* Tick-Less mode restricted.*/ -#undef CH_CFG_ST_TIMEDELTA -#define CH_CFG_ST_TIMEDELTA 0 +#if !defined(CH_CFG_NO_IDLE_THREAD) +#error "CH_CFG_NO_IDLE_THREAD not defined in chconf.h" +#endif -/* Restricted subsystems.*/ -#undef CH_CFG_USE_TM -#undef CH_CFG_USE_MUTEXES -#undef CH_CFG_USE_CONDVARS -#undef CH_CFG_USE_DYNAMIC +/* Performance options checks.*/ +#if !defined(CH_CFG_OPTIMIZE_SPEED) +#error "CH_CFG_OPTIMIZE_SPEED not defined in chconf.h" +#endif -#define CH_CFG_USE_TM FALSE -#define CH_CFG_USE_MUTEXES FALSE -#define CH_CFG_USE_CONDVARS FALSE -#define CH_CFG_USE_DYNAMIC FALSE +/* Subsystem options checks.*/ +#if !defined(CH_CFG_USE_TM) +#error "CH_CFG_USE_TM not defined in chconf.h" +#endif -#endif /* CH_LICENSE_FEATURES == CH_FEATURES_BASIC */ +#if !defined(CH_CFG_USE_REGISTRY) +#error "CH_CFG_USE_REGISTRY not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_WAITEXIT) +#error "CH_CFG_USE_WAITEXIT not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_SEMAPHORES) +#error "CH_CFG_USE_SEMAPHORES not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) +#error "CH_CFG_USE_SEMAPHORES_PRIORITY not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_MUTEXES) +#error "CH_CFG_USE_MUTEXES not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) +#error "CH_CFG_USE_MUTEXES_RECURSIVE not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_CONDVARS) +#error "CH_CFG_USE_CONDVARS not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) +#error " not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) +#error " not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_EVENTS) +#error "CH_CFG_USE_EVENTS not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) +#error "CH_CFG_USE_EVENTS_TIMEOUT not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_MESSAGES) +#error "CH_CFG_USE_MESSAGES not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) +#error "CH_CFG_USE_MESSAGES_PRIORITY not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_MAILBOXES) +#error "CH_CFG_USE_MAILBOXES not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_MEMCORE) +#error "CH_CFG_USE_MEMCORE not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_HEAP) +#error "CH_CFG_USE_HEAP not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_MEMPOOLS) +#error "CH_CFG_USE_MEMPOOLS not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_OBJ_FIFOS) +#error "CH_CFG_USE_OBJ_FIFOS not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_DYNAMIC) +#error "CH_CFG_USE_DYNAMIC not defined in chconf.h" +#endif + +/* Objects factory options checks.*/ +#if !defined(CH_CFG_USE_FACTORY) +#error "CH_CFG_USE_FACTORY not defined in chconf.h" +#endif + +#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) +#error "CH_CFG_FACTORY_MAX_NAMES_LENGTH not defined in chconf.h" +#endif + +#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) +#error "CH_CFG_FACTORY_OBJECTS_REGISTRY not defined in chconf.h" +#endif + +#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) +#error "CH_CFG_FACTORY_GENERIC_BUFFERS not defined in chconf.h" +#endif + +#if !defined(CH_CFG_FACTORY_SEMAPHORES) +#error "CH_CFG_FACTORY_SEMAPHORES not defined in chconf.h" +#endif + +#if !defined(CH_CFG_FACTORY_MAILBOXES) +#error "CH_CFG_FACTORY_MAILBOXES not defined in chconf.h" +#endif + +#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) +#error "CH_CFG_FACTORY_OBJ_FIFOS not defined in chconf.h" +#endif + +/* Debug options checks.*/ +#if !defined(CH_DBG_STATISTICS) +#error "CH_DBG_STATISTICS not defined in chconf.h" +#endif + +#if !defined(CH_DBG_SYSTEM_STATE_CHECK) +#error "CH_DBG_SYSTEM_STATE_CHECK not defined in chconf.h" +#endif + +#if !defined(CH_DBG_ENABLE_CHECKS) +#error "CH_DBG_ENABLE_CHECKS not defined in chconf.h" +#endif + +#if !defined(CH_DBG_ENABLE_ASSERTS) +#error "CH_DBG_ENABLE_ASSERTS not defined in chconf.h" +#endif + +#if !defined(CH_DBG_TRACE_MASK) +#error "CH_DBG_TRACE_MASK not defined in chconf.h" +#endif + +#if !defined(CH_DBG_TRACE_BUFFER_SIZE) +#error "CH_DBG_TRACE_BUFFER_SIZE not defined in chconf.h" +#endif + +#if !defined(CH_DBG_ENABLE_STACK_CHECK) +#error "CH_DBG_ENABLE_STACK_CHECK not defined in chconf.h" +#endif + +#if !defined(CH_DBG_FILL_THREADS) +#error "CH_DBG_FILL_THREADS not defined in chconf.h" +#endif + +#if !defined(CH_DBG_THREADS_PROFILING) +#error "CH_DBG_THREADS_PROFILING not defined in chconf.h" +#endif + +/* System hooks checks.*/ +#if !defined(CH_CFG_SYSTEM_INIT_HOOK) +#error "CH_CFG_SYSTEM_INIT_HOOK not defined in chconf.h" +#endif + +#if !defined(CH_CFG_SYSTEM_EXTRA_FIELDS) +#error "CH_CFG_SYSTEM_EXTRA_FIELDS not defined in chconf.h" +#endif + +#if !defined(CH_CFG_THREAD_EXTRA_FIELDS) +#error "CH_CFG_THREAD_EXTRA_FIELDS not defined in chconf.h" +#endif + +#if !defined(CH_CFG_THREAD_INIT_HOOK) +#error "CH_CFG_THREAD_INIT_HOOK not defined in chconf.h" +#endif + +#if !defined(CH_CFG_THREAD_EXIT_HOOK) +#error "CH_CFG_THREAD_EXIT_HOOK not defined in chconf.h" +#endif + +#if !defined(CH_CFG_CONTEXT_SWITCH_HOOK) +#error "CH_CFG_CONTEXT_SWITCH_HOOK not defined in chconf.h" +#endif + +#if !defined(CH_CFG_IRQ_PROLOGUE_HOOK) +#error "CH_CFG_IRQ_PROLOGUE_HOOK not defined in chconf.h" +#endif + +#if !defined(CH_CFG_IRQ_EPILOGUE_HOOK) +#error "CH_CFG_IRQ_EPILOGUE_HOOK not defined in chconf.h" +#endif + +#if !defined(CH_CFG_IDLE_ENTER_HOOK) +#error "CH_CFG_IDLE_ENTER_HOOK not defined in chconf.h" +#endif + +#if !defined(CH_CFG_IDLE_LEAVE_HOOK) +#error "CH_CFG_IDLE_LEAVE_HOOK not defined in chconf.h" +#endif + +#if !defined(CH_CFG_IDLE_LOOP_HOOK) +#error "CH_CFG_IDLE_LOOP_HOOK not defined in chconf.h" +#endif + +#if !defined(CH_CFG_SYSTEM_TICK_HOOK) +#error "CH_CFG_SYSTEM_TICK_HOOK not defined in chconf.h" +#endif + +#if !defined(CH_CFG_SYSTEM_HALT_HOOK) +#error "CH_CFG_SYSTEM_HALT_HOOK not defined in chconf.h" +#endif + +#if !defined(CH_CFG_TRACE_HOOK) +#error "CH_CFG_TRACE_HOOK not defined in chconf.h" +#endif + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ /*===========================================================================*/ /* Module data structures and types. */ diff --git a/os/rt/include/chrestrictions.h b/os/rt/include/chrestrictions.h new file mode 100644 index 000000000..2ada74ef4 --- /dev/null +++ b/os/rt/include/chrestrictions.h @@ -0,0 +1,106 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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; either version 3 of the License, or + (at your option) any later version. + + 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 . +*/ + +/** + * @file chrestrictions.h + * @brief Licensing restrictions header. + */ + +#ifndef CHRESTRICTIONS_H +#define CHRESTRICTIONS_H + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +#if CH_CUSTOMER_LIC_RT == FALSE +#error "ChibiOS/RT not licensed" +#endif + +#if (CH_LICENSE_FEATURES != CH_FEATURES_FULL) && \ + (CH_LICENSE_FEATURES != CH_FEATURES_INTERMEDIATE) && \ + (CH_LICENSE_FEATURES != CH_FEATURES_BASIC) +#error "invalid CH_LICENSE_FEATURES setting" +#endif + +/* Restrictions in basic and intermediate modes.*/ +#if (CH_LICENSE_FEATURES == CH_FEATURES_INTERMEDIATE) || \ + (CH_LICENSE_FEATURES == CH_FEATURES_BASIC) + +/* System tick limited to 1000hz.*/ +#if CH_CFG_ST_FREQUENCY > 1000 +#undef CH_CFG_ST_FREQUENCY +#define CH_CFG_ST_FREQUENCY 1000 +#endif + +/* Restricted subsystems.*/ +#undef CH_DBG_STATISTICS +#undef CH_DBG_TRACE_MASK + +#define CH_DBG_STATISTICS FALSE +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +#endif /* (CH_LICENSE_FEATURES == CH_FEATURES_INTERMEDIATE) || + (CH_LICENSE_FEATURES == CH_FEATURES_BASIC) */ + +/* Restrictions in basic mode.*/ +#if CH_LICENSE_FEATURES == CH_FEATURES_BASIC + +/* Tick-Less mode restricted.*/ +#undef CH_CFG_ST_TIMEDELTA +#define CH_CFG_ST_TIMEDELTA 0 + +/* Restricted subsystems.*/ +#undef CH_CFG_USE_TM +#undef CH_CFG_USE_MUTEXES +#undef CH_CFG_USE_CONDVARS +#undef CH_CFG_USE_DYNAMIC + +#define CH_CFG_USE_TM FALSE +#define CH_CFG_USE_MUTEXES FALSE +#define CH_CFG_USE_CONDVARS FALSE +#define CH_CFG_USE_DYNAMIC FALSE + +#endif /* CH_LICENSE_FEATURES == CH_FEATURES_BASIC */ + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +#endif /* CHRESTRICTIONS_H */ diff --git a/os/rt/include/chschd.h b/os/rt/include/chschd.h index 9d3b5dd4e..f62f6d709 100644 --- a/os/rt/include/chschd.h +++ b/os/rt/include/chschd.h @@ -114,18 +114,6 @@ /* Derived constants and error checks. */ /*===========================================================================*/ -#if !defined(CH_CFG_IDLE_ENTER_HOOK) -#error "CH_CFG_IDLE_ENTER_HOOK not defined in chconf.h" -#endif - -#if !defined(CH_CFG_IDLE_LEAVE_HOOK) -#error "CH_CFG_IDLE_LEAVE_HOOK not defined in chconf.h" -#endif - -#if !defined(CH_CFG_IDLE_LOOP_HOOK) -#error "CH_CFG_IDLE_LOOP_HOOK not defined in chconf.h" -#endif - /*===========================================================================*/ /* Module data structures and types. */ /*===========================================================================*/ @@ -438,6 +426,7 @@ struct ch_system { */ kernel_stats_t kernel_stats; #endif + CH_CFG_SYSTEM_EXTRA_FIELDS }; /*===========================================================================*/ diff --git a/os/rt/include/chsys.h b/os/rt/include/chsys.h index aa1bb0312..4e549db52 100644 --- a/os/rt/include/chsys.h +++ b/os/rt/include/chsys.h @@ -52,26 +52,6 @@ /* Derived constants and error checks. */ /*===========================================================================*/ -#if !defined(CH_CFG_IRQ_PROLOGUE_HOOK) -#error "CH_CFG_IRQ_PROLOGUE_HOOK not defined in chconf.h" -#endif - -#if !defined(CH_CFG_IRQ_EPILOGUE_HOOK) -#error "CH_CFG_IRQ_EPILOGUE_HOOK not defined in chconf.h" -#endif - -#if !defined(CH_CFG_CONTEXT_SWITCH_HOOK) -#error "CH_CFG_CONTEXT_SWITCH_HOOK not defined in chconf.h" -#endif - -#if !defined(CH_CFG_SYSTEM_TICK_HOOK) -#error "CH_CFG_SYSTEM_TICK_HOOK not defined in chconf.h" -#endif - -#if !defined(CH_CFG_SYSTEM_HALT_HOOK) -#error "CH_CFG_SYSTEM_HALT_HOOK not defined in chconf.h" -#endif - /*===========================================================================*/ /* Module data structures and types. */ /*===========================================================================*/ diff --git a/os/rt/include/chthreads.h b/os/rt/include/chthreads.h index ade7dc30b..c068544f6 100644 --- a/os/rt/include/chthreads.h +++ b/os/rt/include/chthreads.h @@ -38,18 +38,6 @@ /* Module pre-compile time settings. */ /*===========================================================================*/ -#if !defined(CH_CFG_THREAD_EXTRA_FIELDS) -#error "CH_CFG_THREAD_EXTRA_FIELDS not defined in chconf.h" -#endif - -#if !defined(CH_CFG_THREAD_INIT_HOOK) -#error "CH_CFG_THREAD_INIT_HOOK not defined in chconf.h" -#endif - -#if !defined(CH_CFG_THREAD_EXIT_HOOK) -#error "CH_CFG_THREAD_EXIT_HOOK not defined in chconf.h" -#endif - /*===========================================================================*/ /* Derived constants and error checks. */ /*===========================================================================*/ diff --git a/os/rt/include/chtrace.h b/os/rt/include/chtrace.h index 591a42fa7..46bd88987 100644 --- a/os/rt/include/chtrace.h +++ b/os/rt/include/chtrace.h @@ -92,10 +92,6 @@ /* Derived constants and error checks. */ /*===========================================================================*/ -#if !defined(CH_CFG_TRACE_HOOK) -#error "CH_CFG_TRACE_HOOK not defined in chconf.h" -#endif - /*===========================================================================*/ /* Module data structures and types. */ /*===========================================================================*/ diff --git a/os/rt/src/chsys.c b/os/rt/src/chsys.c index 034c3e85d..624c478ac 100644 --- a/os/rt/src/chsys.c +++ b/os/rt/src/chsys.c @@ -158,6 +158,9 @@ void chSysInit(void) { chTMStartMeasurementX(&currp->stats); #endif + /* Initialization hook.*/ + CH_CFG_SYSTEM_INIT_HOOK(); + /* It is alive now.*/ chSysEnable(); diff --git a/os/rt/templates/chconf.h b/os/rt/templates/chconf.h index 16b3144ed..7a5f367e1 100644 --- a/os/rt/templates/chconf.h +++ b/os/rt/templates/chconf.h @@ -491,6 +491,22 @@ */ /*===========================================================================*/ +/** + * @brief System structure extension. + * @details User fields added to the end of the @p ch_system_t structure. + */ +#define CH_CFG_SYSTEM_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief System initialization hook. + * @details User initialization code added to the @p chSysInit() function + * just before interrupts are enabled globally. + */ +#define CH_CFG_SYSTEM_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + /** * @brief Threads descriptor structure extension. * @details User fields added to the end of the @p thread_t structure. -- cgit v1.2.3