aboutsummaryrefslogtreecommitdiffstats
path: root/src/chsys.c
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2009-01-05 11:47:59 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2009-01-05 11:47:59 +0000
commita2ebdce0c7f7c2b6fe6089080caaf0cc17d5db89 (patch)
tree5d19dd2fb15de7d2cab49217a8b969886f54a289 /src/chsys.c
parentbb5acac94d079e107f8faa4bb6b2e5d1389c40d4 (diff)
downloadChibiOS-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.c106
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 */
+
+/** @} */