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
This commit is contained in:
Giovanni Di Sirio 2018-03-13 09:02:55 +00:00
parent d150be256b
commit 074e213e8f
6 changed files with 316 additions and 274 deletions

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/**
* @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 */
/** @} */

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/**
* @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 */
/** @} */

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/**
* @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.<br>
* 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);
}
/** @} */

View File

@ -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 */
/** @} */

View File

@ -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 */

View File

@ -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 */