aboutsummaryrefslogtreecommitdiffstats
path: root/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2014-10-06 13:25:45 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2014-10-06 13:25:45 +0000
commit855065f2390b698ef6e1e68a7a75535230b3e1e8 (patch)
treee539e1d888f9f8421a933ac9b93c37ccb1f8d6cb /os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c
parente55acb6b0517fa4104bb69827366923ab099fabd (diff)
downloadChibiOS-855065f2390b698ef6e1e68a7a75535230b3e1e8.tar.gz
ChibiOS-855065f2390b698ef6e1e68a7a75535230b3e1e8.tar.bz2
ChibiOS-855065f2390b698ef6e1e68a7a75535230b3e1e8.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7379 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c')
-rw-r--r--os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c b/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c
index f8c8c3311..d8aa35cb5 100644
--- a/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c
+++ b/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c
@@ -221,6 +221,61 @@ osStatus osTimerDelete (osTimerId timer_id) {
}
/**
+ * @brief Send signals.
+ */
+int32_t osSignalSet(osThreadId thread_id, int32_t signals) {
+ int32_t oldsignals;
+
+ syssts_t sts = chSysGetStatusAndLockX();
+ oldsignals = (int32_t)thread_id->p_epending;
+ chEvtSignalI((thread_t *)thread_id, (eventmask_t)signals);
+ chSysRestoreStatusX(sts);
+
+ return oldsignals;
+}
+
+/**
+ * @brief Clear signals.
+ */
+int32_t osSignalClear(osThreadId thread_id, int32_t signals) {
+ eventmask_t m;
+
+ chSysLock();
+
+ m = thread_id->p_epending & (eventmask_t)signals;
+ thread_id->p_epending &= ~(eventmask_t)signals;
+
+ chSysUnlock();
+
+ return (int32_t)m;
+}
+
+/**
+ * @brief Wait for signals.
+ */
+osEvent osSignalWait(int32_t signals, uint32_t millisec) {
+ osEvent event;
+
+ systime_t timeout = millisec == osWaitForever ? TIME_INFINITE :
+ (systime_t)millisec;
+
+ if (signals == 0)
+ event.value.signals = (uint32_t)chEvtWaitAnyTimeout((eventmask_t)signals,
+ timeout);
+ else
+ event.value.signals = (uint32_t)chEvtWaitAllTimeout((eventmask_t)signals,
+ timeout);
+
+ /* Type of event.*/
+ if (event.value.signals == 0)
+ event.status = osEventTimeout;
+ else
+ event.status = osEventSignal;
+
+ return event;
+}
+
+/**
* @brief Create a semaphore.
* @note @p semaphore_def is not used.
* @note Can involve memory allocation.