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. */
|
/* 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.
|
* @brief Virtual timers ticker.
|
||||||
* @note The system lock is released before entering the callback and
|
* @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;
|
vtp->vt_func = (vtfunc_t)NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void callback_timeout(void *p) {
|
||||||
|
osalSysLockFromISR();
|
||||||
|
osalThreadResumeI((thread_reference_t *)p, MSG_TIMEOUT);
|
||||||
|
osalSysUnlockFromISR();
|
||||||
|
}
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Module exported functions. */
|
/* Module exported functions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -150,6 +182,9 @@ static void vtResetI(virtual_timer_t *vtp) {
|
||||||
*/
|
*/
|
||||||
void osalInit(void) {
|
void osalInit(void) {
|
||||||
|
|
||||||
|
vtInit();
|
||||||
|
|
||||||
|
OSAL_INIT_HOOK();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -241,8 +276,12 @@ systime_t osalOsGetSystemTimeX(void) {
|
||||||
* @sclass
|
* @sclass
|
||||||
*/
|
*/
|
||||||
void osalThreadSleepS(systime_t time) {
|
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 osalThreadSleep(systime_t time) {
|
||||||
|
|
||||||
(void)time;
|
osalSysLock();
|
||||||
|
osalThreadSleepS(time);
|
||||||
|
osalSysUnlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -273,10 +314,20 @@ void osalThreadSleep(systime_t time) {
|
||||||
* @sclass
|
* @sclass
|
||||||
*/
|
*/
|
||||||
msg_t osalThreadSuspendS(thread_reference_t *trp) {
|
msg_t osalThreadSuspendS(thread_reference_t *trp) {
|
||||||
|
thread_t self = {MSG_WAIT};
|
||||||
|
|
||||||
osalDbgCheck(trp != NULL);
|
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
|
* @sclass
|
||||||
*/
|
*/
|
||||||
msg_t osalThreadSuspendTimeoutS(thread_reference_t *trp, systime_t timeout) {
|
msg_t osalThreadSuspendTimeoutS(thread_reference_t *trp, systime_t timeout) {
|
||||||
|
msg_t msg;
|
||||||
|
virtual_timer_t vt;
|
||||||
|
|
||||||
osalDbgCheck(trp != NULL);
|
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);
|
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);
|
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
|
* @sclass
|
||||||
*/
|
*/
|
||||||
msg_t osalThreadEnqueueTimeoutS(threads_queue_t *tqp, systime_t timeout) {
|
msg_t osalThreadEnqueueTimeoutS(threads_queue_t *tqp, systime_t timeout) {
|
||||||
|
msg_t msg;
|
||||||
|
virtual_timer_t vt;
|
||||||
|
|
||||||
osalDbgCheck(tqp != NULL);
|
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);
|
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);
|
osalDbgCheck(tqp != NULL);
|
||||||
|
|
||||||
(void)msg;
|
osalThreadResumeI(&tqp->tr, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -31,6 +31,8 @@
|
||||||
|
|
||||||
#include "cmparams.h"
|
#include "cmparams.h"
|
||||||
|
|
||||||
|
#include "osalconf.h"
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Module constants. */
|
/* Module constants. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -88,11 +90,6 @@
|
||||||
*/
|
*/
|
||||||
#define OSAL_ST_RESOLUTION 32
|
#define OSAL_ST_RESOLUTION 32
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Required systick frequency or resolution.
|
|
||||||
*/
|
|
||||||
#define OSAL_ST_FREQUENCY 1000
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Systick mode required by the underlying OS.
|
* @brief Systick mode required by the underlying OS.
|
||||||
*/
|
*/
|
||||||
|
@ -122,6 +119,13 @@
|
||||||
/* Module pre-compile time settings. */
|
/* 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.
|
* @brief Enables OSAL assertions.
|
||||||
*/
|
*/
|
||||||
|
@ -136,6 +140,20 @@
|
||||||
#define OSAL_DBG_ENABLE_CHECKS FALSE
|
#define OSAL_DBG_ENABLE_CHECKS FALSE
|
||||||
#endif
|
#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. */
|
/* Derived constants and error checks. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
Loading…
Reference in New Issue