aboutsummaryrefslogtreecommitdiffstats
path: root/os/kernel/include/chvt.h
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2012-02-08 17:53:52 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2012-02-08 17:53:52 +0000
commit18b8b495244411bb33254ea0d8b868259077be7d (patch)
treebe8ecfe583b4de2ad67d2b2196cabf8992e87d13 /os/kernel/include/chvt.h
parent6894617b8ebc8453a1ed5e672fb225d0c4f2f51b (diff)
downloadChibiOS-18b8b495244411bb33254ea0d8b868259077be7d.tar.gz
ChibiOS-18b8b495244411bb33254ea0d8b868259077be7d.tar.bz2
ChibiOS-18b8b495244411bb33254ea0d8b868259077be7d.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3946 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/kernel/include/chvt.h')
-rw-r--r--os/kernel/include/chvt.h88
1 files changed, 68 insertions, 20 deletions
diff --git a/os/kernel/include/chvt.h b/os/kernel/include/chvt.h
index 95fb16408..355f66064 100644
--- a/os/kernel/include/chvt.h
+++ b/os/kernel/include/chvt.h
@@ -55,7 +55,8 @@
*
* @api
*/
-#define MS2ST(msec) ((systime_t)(((((msec) - 1L) * CH_FREQUENCY) / 1000L) + 1L))
+#define MS2ST(msec) ((systime_t)(((((msec) - 1L) * CH_FREQUENCY) / \
+ 1000L) + 1L))
/**
* @brief Microseconds to system ticks.
@@ -67,7 +68,8 @@
*
* @api
*/
-#define US2ST(usec) ((systime_t)(((((usec) - 1L) * CH_FREQUENCY) / 1000000L) + 1L))
+#define US2ST(usec) ((systime_t)(((((usec) - 1L) * CH_FREQUENCY) / \
+ 1000000L) + 1L))
/** @} */
/**
@@ -112,54 +114,100 @@ typedef struct {
volatile systime_t vt_systime; /**< @brief System Time counter. */
} VTList;
-extern VTList vtlist;
-
/**
* @name Macro Functions
* @{
*/
/**
* @brief Virtual timers ticker.
+ * @note The system lock is released before entering the callback and
+ * re-acquired immediately after. It is callback's responsibility
+ * to acquire the lock if needed. This is done in order to reduce
+ * interrupts jitter when many timers are in use.
*
* @iclass
*/
-#define chVTDoTickI() { \
- vtlist.vt_systime++; \
- if (&vtlist != (VTList *)vtlist.vt_next) { \
- VirtualTimer *vtp; \
- \
- --vtlist.vt_next->vt_time; \
- while (!(vtp = vtlist.vt_next)->vt_time) { \
- vtfunc_t fn = vtp->vt_func; \
- vtp->vt_func = (vtfunc_t)NULL; \
- vtp->vt_next->vt_prev = (void *)&vtlist; \
- (&vtlist)->vt_next = vtp->vt_next; \
- fn(vtp->vt_par); \
- } \
- } \
+#define chVTDoTickI() { \
+ vtlist.vt_systime++; \
+ if (&vtlist != (VTList *)vtlist.vt_next) { \
+ VirtualTimer *vtp; \
+ \
+ --vtlist.vt_next->vt_time; \
+ while (!(vtp = vtlist.vt_next)->vt_time) { \
+ vtfunc_t fn = vtp->vt_func; \
+ vtp->vt_func = (vtfunc_t)NULL; \
+ vtp->vt_next->vt_prev = (void *)&vtlist; \
+ (&vtlist)->vt_next = vtp->vt_next; \
+ chSysUnlockFromIsr(); \
+ fn(vtp->vt_par); \
+ chSysLockFromIsr(); \
+ } \
+ } \
}
/**
- * @brief Returns TRUE if the speciified timer is armed.
+ * @brief Returns @p TRUE if the specified timer is armed.
*
* @iclass
*/
#define chVTIsArmedI(vtp) ((vtp)->vt_func != NULL)
/**
+ * @brief Enables a virtual timer.
+ * @note The associated function is invoked from interrupt context.
+ *
+ * @param[out] vtp the @p VirtualTimer structure pointer
+ * @param[in] time the number of ticks before the operation timeouts, the
+ * special values are handled as follow:
+ * - @a TIME_INFINITE is allowed but interpreted as a
+ * normal time specification.
+ * - @a TIME_IMMEDIATE this value is not allowed.
+ * .
+ * @param[in] vtfunc the timer callback function. After invoking the
+ * callback the timer is disabled and the structure can
+ * be disposed or reused.
+ * @param[in] par a parameter that will be passed to the callback
+ * function
+ *
+ * @api
+ */
+#define chVTSet(vtp, time, vtfunc, par) { \
+ chSysLock(); \
+ chVTSetI(vtp, time, vtfunc, par); \
+ chSysUnlock(); \
+}
+
+/**
+ * @brief Disables a Virtual Timer.
+ * @note The timer is first checked and disabled only if armed.
+ *
+ * @param[in] vtp the @p VirtualTimer structure pointer
+ *
+ * @api
+ */
+#define chVTReset(vtp) { \
+ chSysLock(); \
+ if (chVTIsArmedI(vtp)) \
+ chVTResetI(vtp); \
+ chSysUnlock(); \
+}
+
+/**
* @brief Current system time.
* @details Returns the number of system ticks since the @p chSysInit()
* invocation.
* @note The counter can reach its maximum and then restart from zero.
* @note This function is designed to work with the @p chThdSleepUntil().
*
- * @return The system time in ticks.r
+ * @return The system time in ticks.
*
* @api
*/
#define chTimeNow() (vtlist.vt_systime)
/** @} */
+extern VTList vtlist;
+
/*
* Virtual Timers APIs.
*/