Improvements to messages, new functions chMsgWaitS(), chMsgWaitTimeoutS(), chMsgWaitTimeout() (NIL).
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@13187 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
f08814c116
commit
9ab62baa10
|
@ -54,6 +54,24 @@
|
||||||
* @name Macro Functions
|
* @name Macro Functions
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
/**
|
||||||
|
* @brief Suspends the thread and waits for an incoming message.
|
||||||
|
* @post After receiving a message the function @p chMsgGet() must be
|
||||||
|
* called in order to retrieve the message and then @p chMsgRelease()
|
||||||
|
* must be invoked in order to acknowledge the reception and send
|
||||||
|
* the answer.
|
||||||
|
* @note If the message is a pointer then you can assume that the data
|
||||||
|
* pointed by the message is stable until you invoke @p chMsgRelease()
|
||||||
|
* because the sending thread is suspended until then.
|
||||||
|
* @note The reference counter of the sender thread is not increased, the
|
||||||
|
* returned pointer is a temporary reference.
|
||||||
|
*
|
||||||
|
* @return A pointer to the thread carrying the message.
|
||||||
|
*
|
||||||
|
* @sclass
|
||||||
|
*/
|
||||||
|
#define chMsgWaitS() chMsgWaitTimeoutS(TIME_INFINITE)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Returns the message carried by the specified thread.
|
* @brief Returns the message carried by the specified thread.
|
||||||
* @pre This function must be invoked immediately after exiting a call
|
* @pre This function must be invoked immediately after exiting a call
|
||||||
|
@ -91,6 +109,8 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
msg_t chMsgSend(thread_t *tp, msg_t msg);
|
msg_t chMsgSend(thread_t *tp, msg_t msg);
|
||||||
thread_t *chMsgWait(void);
|
thread_t *chMsgWait(void);
|
||||||
|
thread_t *chMsgWaitTimeout(sysinterval_t timeout);
|
||||||
|
thread_t *chMsgWaitTimeoutS(sysinterval_t timeout);
|
||||||
void chMsgRelease(thread_t *tp, msg_t msg);
|
void chMsgRelease(thread_t *tp, msg_t msg);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,11 +101,79 @@ thread_t *chMsgWait(void) {
|
||||||
thread_t *tp;
|
thread_t *tp;
|
||||||
|
|
||||||
chSysLock();
|
chSysLock();
|
||||||
|
tp = chMsgWaitS();
|
||||||
|
chSysUnlock();
|
||||||
|
|
||||||
|
return tp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Suspends the thread and waits for an incoming message or a
|
||||||
|
* timeout to occur.
|
||||||
|
* @post After receiving a message the function @p chMsgGet() must be
|
||||||
|
* called in order to retrieve the message and then @p chMsgRelease()
|
||||||
|
* must be invoked in order to acknowledge the reception and send
|
||||||
|
* the answer.
|
||||||
|
* @note If the message is a pointer then you can assume that the data
|
||||||
|
* pointed by the message is stable until you invoke @p chMsgRelease()
|
||||||
|
* because the sending thread is suspended until then.
|
||||||
|
* @note The reference counter of the sender thread is not increased, the
|
||||||
|
* returned pointer is a temporary reference.
|
||||||
|
*
|
||||||
|
* @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 A pointer to the thread carrying the message.
|
||||||
|
* @retval NULL if a timeout occurred.
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
thread_t *chMsgWaitTimeout(sysinterval_t timeout) {
|
||||||
|
thread_t *tp;
|
||||||
|
|
||||||
|
chSysLock();
|
||||||
|
tp = chMsgWaitTimeoutS(timeout);
|
||||||
|
chSysUnlock();
|
||||||
|
|
||||||
|
return tp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Suspends the thread and waits for an incoming message or a
|
||||||
|
* timeout to occur.
|
||||||
|
* @post After receiving a message the function @p chMsgGet() must be
|
||||||
|
* called in order to retrieve the message and then @p chMsgRelease()
|
||||||
|
* must be invoked in order to acknowledge the reception and send
|
||||||
|
* the answer.
|
||||||
|
* @note If the message is a pointer then you can assume that the data
|
||||||
|
* pointed by the message is stable until you invoke @p chMsgRelease()
|
||||||
|
* because the sending thread is suspended until then.
|
||||||
|
* @note The reference counter of the sender thread is not increased, the
|
||||||
|
* returned pointer is a temporary reference.
|
||||||
|
*
|
||||||
|
* @param[in] timeout the number of ticks before the operation timeouts,
|
||||||
|
* the following special values are allowed:
|
||||||
|
* - @a TIME_INFINITE no timeout.
|
||||||
|
* .
|
||||||
|
* @return A pointer to the thread carrying the message.
|
||||||
|
* @retval NULL if a timeout occurred.
|
||||||
|
*
|
||||||
|
* @sclass
|
||||||
|
*/
|
||||||
|
thread_t *chMsgWaitTimeoutS(sysinterval_t timeout) {
|
||||||
|
thread_t *tp;
|
||||||
|
|
||||||
|
chDbgCheckClassS();
|
||||||
|
|
||||||
tp = nil_find_thread(NIL_STATE_SNDMSGQ, nil.current);
|
tp = nil_find_thread(NIL_STATE_SNDMSGQ, nil.current);
|
||||||
if (tp == NULL) {
|
if (tp == NULL) {
|
||||||
tp = (thread_t *)chSchGoSleepTimeoutS(NIL_STATE_WTMSG, TIME_INFINITE);
|
msg_t msg = chSchGoSleepTimeoutS(NIL_STATE_WTMSG, timeout);
|
||||||
|
if (msg != MSG_TIMEOUT) {
|
||||||
|
return (thread_t *)msg;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
chSysUnlock();
|
|
||||||
|
|
||||||
return tp;
|
return tp;
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,6 +121,8 @@ msg_t chMsgSend(thread_t *tp, msg_t msg) {
|
||||||
thread_t *chMsgWaitS(void) {
|
thread_t *chMsgWaitS(void) {
|
||||||
thread_t *tp;
|
thread_t *tp;
|
||||||
|
|
||||||
|
chDbgCheckClassS();
|
||||||
|
|
||||||
if (!chMsgIsPendingI(currp)) {
|
if (!chMsgIsPendingI(currp)) {
|
||||||
chSchGoSleepS(CH_STATE_WTMSG);
|
chSchGoSleepS(CH_STATE_WTMSG);
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,9 +75,10 @@
|
||||||
|
|
||||||
*** Next ***
|
*** Next ***
|
||||||
- LIB: Added support for delegate threads to OSLIB.
|
- LIB: Added support for delegate threads to OSLIB.
|
||||||
|
- NIL: Improvements to messages, new functions chMsgWaitS(),
|
||||||
|
chMsgWaitTimeoutS(), chMsgWaitTimeout().
|
||||||
- RT: Improvements to messages, new functions chMsgWaitS(),
|
- RT: Improvements to messages, new functions chMsgWaitS(),
|
||||||
chMsgWaitTimeoutS(), chMsgWaitTimeout(), chMsgWaitPollS(),
|
chMsgWaitTimeoutS(), chMsgWaitTimeout(), chMsgPollS(), chMsgPoll().
|
||||||
chMsgWaitPoll().
|
|
||||||
- HAL: TRNG support added to STM32F7xx, STM32G0xx, STM32G4xx, STM32H7xx
|
- HAL: TRNG support added to STM32F7xx, STM32G0xx, STM32G4xx, STM32H7xx
|
||||||
and STM32L0xx.
|
and STM32L0xx.
|
||||||
- NEW: Added support for .cc files extensions in makefiles.
|
- NEW: Added support for .cc files extensions in makefiles.
|
||||||
|
|
Loading…
Reference in New Issue