[CPP wrappers] Base mailbox class now strongly typed and template based.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7260 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
05f8c30707
commit
7e5f127c41
|
@ -88,6 +88,7 @@ include $(CHIBIOS)/os/hal/osal/rt/osal.mk
|
||||||
include $(CHIBIOS)/os/rt/rt.mk
|
include $(CHIBIOS)/os/rt/rt.mk
|
||||||
include $(CHIBIOS)/os/rt/ports/ARMCMx/compilers/GCC/mk/port_stm32f4xx.mk
|
include $(CHIBIOS)/os/rt/ports/ARMCMx/compilers/GCC/mk/port_stm32f4xx.mk
|
||||||
include $(CHIBIOS)/test/rt/test.mk
|
include $(CHIBIOS)/test/rt/test.mk
|
||||||
|
include $(CHIBIOS)/os/various/cpp_wrappers/chcpp.mk
|
||||||
|
|
||||||
# Define linker script file here
|
# Define linker script file here
|
||||||
LDSCRIPT= $(PORTLD)/STM32F407xG.ld
|
LDSCRIPT= $(PORTLD)/STM32F407xG.ld
|
||||||
|
@ -108,9 +109,8 @@ CSRC = $(PORTSRC) \
|
||||||
|
|
||||||
# C++ sources that can be compiled in ARM or THUMB mode depending on the global
|
# C++ sources that can be compiled in ARM or THUMB mode depending on the global
|
||||||
# setting.
|
# setting.
|
||||||
CPPSRC = main.cpp \
|
CPPSRC = $(CHCPPSRC) \
|
||||||
$(CHIBIOS)/os/various/cpp_wrappers/ch.cpp \
|
main.cpp
|
||||||
$(CHIBIOS)/os/various/cpp_wrappers/syscalls_cpp.cpp \
|
|
||||||
|
|
||||||
# C sources to be compiled in ARM mode regardless of the global setting.
|
# C sources to be compiled in ARM mode regardless of the global setting.
|
||||||
# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
|
# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler
|
||||||
|
|
|
@ -745,76 +745,6 @@ namespace chibios_rt {
|
||||||
}
|
}
|
||||||
#endif /* CH_CFG_USE_QUEUES */
|
#endif /* CH_CFG_USE_QUEUES */
|
||||||
|
|
||||||
#if CH_CFG_USE_MAILBOXES
|
|
||||||
/*------------------------------------------------------------------------*
|
|
||||||
* chibios_rt::Mailbox *
|
|
||||||
*------------------------------------------------------------------------*/
|
|
||||||
Mailbox::Mailbox(msg_t *buf, cnt_t n) {
|
|
||||||
|
|
||||||
chMBObjectInit(&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);
|
|
||||||
}
|
|
||||||
|
|
||||||
cnt_t Mailbox::getFreeCountI(void) {
|
|
||||||
|
|
||||||
return chMBGetFreeCountI(&mb);
|
|
||||||
}
|
|
||||||
|
|
||||||
cnt_t Mailbox::getUsedCountI(void) {
|
|
||||||
|
|
||||||
return chMBGetUsedCountI(&mb);
|
|
||||||
}
|
|
||||||
#endif /* CH_CFG_USE_MAILBOXES */
|
|
||||||
|
|
||||||
#if CH_CFG_USE_MEMPOOLS
|
#if CH_CFG_USE_MEMPOOLS
|
||||||
/*------------------------------------------------------------------------*
|
/*------------------------------------------------------------------------*
|
||||||
* chibios_rt::MemoryPool *
|
* chibios_rt::MemoryPool *
|
||||||
|
|
|
@ -1843,10 +1843,14 @@ namespace chibios_rt {
|
||||||
* chibios_rt::Mailbox *
|
* chibios_rt::Mailbox *
|
||||||
*------------------------------------------------------------------------*/
|
*------------------------------------------------------------------------*/
|
||||||
/**
|
/**
|
||||||
* @brief Class encapsulating a mailbox.
|
* @brief Base mailbox class.
|
||||||
|
*
|
||||||
|
* @param T type of objects that mailbox able to handle
|
||||||
*/
|
*/
|
||||||
class Mailbox {
|
template <typename T>
|
||||||
|
class MailboxBase {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Embedded @p ::Mailbox structure.
|
* @brief Embedded @p ::Mailbox structure.
|
||||||
*/
|
*/
|
||||||
|
@ -1862,7 +1866,11 @@ namespace chibios_rt {
|
||||||
*
|
*
|
||||||
* @init
|
* @init
|
||||||
*/
|
*/
|
||||||
Mailbox(msg_t *buf, cnt_t n);
|
MailboxBase(msg_t *buf, cnt_t n) {
|
||||||
|
/* static_assert(sizeof(msg_t) >= sizeof(T),
|
||||||
|
"You can not pass objects bigger than msg_t"); */
|
||||||
|
chMBObjectInit(&mb, buf, n);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Resets a Mailbox object.
|
* @brief Resets a Mailbox object.
|
||||||
|
@ -1871,7 +1879,10 @@ namespace chibios_rt {
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
void reset(void);
|
void reset(void) {
|
||||||
|
|
||||||
|
chMBReset(&mb);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Posts a message into a mailbox.
|
* @brief Posts a message into a mailbox.
|
||||||
|
@ -1885,13 +1896,16 @@ namespace chibios_rt {
|
||||||
* - @a TIME_INFINITE no timeout.
|
* - @a TIME_INFINITE no timeout.
|
||||||
* .
|
* .
|
||||||
* @return The operation status.
|
* @return The operation status.
|
||||||
* @retval RDY_OK if a message has been correctly posted.
|
* @retval MSG_OK if a message has been correctly posted.
|
||||||
* @retval RDY_RESET if the mailbox has been reset while waiting.
|
* @retval MSG_RESET if the mailbox has been reset while waiting.
|
||||||
* @retval RDY_TIMEOUT if the operation has timed out.
|
* @retval MSG_TIMEOUT if the operation has timed out.
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
msg_t post(msg_t msg, systime_t time);
|
msg_t post(T msg, systime_t time) {
|
||||||
|
|
||||||
|
return chMBPost(&mb, reinterpret_cast<msg_t>(msg), time);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Posts a message into a mailbox.
|
* @brief Posts a message into a mailbox.
|
||||||
|
@ -1905,13 +1919,16 @@ namespace chibios_rt {
|
||||||
* - @a TIME_INFINITE no timeout.
|
* - @a TIME_INFINITE no timeout.
|
||||||
* .
|
* .
|
||||||
* @return The operation status.
|
* @return The operation status.
|
||||||
* @retval RDY_OK if a message has been correctly posted.
|
* @retval MSG_OK if a message has been correctly posted.
|
||||||
* @retval RDY_RESET if the mailbox has been reset while waiting.
|
* @retval MSG_RESET if the mailbox has been reset while waiting.
|
||||||
* @retval RDY_TIMEOUT if the operation has timed out.
|
* @retval MSG_TIMEOUT if the operation has timed out.
|
||||||
*
|
*
|
||||||
* @sclass
|
* @sclass
|
||||||
*/
|
*/
|
||||||
msg_t postS(msg_t msg, systime_t time);
|
msg_t postS(T msg, systime_t time) {
|
||||||
|
|
||||||
|
return chMBPostS(&mb, reinterpret_cast<msg_t>(msg), time);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Posts a message into a mailbox.
|
* @brief Posts a message into a mailbox.
|
||||||
|
@ -1920,13 +1937,16 @@ namespace chibios_rt {
|
||||||
*
|
*
|
||||||
* @param[in] msg the message to be posted on the mailbox
|
* @param[in] msg the message to be posted on the mailbox
|
||||||
* @return The operation status.
|
* @return The operation status.
|
||||||
* @retval RDY_OK if a message has been correctly posted.
|
* @retval MSG_OK if a message has been correctly posted.
|
||||||
* @retval RDY_TIMEOUT if the mailbox is full and the message cannot be
|
* @retval MSG_TIMEOUT if the mailbox is full and the message cannot be
|
||||||
* posted.
|
* posted.
|
||||||
*
|
*
|
||||||
* @iclass
|
* @iclass
|
||||||
*/
|
*/
|
||||||
msg_t postI(msg_t msg);
|
msg_t postI(T msg) {
|
||||||
|
|
||||||
|
return chMBPostI(&mb, reinterpret_cast<msg_t>(msg));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Posts an high priority message into a mailbox.
|
* @brief Posts an high priority message into a mailbox.
|
||||||
|
@ -1940,13 +1960,16 @@ namespace chibios_rt {
|
||||||
* - @a TIME_INFINITE no timeout.
|
* - @a TIME_INFINITE no timeout.
|
||||||
* .
|
* .
|
||||||
* @return The operation status.
|
* @return The operation status.
|
||||||
* @retval RDY_OK if a message has been correctly posted.
|
* @retval MSG_OK if a message has been correctly posted.
|
||||||
* @retval RDY_RESET if the mailbox has been reset while waiting.
|
* @retval MSG_RESET if the mailbox has been reset while waiting.
|
||||||
* @retval RDY_TIMEOUT if the operation has timed out.
|
* @retval MSG_TIMEOUT if the operation has timed out.
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
msg_t postAhead(msg_t msg, systime_t time);
|
msg_t postAhead(T msg, systime_t time) {
|
||||||
|
|
||||||
|
return chMBPostAhead(&mb, reinterpret_cast<msg_t>(msg), time);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Posts an high priority message into a mailbox.
|
* @brief Posts an high priority message into a mailbox.
|
||||||
|
@ -1960,13 +1983,16 @@ namespace chibios_rt {
|
||||||
* - @a TIME_INFINITE no timeout.
|
* - @a TIME_INFINITE no timeout.
|
||||||
* .
|
* .
|
||||||
* @return The operation status.
|
* @return The operation status.
|
||||||
* @retval RDY_OK if a message has been correctly posted.
|
* @retval MSG_OK if a message has been correctly posted.
|
||||||
* @retval RDY_RESET if the mailbox has been reset while waiting.
|
* @retval MSG_RESET if the mailbox has been reset while waiting.
|
||||||
* @retval RDY_TIMEOUT if the operation has timed out.
|
* @retval MSG_TIMEOUT if the operation has timed out.
|
||||||
*
|
*
|
||||||
* @sclass
|
* @sclass
|
||||||
*/
|
*/
|
||||||
msg_t postAheadS(msg_t msg, systime_t time);
|
msg_t postAheadS(T msg, systime_t time) {
|
||||||
|
|
||||||
|
return chMBPostAheadS(&mb, reinterpret_cast<msg_t>(msg), time);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Posts an high priority message into a mailbox.
|
* @brief Posts an high priority message into a mailbox.
|
||||||
|
@ -1975,13 +2001,16 @@ namespace chibios_rt {
|
||||||
*
|
*
|
||||||
* @param[in] msg the message to be posted on the mailbox
|
* @param[in] msg the message to be posted on the mailbox
|
||||||
* @return The operation status.
|
* @return The operation status.
|
||||||
* @retval RDY_OK if a message has been correctly posted.
|
* @retval MSG_OK if a message has been correctly posted.
|
||||||
* @retval RDY_TIMEOUT if the mailbox is full and the message cannot be
|
* @retval MSG_TIMEOUT if the mailbox is full and the message cannot be
|
||||||
* posted.
|
* posted.
|
||||||
*
|
*
|
||||||
* @iclass
|
* @iclass
|
||||||
*/
|
*/
|
||||||
msg_t postAheadI(msg_t msg);
|
msg_t postAheadI(T msg) {
|
||||||
|
|
||||||
|
return chMBPostAheadI(&mb, reinterpret_cast<msg_t>(msg));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Retrieves a message from a mailbox.
|
* @brief Retrieves a message from a mailbox.
|
||||||
|
@ -1995,13 +2024,16 @@ namespace chibios_rt {
|
||||||
* - @a TIME_INFINITE no timeout.
|
* - @a TIME_INFINITE no timeout.
|
||||||
* .
|
* .
|
||||||
* @return The operation status.
|
* @return The operation status.
|
||||||
* @retval RDY_OK if a message has been correctly fetched.
|
* @retval MSG_OK if a message has been correctly fetched.
|
||||||
* @retval RDY_RESET if the mailbox has been reset while waiting.
|
* @retval MSG_RESET if the mailbox has been reset while waiting.
|
||||||
* @retval RDY_TIMEOUT if the operation has timed out.
|
* @retval MSG_TIMEOUT if the operation has timed out.
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
msg_t fetch(msg_t *msgp, systime_t time);
|
msg_t fetch(T *msgp, systime_t time) {
|
||||||
|
|
||||||
|
return chMBFetch(&mb, reinterpret_cast<msg_t*>(msgp), time);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Retrieves a message from a mailbox.
|
* @brief Retrieves a message from a mailbox.
|
||||||
|
@ -2015,13 +2047,16 @@ namespace chibios_rt {
|
||||||
* - @a TIME_INFINITE no timeout.
|
* - @a TIME_INFINITE no timeout.
|
||||||
* .
|
* .
|
||||||
* @return The operation status.
|
* @return The operation status.
|
||||||
* @retval RDY_OK if a message has been correctly fetched.
|
* @retval MSG_OK if a message has been correctly fetched.
|
||||||
* @retval RDY_RESET if the mailbox has been reset while waiting.
|
* @retval MSG_RESET if the mailbox has been reset while waiting.
|
||||||
* @retval RDY_TIMEOUT if the operation has timed out.
|
* @retval MSG_TIMEOUT if the operation has timed out.
|
||||||
*
|
*
|
||||||
* @sclass
|
* @sclass
|
||||||
*/
|
*/
|
||||||
msg_t fetchS(msg_t *msgp, systime_t time);
|
msg_t fetchS(T *msgp, systime_t time) {
|
||||||
|
|
||||||
|
return chMBFetchS(&mb, reinterpret_cast<msg_t*>(msgp), time);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Retrieves a message from a mailbox.
|
* @brief Retrieves a message from a mailbox.
|
||||||
|
@ -2031,13 +2066,16 @@ namespace chibios_rt {
|
||||||
* @param[out] msgp pointer to a message variable for the received
|
* @param[out] msgp pointer to a message variable for the received
|
||||||
* message
|
* message
|
||||||
* @return The operation status.
|
* @return The operation status.
|
||||||
* @retval RDY_OK if a message has been correctly fetched.
|
* @retval MSG_OK if a message has been correctly fetched.
|
||||||
* @retval RDY_TIMEOUT if the mailbox is empty and a message cannot be
|
* @retval MSG_TIMEOUT if the mailbox is empty and a message cannot be
|
||||||
* fetched.
|
* fetched.
|
||||||
*
|
*
|
||||||
* @iclass
|
* @iclass
|
||||||
*/
|
*/
|
||||||
msg_t fetchI(msg_t *msgp);
|
msg_t fetchI(T *msgp) {
|
||||||
|
|
||||||
|
return chMBFetchI(&mb, reinterpret_cast<msg_t*>(msgp));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Returns the number of free message slots into a mailbox.
|
* @brief Returns the number of free message slots into a mailbox.
|
||||||
|
@ -2050,7 +2088,10 @@ namespace chibios_rt {
|
||||||
*
|
*
|
||||||
* @iclass
|
* @iclass
|
||||||
*/
|
*/
|
||||||
cnt_t getFreeCountI(void);
|
cnt_t getFreeCountI(void) {
|
||||||
|
|
||||||
|
return chMBGetFreeCountI(&mb);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Returns the number of used message slots into a mailbox.
|
* @brief Returns the number of used message slots into a mailbox.
|
||||||
|
@ -2063,30 +2104,33 @@ namespace chibios_rt {
|
||||||
*
|
*
|
||||||
* @iclass
|
* @iclass
|
||||||
*/
|
*/
|
||||||
cnt_t getUsedCountI(void);
|
cnt_t getUsedCountI(void) {
|
||||||
|
|
||||||
|
return chMBGetUsedCountI(&mb);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*
|
/*------------------------------------------------------------------------*
|
||||||
* chibios_rt::MailboxBuffer *
|
* chibios_rt::Mailbox *
|
||||||
*------------------------------------------------------------------------*/
|
*------------------------------------------------------------------------*/
|
||||||
/**
|
/**
|
||||||
* @brief Template class encapsulating a mailbox and its messages buffer.
|
* @brief Template class encapsulating a mailbox and its messages buffer.
|
||||||
*
|
*
|
||||||
* @param N size of the mailbox
|
* @param N length of the mailbox buffer
|
||||||
*/
|
*/
|
||||||
template <int N>
|
template <typename T, int N>
|
||||||
class MailboxBuffer : public Mailbox {
|
class Mailbox : public MailboxBase<T> {
|
||||||
private:
|
private:
|
||||||
msg_t mb_buf[N];
|
msg_t mb_buf[N];
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @brief BufferMailbox constructor.
|
* @brief Mailbox constructor.
|
||||||
*
|
*
|
||||||
* @init
|
* @init
|
||||||
*/
|
*/
|
||||||
MailboxBuffer(void) : Mailbox(mb_buf,
|
Mailbox(void) :
|
||||||
(cnt_t)(sizeof mb_buf / sizeof (msg_t))) {
|
MailboxBase<T>(mb_buf, (cnt_t)(sizeof mb_buf / sizeof (msg_t))) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif /* CH_CFG_USE_MAILBOXES */
|
#endif /* CH_CFG_USE_MAILBOXES */
|
||||||
|
|
Loading…
Reference in New Issue