diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2014-02-11 13:00:24 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2014-02-11 13:00:24 +0000 |
commit | 7f3e0e57b2a13aa4797a8409e6e63671cb6d6993 (patch) | |
tree | ee6dc2a23554eb38ca360393d91cf7a0867360c1 /os | |
parent | 4541bd732acf21e30f40f5b6c991172e2e350cb0 (diff) | |
download | ChibiOS-7f3e0e57b2a13aa4797a8409e6e63671cb6d6993.tar.gz ChibiOS-7f3e0e57b2a13aa4797a8409e6e63671cb6d6993.tar.bz2 ChibiOS-7f3e0e57b2a13aa4797a8409e6e63671cb6d6993.zip |
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/kernel_3_dev@6701 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os')
-rw-r--r-- | os/nil/include/nil.h | 8 | ||||
-rw-r--r-- | os/nil/src/nil.c | 37 |
2 files changed, 42 insertions, 3 deletions
diff --git a/os/nil/include/nil.h b/os/nil/include/nil.h index 7ba088dac..161c79a6d 100644 --- a/os/nil/include/nil.h +++ b/os/nil/include/nil.h @@ -597,6 +597,13 @@ typedef struct { #define chSchIsRescRequiredI() ((bool)(nil.current != nil.next))
/**
+ * @brief Returns a pointer to the current @p thread_t.
+ *
+ * @xclass
+ */
+#define chThdGetSelfX() nil.current
+
+/**
* @brief Delays the invoking thread for the specified number of seconds.
* @note The specified time is rounded up to a value allowed by the real
* system clock.
@@ -802,6 +809,7 @@ extern "C" { void chEvtSignal(thread_t *tp, eventmask_t mask);
void chEvtSignalI(thread_t *tp, eventmask_t mask);
eventmask_t chEvtWaitAnyTimeout(eventmask_t mask, systime_t timeout);
+ eventmask_t chEvtWaitAnyTimeoutS(eventmask_t mask, systime_t timeout);
#ifdef __cplusplus
}
#endif
diff --git a/os/nil/src/nil.c b/os/nil/src/nil.c index 9141129cb..edd717600 100644 --- a/os/nil/src/nil.c +++ b/os/nil/src/nil.c @@ -489,7 +489,9 @@ msg_t chSemWaitTimeout(semaphore_t *sp, systime_t timeout) { msg_t msg;
chSysLock();
+
msg = chSemWaitTimeoutS(sp, timeout);
+
chSysUnlock();
return msg;
}
@@ -599,8 +601,10 @@ void chSemSignalI(semaphore_t *sp) { void chSemReset(semaphore_t *sp, cnt_t n) {
chSysLock();
+
chSemResetI(sp, n);
chSchRescheduleS();
+
chSysUnlock();
}
@@ -654,8 +658,10 @@ void chSemResetI(semaphore_t *sp, cnt_t n) { void chEvtSignal(thread_t *tp, eventmask_t mask) {
chSysLock();
+
chEvtSignalI(tp, mask);
chSchRescheduleS();
+
chSysUnlock();
}
@@ -697,11 +703,38 @@ void chEvtSignalI(thread_t *tp, eventmask_t mask) { * @api
*/
eventmask_t chEvtWaitAnyTimeout(eventmask_t mask, systime_t timeout) {
- thread_t *ctp = nil.current;
eventmask_t m;
chSysLock();
+ m = chEvtWaitAnyTimeoutS(mask, timeout);
+
+ chSysUnlock();
+ return m;
+}
+
+/**
+ * @brief Waits for any of the specified events.
+ * @details The function waits for any event among those specified in
+ * @p mask to become pending then the events are cleared and
+ * returned.
+ *
+ * @param[in] mask mask of the event flags that the function should wait
+ * for, @p ALL_EVENTS enables all the events
+ * @param[in] timeout the number of ticks before the operation timeouts,
+ * the following special values are allowed:
+ * - @a TIME_IMMEDIATE immediate timeout.
+ * - @a TIME_INFINITE no timeout.
+ * .
+ * @return The mask of the served and cleared events.
+ * @retval 0 if the operation has timed out.
+ *
+ * @sclass
+ */
+eventmask_t chEvtWaitAnyTimeoutS(eventmask_t mask, systime_t timeout) {
+ thread_t *ctp = nil.current;
+ eventmask_t m;
+
if ((m = (ctp->epmask & mask)) == 0) {
if (TIME_IMMEDIATE == timeout) {
chSysUnlock();
@@ -715,8 +748,6 @@ eventmask_t chEvtWaitAnyTimeout(eventmask_t mask, systime_t timeout) { m = ctp->epmask & mask;
}
ctp->epmask &= ~m;
-
- chSysUnlock();
return m;
}
|