git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7812 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
Giovanni Di Sirio 2015-03-26 14:04:08 +00:00
parent 36e66ea4f7
commit 168c39a1b2
3 changed files with 179 additions and 16 deletions

View File

@ -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_ */
/** @} */

View File

@ -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);
return MSG_OK;
vtSetI(&vt, timeout, callback_timeout, (void *)trp);
msg = osalThreadSuspendS(trp);
if (vtIsArmedI(&vt))
vtResetI(&vt);
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;
return MSG_OK;
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;
}
/**
@ -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);
}
/**

View File

@ -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. */
/*===========================================================================*/