From a2ebdce0c7f7c2b6fe6089080caaf0cc17d5db89 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Mon, 5 Jan 2009 11:47:59 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@580 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- src/chinit.c | 106 ------------------------------------------------------ src/chsys.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/include/ch.h | 10 +----- src/include/sys.h | 81 +++++++++++++++++++++++++++++++++++++++++ src/kernel.mk | 2 +- 5 files changed, 189 insertions(+), 116 deletions(-) delete mode 100644 src/chinit.c create mode 100644 src/chsys.c create mode 100644 src/include/sys.h diff --git a/src/chinit.c b/src/chinit.c deleted file mode 100644 index 613e7bfeb..000000000 --- a/src/chinit.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT 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/RT 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 . -*/ - -/** - * @addtogroup Initialization - * @{ - */ - -#include - -/** - * ChibiOS/RT initialization. After executing this function the current - * instructions stream becomes the main thread. - * @note Interrupts should be still disabled when \p chSysInit() is invoked - * and are internally enabled. - * @note The main thread is created with priority \p NORMALPRIO. - */ -void chSysInit(void) { - static Thread mainthread; - static WORKING_AREA(idle_wa, IDLE_THREAD_STACK_SIZE); - - chSchInit(); - chDbgInit(); - chVTInit(); -#ifdef CH_USE_HEAP - chHeapInit(); -#endif - /* - * Now this instructions flow becomes the main thread. - */ - (currp = init_thread(&mainthread, NORMALPRIO))->p_state = PRCURR; - - chSysEnable(); - - /* - * The idle thread is created using the port-provided implementation. - * This thread has the lowest priority in the system, its role is just to - * serve interrupts in its context while keeping the lowest energy saving - * mode compatible with the system status. - */ - chThdCreateStatic(idle_wa, sizeof(idle_wa), IDLEPRIO, (tfunc_t)_idle, NULL); -} - -/** - * Handles time ticks for round robin preemption and timer increments. - * Decrements the remaining time quantum of the running thread and preempts - * it when the quantum is used up. Increments system time and manages the - * timers. - * @note The frequency of the timer determines the system tick granularity and, - * together with the \p CH_TIME_QUANTUM macro, the round robin interval. - */ -void chSysTimerHandlerI(void) { - -#ifdef CH_USE_ROUNDROBIN - /* running thread has not used up quantum yet? */ - if (rlist.r_preempt > 0) - /* decrement remaining quantum */ - rlist.r_preempt--; -#endif - chVTDoTickI(); -} - -#if !defined(CH_OPTIMIZE_SPEED) -/** - * Enters the ChibiOS/RT system mutual exclusion zone. - * @note The use of system mutual exclusion zone is not recommended in - * the user code, it is a better idea to use the semaphores or mutexes - * instead. - * @see CH_USE_NESTED_LOCKS - */ -void chSysLock(void) { - - chSysLockInline(); -} - -/** - * Leaves the ChibiOS/RT system mutual exclusion zone. - * @note The use of system mutual exclusion zone is not recommended in - * the user code, it is a better idea to use the semaphores or mutexes - * instead. - * @see CH_USE_NESTED_LOCKS - */ -void chSysUnlock(void) { - - chDbgAssert(currp->p_locks > 0, "chinit.c, chSysUnlock()"); - chSysUnlockInline(); -} -#endif /* !CH_OPTIMIZE_SPEED */ - -/** @} */ diff --git a/src/chsys.c b/src/chsys.c new file mode 100644 index 000000000..613e7bfeb --- /dev/null +++ b/src/chsys.c @@ -0,0 +1,106 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT 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/RT 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 . +*/ + +/** + * @addtogroup Initialization + * @{ + */ + +#include + +/** + * ChibiOS/RT initialization. After executing this function the current + * instructions stream becomes the main thread. + * @note Interrupts should be still disabled when \p chSysInit() is invoked + * and are internally enabled. + * @note The main thread is created with priority \p NORMALPRIO. + */ +void chSysInit(void) { + static Thread mainthread; + static WORKING_AREA(idle_wa, IDLE_THREAD_STACK_SIZE); + + chSchInit(); + chDbgInit(); + chVTInit(); +#ifdef CH_USE_HEAP + chHeapInit(); +#endif + /* + * Now this instructions flow becomes the main thread. + */ + (currp = init_thread(&mainthread, NORMALPRIO))->p_state = PRCURR; + + chSysEnable(); + + /* + * The idle thread is created using the port-provided implementation. + * This thread has the lowest priority in the system, its role is just to + * serve interrupts in its context while keeping the lowest energy saving + * mode compatible with the system status. + */ + chThdCreateStatic(idle_wa, sizeof(idle_wa), IDLEPRIO, (tfunc_t)_idle, NULL); +} + +/** + * Handles time ticks for round robin preemption and timer increments. + * Decrements the remaining time quantum of the running thread and preempts + * it when the quantum is used up. Increments system time and manages the + * timers. + * @note The frequency of the timer determines the system tick granularity and, + * together with the \p CH_TIME_QUANTUM macro, the round robin interval. + */ +void chSysTimerHandlerI(void) { + +#ifdef CH_USE_ROUNDROBIN + /* running thread has not used up quantum yet? */ + if (rlist.r_preempt > 0) + /* decrement remaining quantum */ + rlist.r_preempt--; +#endif + chVTDoTickI(); +} + +#if !defined(CH_OPTIMIZE_SPEED) +/** + * Enters the ChibiOS/RT system mutual exclusion zone. + * @note The use of system mutual exclusion zone is not recommended in + * the user code, it is a better idea to use the semaphores or mutexes + * instead. + * @see CH_USE_NESTED_LOCKS + */ +void chSysLock(void) { + + chSysLockInline(); +} + +/** + * Leaves the ChibiOS/RT system mutual exclusion zone. + * @note The use of system mutual exclusion zone is not recommended in + * the user code, it is a better idea to use the semaphores or mutexes + * instead. + * @see CH_USE_NESTED_LOCKS + */ +void chSysUnlock(void) { + + chDbgAssert(currp->p_locks > 0, "chinit.c, chSysUnlock()"); + chSysUnlockInline(); +} +#endif /* !CH_OPTIMIZE_SPEED */ + +/** @} */ diff --git a/src/include/ch.h b/src/include/ch.h index 0c3eb2a64..82348a044 100644 --- a/src/include/ch.h +++ b/src/include/ch.h @@ -54,6 +54,7 @@ #include #include "lists.h" #include +#include "sys.h" #include "vt.h" #include "scheduler.h" #include "semaphores.h" @@ -79,15 +80,6 @@ #define TRUE (!FALSE) #endif -#ifdef __cplusplus -extern "C" { -#endif - void chSysInit(void); - void chSysTimerHandlerI(void); -#ifdef __cplusplus -} -#endif - #endif /* _CH_H_ */ /** @} */ diff --git a/src/include/sys.h b/src/include/sys.h new file mode 100644 index 000000000..8765c8d49 --- /dev/null +++ b/src/include/sys.h @@ -0,0 +1,81 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT 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/RT 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 . +*/ + +/** + * @addtogroup Core + * @{ + */ + +#ifndef _SYS_H_ +#define _SYS_H_ + +#if defined(CH_USE_REENTRANT_LOCKS) || defined(_DOXYGEN_) +/** + * Enters the ChibiOS/RT system mutual exclusion zone. + * @note The use of system mutual exclusion zone is not recommended in + * the user code, it is a better idea to use the semaphores or mutexes + * instead. + * @note The code of this API is always inlined regardless the + * @p CH_OPTIMIZE_SPEED setting. This function is meant to be used in + * places where the performance is always preferred. + * @see CH_USE_NESTED_LOCKS + */ +#define chSysLockInline() { \ + if (currp->p_locks == 0) { \ + currp->p_locks++; \ + sys_disable(); \ + } \ +} + +/** + * Leaves the ChibiOS/RT system mutual exclusion zone. + * @note The use of system mutual exclusion zone is not recommended in + * the user code, it is a better idea to use the semaphores or mutexes + * instead. + * @note The code of this API is always inlined regardless the + * @p CH_OPTIMIZE_SPEED setting. This function is meant to be used in + * places where the performance is always preferred. + * @see CH_USE_NESTED_LOCKS + */ +#define chSysUnlockInline() { \ + if (--currp->p_locks == 0) \ + sys_enable(); \ +} +#else /* defined(CH_USE_REENTRANT_LOCKS) || defined(_DOXYGEN_) */ +#define chSysLockInline() sys_disable() +#define chSysUnlockInline() sys_enable() +#endif /* !defined(CH_USE_REENTRANT_LOCKS) && !defined(_DOXYGEN_) */ + +#if defined(CH_OPTIMIZE_SPEED) +#define chSysLock() chSysLockInline() +#define chSysUnlock chSysUnlockInline() +#endif /* defined(CH_OPTIMIZE_SPEED) */ + +#ifdef __cplusplus +extern "C" { +#endif + void chSysInit(void); + void chSysTimerHandlerI(void); +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_H_ */ + +/** @} */ diff --git a/src/kernel.mk b/src/kernel.mk index 75ab83d93..2a178897b 100644 --- a/src/kernel.mk +++ b/src/kernel.mk @@ -1,6 +1,6 @@ # List of all the ChibiOS/RT kernel files, there is no need to remove the files # from this list, you can disable parts of the kernel by editing chconf.h. -KERNSRC = ../../src/chinit.c ../../src/chdebug.c \ +KERNSRC = ../../src/chsys.c ../../src/chdebug.c \ ../../src/chlists.c ../../src/chvt.c \ ../../src/chschd.c ../../src/chthreads.c \ ../../src/chsem.c ../../src/chmtx.c \ -- cgit v1.2.3