diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2009-01-05 11:47:59 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2009-01-05 11:47:59 +0000 |
commit | a2ebdce0c7f7c2b6fe6089080caaf0cc17d5db89 (patch) | |
tree | 5d19dd2fb15de7d2cab49217a8b969886f54a289 /src/chsys.c | |
parent | bb5acac94d079e107f8faa4bb6b2e5d1389c40d4 (diff) | |
download | ChibiOS-a2ebdce0c7f7c2b6fe6089080caaf0cc17d5db89.tar.gz ChibiOS-a2ebdce0c7f7c2b6fe6089080caaf0cc17d5db89.tar.bz2 ChibiOS-a2ebdce0c7f7c2b6fe6089080caaf0cc17d5db89.zip |
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@580 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'src/chsys.c')
-rw-r--r-- | src/chsys.c | 106 |
1 files changed, 106 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>. +*/ + +/** + * @addtogroup Initialization + * @{ + */ + +#include <ch.h> + +/** + * 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 */ + +/** @} */ |