git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7812 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
36e66ea4f7
commit
168c39a1b2
|
@ -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_ */
|
||||
|
||||
/** @} */
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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. */
|
||||
/*===========================================================================*/
|
||||
|
|
Loading…
Reference in New Issue