aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--demos/STM32/HAL-STM32F407-DISCOVERY/osalconf.h67
-rw-r--r--os/hal/osal/os-less/ARMCMx/osal.c100
-rw-r--r--os/hal/osal/os-less/ARMCMx/osal.h28
3 files changed, 179 insertions, 16 deletions
diff --git a/demos/STM32/HAL-STM32F407-DISCOVERY/osalconf.h b/demos/STM32/HAL-STM32F407-DISCOVERY/osalconf.h
new file mode 100644
index 000000000..ed7d75ddf
--- /dev/null
+++ b/demos/STM32/HAL-STM32F407-DISCOVERY/osalconf.h
@@ -0,0 +1,67 @@
+/*
+ ChibiOS - Copyright (C) 2006..2015 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/halconf.h
+ * @brief Bare-metal OSAL configuration header.
+ *
+ * @addtogroup OSAL_CONF
+ * @{
+ */
+
+#ifndef _OSALCONF_H_
+#define _OSALCONF_H_
+
+/**
+ * @brief Frequency in Hertz of the system tick.
+ */
+#if !defined(OSAL_ST_FREQUENCY) || defined(__DOXYGEN__)
+#define OSAL_ST_FREQUENCY 1000
+#endif
+
+/**
+ * @brief Enables OSAL assertions.
+ */
+#if !defined(OSAL_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__)
+#define OSAL_DBG_ENABLE_ASSERTS FALSE
+#endif
+
+/**
+ * @brief Enables OSAL functions parameters checks.
+ */
+#if !defined(OSAL_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__)
+#define OSAL_DBG_ENABLE_CHECKS FALSE
+#endif
+
+/**
+ * @brief OSAL initialization hook.
+ */
+#if !defined(OSAL_INIT_HOOK) || defined(__DOXYGEN__)
+#define OSAL_INIT_HOOK() { \
+}
+#endif
+
+/**
+ * @brief Idle loop hook macro.
+ */
+#if !defined(OSAL_IDLE_HOOK) || defined(__DOXYGEN__)
+#define OSAL_IDLE_HOOK() { \
+}
+#endif
+
+#endif /* _OSALCONF_H_ */
+
+/** @} */
diff --git a/os/hal/osal/os-less/ARMCMx/osal.c b/os/hal/osal/os-less/ARMCMx/osal.c
index 6273bb874..390b779a8 100644
--- a/os/hal/osal/os-less/ARMCMx/osal.c
+++ b/os/hal/osal/os-less/ARMCMx/osal.c
@@ -57,6 +57,31 @@ virtual_timers_list_t vtlist;
/*===========================================================================*/
/**
+ * @brief Timers initialization.
+ *
+ * @notapi
+ */
+static void vtInit(void) {
+
+ /* Virtual Timers initialization.*/
+ vtlist.vt_next = vtlist.vt_prev = (void *)&vtlist;
+ vtlist.vt_time = (systime_t)-1;
+ vtlist.vt_systime = 0;
+}
+
+/**
+ * @brief Returns @p TRUE if the specified timer is armed.
+ *
+ * @param[out] vtp the @p virtual_timer_t structure pointer
+ *
+ * @notapi
+ */
+static bool vtIsArmedI(virtual_timer_t *vtp) {
+
+ return vtp->vt_func != NULL;
+}
+
+/**
* @brief Virtual timers ticker.
* @note The system lock is released before entering the callback and
* re-acquired immediately after. It is callback's responsibility
@@ -139,6 +164,13 @@ static void vtResetI(virtual_timer_t *vtp) {
vtp->vt_func = (vtfunc_t)NULL;
}
+
+static void callback_timeout(void *p) {
+ osalSysLockFromISR();
+ osalThreadResumeI((thread_reference_t *)p, MSG_TIMEOUT);
+ osalSysUnlockFromISR();
+}
+
/*===========================================================================*/
/* Module exported functions. */
/*===========================================================================*/
@@ -150,6 +182,9 @@ static void vtResetI(virtual_timer_t *vtp) {
*/
void osalInit(void) {
+ vtInit();
+
+ OSAL_INIT_HOOK();
}
/**
@@ -241,8 +276,12 @@ systime_t osalOsGetSystemTimeX(void) {
* @sclass
*/
void osalThreadSleepS(systime_t time) {
+ virtual_timer_t vt;
+ thread_reference_t tr;
- (void)time;
+ tr = NULL;
+ vtSetI(&vt, time, callback_timeout, (void *)&tr);
+ osalThreadSuspendS(&tr);
}
/**
@@ -259,7 +298,9 @@ void osalThreadSleepS(systime_t time) {
*/
void osalThreadSleep(systime_t time) {
- (void)time;
+ osalSysLock();
+ osalThreadSleepS(time);
+ osalSysUnlock();
}
/**
@@ -273,10 +314,20 @@ void osalThreadSleep(systime_t time) {
* @sclass
*/
msg_t osalThreadSuspendS(thread_reference_t *trp) {
+ thread_t self = {MSG_WAIT};
osalDbgCheck(trp != NULL);
- return MSG_OK;
+ *trp = &self;
+ while (self.message == MSG_WAIT) {
+ osalSysUnlock();
+ /* A state-changing interrupt could occur here and cause the loop to
+ terminate, an hook macro is executed while waiting.*/
+ OSAL_IDLE_HOOK();
+ osalSysLock();
+ }
+
+ return self.message;
}
/**
@@ -299,12 +350,20 @@ msg_t osalThreadSuspendS(thread_reference_t *trp) {
* @sclass
*/
msg_t osalThreadSuspendTimeoutS(thread_reference_t *trp, systime_t timeout) {
+ msg_t msg;
+ virtual_timer_t vt;
osalDbgCheck(trp != NULL);
- (void)timeout;
+ if (TIME_INFINITE == timeout)
+ return osalThreadSuspendS(trp);
+
+ vtSetI(&vt, timeout, callback_timeout, (void *)trp);
+ msg = osalThreadSuspendS(trp);
+ if (vtIsArmedI(&vt))
+ vtResetI(&vt);
- return MSG_OK;
+ return msg;
}
/**
@@ -321,7 +380,10 @@ void osalThreadResumeI(thread_reference_t *trp, msg_t msg) {
osalDbgCheck(trp != NULL);
- (void)msg;
+ if (*trp != NULL) {
+ (*trp)->message = msg;
+ *trp = NULL;
+ }
}
/**
@@ -338,7 +400,10 @@ void osalThreadResumeS(thread_reference_t *trp, msg_t msg) {
osalDbgCheck(trp != NULL);
- (void)msg;
+ if (*trp != NULL) {
+ (*trp)->message = msg;
+ *trp = NULL;
+ }
}
/**
@@ -365,12 +430,25 @@ void osalThreadResumeS(thread_reference_t *trp, msg_t msg) {
* @sclass
*/
msg_t osalThreadEnqueueTimeoutS(threads_queue_t *tqp, systime_t timeout) {
+ msg_t msg;
+ virtual_timer_t vt;
osalDbgCheck(tqp != NULL);
- (void)timeout;
+ if (TIME_IMMEDIATE == timeout)
+ return MSG_TIMEOUT;
+
+ tqp->tr = NULL;
+
+ if (TIME_INFINITE == timeout)
+ return osalThreadSuspendS(&tqp->tr);
+
+ vtSetI(&vt, timeout, callback_timeout, (void *)&tqp->tr);
+ msg = osalThreadSuspendS(&tqp->tr);
+ if (vtIsArmedI(&vt))
+ vtResetI(&vt);
- return MSG_OK;
+ return msg;
}
/**
@@ -385,7 +463,7 @@ void osalThreadDequeueNextI(threads_queue_t *tqp, msg_t msg) {
osalDbgCheck(tqp != NULL);
- (void)msg;
+ osalThreadResumeI(&tqp->tr, msg);
}
/**
@@ -400,7 +478,7 @@ void osalThreadDequeueAllI(threads_queue_t *tqp, msg_t msg) {
osalDbgCheck(tqp != NULL);
- (void)msg;
+ osalThreadResumeI(&tqp->tr, msg);
}
/**
diff --git a/os/hal/osal/os-less/ARMCMx/osal.h b/os/hal/osal/os-less/ARMCMx/osal.h
index bb030c4f5..66cb594a5 100644
--- a/os/hal/osal/os-less/ARMCMx/osal.h
+++ b/os/hal/osal/os-less/ARMCMx/osal.h
@@ -31,6 +31,8 @@
#include "cmparams.h"
+#include "osalconf.h"
+
/*===========================================================================*/
/* Module constants. */
/*===========================================================================*/
@@ -89,11 +91,6 @@
#define OSAL_ST_RESOLUTION 32
/**
- * @brief Required systick frequency or resolution.
- */
-#define OSAL_ST_FREQUENCY 1000
-
-/**
* @brief Systick mode required by the underlying OS.
*/
#define OSAL_ST_MODE OSAL_ST_MODE_PERIODIC
@@ -123,6 +120,13 @@
/*===========================================================================*/
/**
+ * @brief Frequency in Hertz of the system tick.
+ */
+#if !defined(OSAL_ST_FREQUENCY) || defined(__DOXYGEN__)
+#define OSAL_ST_FREQUENCY 1000
+#endif
+
+/**
* @brief Enables OSAL assertions.
*/
#if !defined(OSAL_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__)
@@ -136,6 +140,20 @@
#define OSAL_DBG_ENABLE_CHECKS FALSE
#endif
+/**
+ * @brief OSAL initialization hook.
+ */
+#if !defined(OSAL_INIT_HOOK) || defined(__DOXYGEN__)
+#define OSAL_INIT_HOOK()
+#endif
+
+/**
+ * @brief Idle loop hook macro.
+ */
+#if !defined(OSAL_IDLE_HOOK) || defined(__DOXYGEN__)
+#define OSAL_IDLE_HOOK()
+#endif
+
/*===========================================================================*/
/* Derived constants and error checks. */
/*===========================================================================*/