From 168c39a1b2a5514488c8b62ca1a6e36405fc3087 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Thu, 26 Mar 2015 14:04:08 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7812 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/STM32/HAL-STM32F407-DISCOVERY/osalconf.h | 67 +++++++++++++++++ os/hal/osal/os-less/ARMCMx/osal.c | 100 ++++++++++++++++++++++--- os/hal/osal/os-less/ARMCMx/osal.h | 28 +++++-- 3 files changed, 179 insertions(+), 16 deletions(-) create mode 100644 demos/STM32/HAL-STM32F407-DISCOVERY/osalconf.h 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 @@ -56,6 +56,31 @@ virtual_timers_list_t vtlist; /* Module local functions. */ /*===========================================================================*/ +/** + * @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 @@ -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. */ /*===========================================================================*/ @@ -88,11 +90,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. */ @@ -122,6 +119,13 @@ /* Module pre-compile time settings. */ /*===========================================================================*/ +/** + * @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. */ @@ -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. */ /*===========================================================================*/ -- cgit v1.2.3