Added mailboxes to the C++ wrapper.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@5018 35acf78f-673a-0410-8e92-d51de3d6d3f4master
parent
04db761f7e
commit
f0526e72d8
|
@ -510,6 +510,67 @@ namespace chibios_rt {
|
||||||
chEvtBroadcastFlagsI(&ev_source, flags);
|
chEvtBroadcastFlagsI(&ev_source, flags);
|
||||||
}
|
}
|
||||||
#endif /* CH_USE_EVENTS */
|
#endif /* CH_USE_EVENTS */
|
||||||
|
|
||||||
|
#if CH_USE_MAILBOXES || defined(__DOXYGEN__)
|
||||||
|
/*------------------------------------------------------------------------*
|
||||||
|
* chibios_rt::Mailbox *
|
||||||
|
*------------------------------------------------------------------------*/
|
||||||
|
Mailbox::Mailbox(msg_t *buf, cnt_t n) {
|
||||||
|
|
||||||
|
chMBInit(&mb, buf, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mailbox::reset(void) {
|
||||||
|
|
||||||
|
chMBReset(&mb);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg_t Mailbox::post(msg_t msg, systime_t time) {
|
||||||
|
|
||||||
|
return chMBPost(&mb, msg, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg_t Mailbox::postS(msg_t msg, systime_t time) {
|
||||||
|
|
||||||
|
return chMBPostS(&mb, msg, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg_t Mailbox::postI(msg_t msg) {
|
||||||
|
|
||||||
|
return chMBPostI(&mb, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg_t Mailbox::postAhead(msg_t msg, systime_t time) {
|
||||||
|
|
||||||
|
return chMBPostAhead(&mb, msg, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg_t Mailbox::postAheadS(msg_t msg, systime_t time) {
|
||||||
|
|
||||||
|
return chMBPostAheadS(&mb, msg, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg_t Mailbox::postAheadI(msg_t msg) {
|
||||||
|
|
||||||
|
return chMBPostAheadI(&mb, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg_t Mailbox::fetch(msg_t *msgp, systime_t time) {
|
||||||
|
|
||||||
|
return chMBFetch(&mb, msgp, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg_t Mailbox::fetchS(msg_t *msgp, systime_t time) {
|
||||||
|
|
||||||
|
return chMBFetchS(&mb, msgp, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg_t Mailbox::fetchI(msg_t *msgp) {
|
||||||
|
|
||||||
|
return chMBFetchI(&mb, msgp);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CH_USE_MAILBOXES */
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -106,7 +106,7 @@ namespace chibios_rt {
|
||||||
/**
|
/**
|
||||||
* @brief Embedded @p VirtualTimer structure.
|
* @brief Embedded @p VirtualTimer structure.
|
||||||
*/
|
*/
|
||||||
struct ::VirtualTimer timer_ref;
|
::VirtualTimer timer_ref;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Enables a virtual timer.
|
* @brief Enables a virtual timer.
|
||||||
|
@ -720,7 +720,7 @@ namespace chibios_rt {
|
||||||
/**
|
/**
|
||||||
* @brief Embedded @p ::Semaphore structure.
|
* @brief Embedded @p ::Semaphore structure.
|
||||||
*/
|
*/
|
||||||
struct ::Semaphore sem;
|
::Semaphore sem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Semaphore constructor.
|
* @brief Semaphore constructor.
|
||||||
|
@ -906,7 +906,7 @@ namespace chibios_rt {
|
||||||
/**
|
/**
|
||||||
* @brief Embedded @p ::Mutex structure.
|
* @brief Embedded @p ::Mutex structure.
|
||||||
*/
|
*/
|
||||||
struct ::Mutex mutex;
|
::Mutex mutex;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Mutex object constructor.
|
* @brief Mutex object constructor.
|
||||||
|
@ -983,7 +983,7 @@ namespace chibios_rt {
|
||||||
/**
|
/**
|
||||||
* @brief Embedded @p ::CondVar structure.
|
* @brief Embedded @p ::CondVar structure.
|
||||||
*/
|
*/
|
||||||
struct ::CondVar condvar;
|
::CondVar condvar;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief CondVar object constructor.
|
* @brief CondVar object constructor.
|
||||||
|
@ -1192,6 +1192,229 @@ namespace chibios_rt {
|
||||||
void broadcastFlagsI(flagsmask_t flags);
|
void broadcastFlagsI(flagsmask_t flags);
|
||||||
};
|
};
|
||||||
#endif /* CH_USE_EVENTS */
|
#endif /* CH_USE_EVENTS */
|
||||||
|
|
||||||
|
#if CH_USE_MAILBOXES || defined(__DOXYGEN__)
|
||||||
|
/*------------------------------------------------------------------------*
|
||||||
|
* chibios_rt::Mailbox *
|
||||||
|
*------------------------------------------------------------------------*/
|
||||||
|
class Mailbox {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Embedded @p ::Mailbox structure.
|
||||||
|
*/
|
||||||
|
::Mailbox mb;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Mailbox constructor.
|
||||||
|
* @details The embedded @p ::Mailbox structure is initialized.
|
||||||
|
*
|
||||||
|
* @param[in] buf pointer to the messages buffer as an array of
|
||||||
|
* @p msg_t
|
||||||
|
* @param[in] n number of elements in the buffer array
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
Mailbox(msg_t *buf, cnt_t n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Resets a Mailbox object.
|
||||||
|
* @details All the waiting threads are resumed with status @p RDY_RESET and
|
||||||
|
* the queued messages are lost.
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
void reset(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Posts a message into a mailbox.
|
||||||
|
* @details The invoking thread waits until a empty slot in the mailbox becomes
|
||||||
|
* available or the specified time runs out.
|
||||||
|
*
|
||||||
|
* @param[in] msg the message to be posted on the mailbox
|
||||||
|
* @param[in] time 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 operation status.
|
||||||
|
* @retval RDY_OK if a message has been correctly posted.
|
||||||
|
* @retval RDY_RESET if the mailbox has been reset while waiting.
|
||||||
|
* @retval RDY_TIMEOUT if the operation has timed out.
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
msg_t post(msg_t msg, systime_t time);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Posts a message into a mailbox.
|
||||||
|
* @details The invoking thread waits until a empty slot in the mailbox becomes
|
||||||
|
* available or the specified time runs out.
|
||||||
|
*
|
||||||
|
* @param[in] msg the message to be posted on the mailbox
|
||||||
|
* @param[in] time 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 operation status.
|
||||||
|
* @retval RDY_OK if a message has been correctly posted.
|
||||||
|
* @retval RDY_RESET if the mailbox has been reset while waiting.
|
||||||
|
* @retval RDY_TIMEOUT if the operation has timed out.
|
||||||
|
*
|
||||||
|
* @sclass
|
||||||
|
*/
|
||||||
|
msg_t postS(msg_t msg, systime_t time);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Posts a message into a mailbox.
|
||||||
|
* @details This variant is non-blocking, the function returns a timeout
|
||||||
|
* condition if the queue is full.
|
||||||
|
*
|
||||||
|
* @param[in] msg the message to be posted on the mailbox
|
||||||
|
* @return The operation status.
|
||||||
|
* @retval RDY_OK if a message has been correctly posted.
|
||||||
|
* @retval RDY_TIMEOUT if the mailbox is full and the message cannot be
|
||||||
|
* posted.
|
||||||
|
*
|
||||||
|
* @iclass
|
||||||
|
*/
|
||||||
|
msg_t postI(msg_t msg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Posts an high priority message into a mailbox.
|
||||||
|
* @details The invoking thread waits until a empty slot in the mailbox becomes
|
||||||
|
* available or the specified time runs out.
|
||||||
|
*
|
||||||
|
* @param[in] msg the message to be posted on the mailbox
|
||||||
|
* @param[in] time 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 operation status.
|
||||||
|
* @retval RDY_OK if a message has been correctly posted.
|
||||||
|
* @retval RDY_RESET if the mailbox has been reset while waiting.
|
||||||
|
* @retval RDY_TIMEOUT if the operation has timed out.
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
msg_t postAhead(msg_t msg, systime_t time);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Posts an high priority message into a mailbox.
|
||||||
|
* @details The invoking thread waits until a empty slot in the mailbox becomes
|
||||||
|
* available or the specified time runs out.
|
||||||
|
*
|
||||||
|
* @param[in] msg the message to be posted on the mailbox
|
||||||
|
* @param[in] time 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 operation status.
|
||||||
|
* @retval RDY_OK if a message has been correctly posted.
|
||||||
|
* @retval RDY_RESET if the mailbox has been reset while waiting.
|
||||||
|
* @retval RDY_TIMEOUT if the operation has timed out.
|
||||||
|
*
|
||||||
|
* @sclass
|
||||||
|
*/
|
||||||
|
msg_t postAheadS(msg_t msg, systime_t time);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Posts an high priority message into a mailbox.
|
||||||
|
* @details This variant is non-blocking, the function returns a timeout
|
||||||
|
* condition if the queue is full.
|
||||||
|
*
|
||||||
|
* @param[in] msg the message to be posted on the mailbox
|
||||||
|
* @return The operation status.
|
||||||
|
* @retval RDY_OK if a message has been correctly posted.
|
||||||
|
* @retval RDY_TIMEOUT if the mailbox is full and the message cannot be
|
||||||
|
* posted.
|
||||||
|
*
|
||||||
|
* @iclass
|
||||||
|
*/
|
||||||
|
msg_t postAheadI(msg_t msg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Retrieves a message from a mailbox.
|
||||||
|
* @details The invoking thread waits until a message is posted in the mailbox
|
||||||
|
* or the specified time runs out.
|
||||||
|
*
|
||||||
|
* @param[out] msgp pointer to a message variable for the received message
|
||||||
|
* @param[in] time 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 operation status.
|
||||||
|
* @retval RDY_OK if a message has been correctly fetched.
|
||||||
|
* @retval RDY_RESET if the mailbox has been reset while waiting.
|
||||||
|
* @retval RDY_TIMEOUT if the operation has timed out.
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
msg_t fetch(msg_t *msgp, systime_t time);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Retrieves a message from a mailbox.
|
||||||
|
* @details The invoking thread waits until a message is posted in the mailbox
|
||||||
|
* or the specified time runs out.
|
||||||
|
*
|
||||||
|
* @param[out] msgp pointer to a message variable for the received message
|
||||||
|
* @param[in] time 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 operation status.
|
||||||
|
* @retval RDY_OK if a message has been correctly fetched.
|
||||||
|
* @retval RDY_RESET if the mailbox has been reset while waiting.
|
||||||
|
* @retval RDY_TIMEOUT if the operation has timed out.
|
||||||
|
*
|
||||||
|
* @sclass
|
||||||
|
*/
|
||||||
|
msg_t fetchS(msg_t *msgp, systime_t time);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Retrieves a message from a mailbox.
|
||||||
|
* @details This variant is non-blocking, the function returns a timeout
|
||||||
|
* condition if the queue is empty.
|
||||||
|
*
|
||||||
|
* @param[out] msgp pointer to a message variable for the received message
|
||||||
|
* @return The operation status.
|
||||||
|
* @retval RDY_OK if a message has been correctly fetched.
|
||||||
|
* @retval RDY_TIMEOUT if the mailbox is empty and a message cannot be
|
||||||
|
* fetched.
|
||||||
|
*
|
||||||
|
* @iclass
|
||||||
|
*/
|
||||||
|
msg_t fetchI(msg_t *msgp);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*
|
||||||
|
* chibios_rt::MailboxBuffer *
|
||||||
|
*------------------------------------------------------------------------*/
|
||||||
|
/**
|
||||||
|
* @brief Template class encapsulating a mailbox with its messages buffer.
|
||||||
|
*
|
||||||
|
* @param N size of the mailbox
|
||||||
|
*/
|
||||||
|
template <int N>
|
||||||
|
class MailboxBuffer : public Mailbox {
|
||||||
|
private:
|
||||||
|
msg_t mb_buf[N];
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief BufferMailbox constructor.
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
MailboxBuffer(void) : Mailbox(mb_buf,
|
||||||
|
(cnt_t)(sizeof mb_buf / sizeof (msg_t))) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif /* CH_USE_MAILBOXES */
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _CH_HPP_ */
|
#endif /* _CH_HPP_ */
|
||||||
|
|
Loading…
Reference in New Issue