From 074e213e8f48ebb660af1531b7d116c497b1f444 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Tue, 13 Mar 2018 09:02:55 +0000 Subject: Unified OS Library header, preparation for separate subsystem. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11718 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- os/common/oslib/include/chlib.h | 184 ++++++++++++++++++++++++++++++++++ os/common/oslib/include/chpreempt.h | 106 -------------------- os/common/oslib/src/chpreempt.c | 153 ---------------------------- os/common/oslib/templates/chlibconf.h | 126 +++++++++++++++++++++++ os/nil/include/ch.h | 9 +- os/rt/include/ch.h | 12 +-- 6 files changed, 316 insertions(+), 274 deletions(-) create mode 100644 os/common/oslib/include/chlib.h delete mode 100644 os/common/oslib/include/chpreempt.h delete mode 100644 os/common/oslib/src/chpreempt.c create mode 100644 os/common/oslib/templates/chlibconf.h diff --git a/os/common/oslib/include/chlib.h b/os/common/oslib/include/chlib.h new file mode 100644 index 000000000..30ba56b72 --- /dev/null +++ b/os/common/oslib/include/chlib.h @@ -0,0 +1,184 @@ +/* + ChibiOS - Copyright (C) 2006..2018 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 chlib.h + * @brief ChibiOS/LIB main include file. + * @details This header includes all the required library headers. This file + * is meant do be included by @p ch.h not directly by user. + * + * @addtogroup library_info + * @details OS Library related info. + * @{ + */ + +#ifndef CHLIB_H +#define CHLIB_H + +/* Tmeporary hack.*/ +#if !defined(_CHIBIOS_RT_CONF_VER_5_0_) && !defined(_CHIBIOS_NIL_CONF_VER_3_0_) +#include "chlibconf.h" +#else +#define _CHIBIOS_LIB_CONF_ +#define _CHIBIOS_LIB_CONF_VER_1_0_ +#endif +#include "chlicense.h" + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/** + * @brief ChibiOS/LIB identification macro. + */ +#define _CHIBIOS_LIB_ + +/** + * @brief Stable release flag. + */ +#define CH_OSLIB_STABLE 0 + +/** + * @name ChibiOS/LIB version identification + * @{ + */ +/** + * @brief OS Library version string. + */ +#define CH_OSLIB_VERSION "1.0.0" + +/** + * @brief Kernel version major number. + */ +#define CH_OSLIB_MAJOR 1 + +/** + * @brief Kernel version minor number. + */ +#define CH_OSLIB_MINOR 0 + +/** + * @brief Kernel version patch number. + */ +#define CH_OSLIB_PATCH 0 +/** @} */ + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/* Host OS checks.*/ +#if !defined(_CHIBIOS_RT_) && !defined(_CHIBIOS_NIL_) +#error "OS check failed, must be included after ch.h" +#endif + +/* Configuration file checks.*/ +#if !defined(_CHIBIOS_LIB_CONF_) +#error "invalid configuration file" +#endif + +#if !defined(_CHIBIOS_LIB_CONF_VER_1_0_) +#error "obsolete or unknown configuration file" +#endif + +#if !defined(CH_CFG_USE_SEMAPHORES) +#error "CH_CFG_USE_SEMAPHORES not defined in chconf.h" +#endif + +#if !defined(CH_CFG_USE_MAILBOXES) +#error "CH_CFG_USE_MAILBOXES not defined in chlibconf.h" +#endif + +#if !defined(CH_CFG_USE_MEMCORE) +#error "CH_CFG_USE_MEMCORE not defined in chlibconf.h" +#endif + +#if !defined(CH_CFG_USE_HEAP) +#error "CH_CFG_USE_HEAP not defined in chlibconf.h" +#endif + +#if !defined(CH_CFG_USE_MEMPOOLS) +#error "CH_CFG_USE_MEMPOOLS not defined in chlibconf.h" +#endif + +#if !defined(CH_CFG_USE_OBJ_FIFOS) +#error "CH_CFG_USE_OBJ_FIFOS not defined in chlibconf.h" +#endif + +/* Objects factory options checks.*/ +#if !defined(CH_CFG_USE_FACTORY) +#error "CH_CFG_USE_FACTORY not defined in chlibconf.h" +#endif + +#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) +#error "CH_CFG_FACTORY_MAX_NAMES_LENGTH not defined in chlibconf.h" +#endif + +#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) +#error "CH_CFG_FACTORY_OBJECTS_REGISTRY not defined in chlibconf.h" +#endif + +#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) +#error "CH_CFG_FACTORY_GENERIC_BUFFERS not defined in chlibconf.h" +#endif + +#if !defined(CH_CFG_FACTORY_SEMAPHORES) +#error "CH_CFG_FACTORY_SEMAPHORES not defined in chlibconf.h" +#endif + +#if !defined(CH_CFG_FACTORY_MAILBOXES) +#error "CH_CFG_FACTORY_MAILBOXES not defined in chlibconf.h" +#endif + +#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) +#error "CH_CFG_FACTORY_OBJ_FIFOS not defined in chlibconf.h" +#endif + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Late inclusions. */ +/*===========================================================================*/ + +/* OS Library headers.*/ +#include "chbsem.h" +#include "chmboxes.h" +#include "chmemcore.h" +#include "chheap.h" +#include "chmempools.h" +#include "chfifo.h" +#include "chfactory.h" + +#endif /* CHLIB_H */ + +/** @} */ diff --git a/os/common/oslib/include/chpreempt.h b/os/common/oslib/include/chpreempt.h deleted file mode 100644 index 87e2a029a..000000000 --- a/os/common/oslib/include/chpreempt.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 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 chpreempt.h - * @brief Preemption enforcement structures and macros. - * - * @addtogroup preemption_enforcement - * @{ - */ - -#ifndef CHPREEMPT_H -#define CHPREEMPT_H - -/* This header is included from chconf.h and that can be included by asm - modules.*/ -#if !defined(_FROM_ASM_) - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/** - * @brief Hooks function @p chSchIsPreemptionRequired(). - */ -#define CH_SCH_IS_PREEMPTION_REQUIRED_HOOKED - -/** - * @brief Hooks function @p chSchDoReschedule(). - */ -#define CH_SCH_DO_RESCHEDULE_HOOKED - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if !defined(CH_CFG_ROUND_ROBIN_QUANTUM) -#error "CH_CFG_ROUND_ROBIN_QUANTUM not defined in chconf.h" -#endif - -#if CH_CFG_ROUND_ROBIN_QUANTUM <= 0 -#error "CH_CFG_ROUND_ROBIN_QUANTUM must be greater than zero" -#endif - -#if CH_CFG_TIME_QUANTUM > 0 -#error "CH_CFG_ROUND_ROBIN_QUANTUM is not compatible with CH_CFG_TIME_QUANTUM > 0" -#endif - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/** - * @brief Fields to be added to the @p ch_system_t structure. - * - * @notapi - */ -#define CH_PREEMPT_SYSTEM_FIELDS \ - virtual_timer_t preempt_vt; - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void ch_preempt_system_init(void); - void ch_preempt_thread_switch(void); -#ifdef __cplusplus -} -#endif - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -#endif /* !defined(_FROM_ASM_) */ - -#endif /* CHPREEMPT_H */ - -/** @} */ diff --git a/os/common/oslib/src/chpreempt.c b/os/common/oslib/src/chpreempt.c deleted file mode 100644 index 2cdb94efe..000000000 --- a/os/common/oslib/src/chpreempt.c +++ /dev/null @@ -1,153 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2018 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 chpreempt.c - * @brief Preemption enforcement code. - * - * @addtogroup preemption_enforcement - * @details This modules export hook macros required for implementing - * a preemptive round robin mode for threads at the same priority - * level.
- * This method is alternative to the ChibiOS/RT native implementation - * which is not compatible with the tick-less mode, however, this - * timers-based solution can decrease threads context-switch - * performance because the added overhead. - * @note This file is not included automatically by @p ch.h, you need - * to: - * - Define @p CH_CFG_ROUND_ROBIN_QUANTUM in chconf.h. It is the - * time quantum in ticks. - * - Include @p chpreempt.h from @p chconf.h. - * - Add all the macros and functions to the appropriate hooks in - * chconf.h. - * - Explicitely add @p chpreempt.c to your makefile. - * . - */ - -#include "ch.h" - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local functions. */ -/*===========================================================================*/ - -static void preempt_cb(void *p) { - - (void)p; -} - -/*===========================================================================*/ -/* Module exported functions. */ -/*===========================================================================*/ - -/** - * @brief Hook code for system initialization. - * - * @notapi - */ -void ch_preempt_system_init(void) { - - chVTObjectInit(&ch.preempt_vt); -} - -/** - * @brief Hook code for context switch. - * - * @notapi - */ -void ch_preempt_thread_switch(void) { - - chVTSetI(&ch.preempt_vt, CH_CFG_ROUND_ROBIN_QUANTUM, preempt_cb, NULL); -} - -/** - * @brief Evaluates if preemption is required. - * @details The decision is taken by comparing the relative priorities and - * depending on the state of the round robin timeout counter. - * @note Not a user function, it is meant to be invoked by the scheduler - * itself or from within the port layer. - * - * @retval true if there is a thread that must go in running state - * immediately. - * @retval false if preemption is not required. - * - * @special - */ -bool chSchIsPreemptionRequired(void) { - tprio_t p1 = firstprio(&ch.rlist.queue); - tprio_t p2 = currp->prio; - - /* If the running thread has not reached its time quantum, reschedule only - if the first thread on the ready queue has a higher priority. - Otherwise, if the running thread has used up its time quantum, reschedule - if the first thread on the ready queue has equal or higher priority.*/ - return chVTIsArmedI(&ch.preempt_vt) ? (p1 > p2) : (p1 >= p2); -} -/** - * @brief Switches to the first thread on the runnable queue. - * @details The current thread is positioned in the ready list behind or - * ahead of all threads having the same priority depending on - * if it used its whole time slice. - * @note Not a user function, it is meant to be invoked by the scheduler - * itself or from within the port layer. - * - * @special - */ -void chSchDoReschedule(void) { - thread_t *otp = currp; - - /* Picks the first thread from the ready queue and makes it current.*/ - currp = queue_fifo_remove(&ch.rlist.queue); - currp->state = CH_STATE_CURRENT; - - /* Handling idle-leave hook.*/ - if (otp->prio == IDLEPRIO) { - CH_CFG_IDLE_LEAVE_HOOK(); - } - - /* There are two different scenarios to handle on preemption: time quantum - elapsed or not.*/ - if (!chVTIsArmedI(&ch.preempt_vt)) { - - /* The thread consumed its time quantum so it is enqueued behind threads - with same priority level, however, it acquires a new time quantum.*/ - otp = chSchReadyI(otp); - } - else { - /* The thread didn't consume all its time quantum so it is put ahead of - threads with equal priority and does not acquire a new time quantum.*/ - otp = chSchReadyAheadI(otp); - } - - /* Swap operation as tail call.*/ - chSysSwitch(currp, otp); -} - -/** @} */ diff --git a/os/common/oslib/templates/chlibconf.h b/os/common/oslib/templates/chlibconf.h new file mode 100644 index 000000000..e51397e19 --- /dev/null +++ b/os/common/oslib/templates/chlibconf.h @@ -0,0 +1,126 @@ +/* + ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/chlibconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup oslib_config + * @details OS Library related settings. + * @{ + */ + +#ifndef CHLIBCONF_H +#define CHLIBCONF_H + +#define _CHIBIOS_LIB_CONF_ +#define _CHIBIOS_LIB_CONF_VER_1_0_ + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES in chconf.h. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES in chconf.h. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS TRUE + +/** + * @brief Objects FIFOs APIs. + * @details If enabled then the objects FIFOs APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_OBJ_FIFOS TRUE + +/** + * @brief Objects Factory APIs. + * @details If enabled then the objects factory APIs are included in the + * kernel. + * + * @note The default is @p FALSE. + */ +#define CH_CFG_USE_FACTORY TRUE + +/** + * @brief Maximum length for object names. + * @details If the specified length is zero then the name is stored by + * pointer but this could have unintended side effects. + */ +#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 + +/** + * @brief Enables the registry of generic objects. + */ +#define CH_CFG_FACTORY_OBJECTS_REGISTRY TRUE + +/** + * @brief Enables factory for generic buffers. + */ +#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE + +/** + * @brief Enables factory for semaphores. + */ +#define CH_CFG_FACTORY_SEMAPHORES TRUE + +/** + * @brief Enables factory for mailboxes. + */ +#define CH_CFG_FACTORY_MAILBOXES TRUE + +/** + * @brief Enables factory for objects FIFOs. + */ +#define CH_CFG_FACTORY_OBJ_FIFOS TRUE + +#endif /* CHLIBCONF_H */ + +/** @} */ diff --git a/os/nil/include/ch.h b/os/nil/include/ch.h index 75c154568..06620573a 100644 --- a/os/nil/include/ch.h +++ b/os/nil/include/ch.h @@ -1556,13 +1556,8 @@ extern "C" { } #endif -/* Optional subsystems.*/ -#include "chmboxes.h" -#include "chmemcore.h" -#include "chheap.h" -#include "chmempools.h" -#include "chfifo.h" -#include "chfactory.h" +/* OSLIB.*/ +#include "chlib.h" #endif /* CH_H */ diff --git a/os/rt/include/ch.h b/os/rt/include/ch.h index 3c7cc16d1..a4b6eb257 100644 --- a/os/rt/include/ch.h +++ b/os/rt/include/ch.h @@ -119,19 +119,15 @@ extern "C" { /* Optional subsystems headers.*/ #include "chregistry.h" #include "chsem.h" -#include "chbsem.h" #include "chmtx.h" #include "chcond.h" #include "chevents.h" #include "chmsg.h" -/* OSLIB headers.*/ -#include "chmboxes.h" -#include "chmemcore.h" -#include "chheap.h" -#include "chmempools.h" -#include "chfifo.h" -#include "chfactory.h" +/* OSLIB.*/ +#include "chlib.h" + +/* Headers dependent on the OSLIB.*/ #include "chdynamic.h" #endif /* CH_H */ -- cgit v1.2.3