mirror of https://github.com/ARMmbed/mbed-os.git
Add Chrono support to Queue,MemoryPool,Mail
parent
f6e8ecadec
commit
4575ad3f23
107
rtos/Mail.h
107
rtos/Mail.h
|
@ -70,7 +70,7 @@ public:
|
||||||
*
|
*
|
||||||
* @note You cannot call this function from ISR context.
|
* @note You cannot call this function from ISR context.
|
||||||
*/
|
*/
|
||||||
Mail() { };
|
Mail() = default;
|
||||||
|
|
||||||
/** Check if the mail queue is empty.
|
/** Check if the mail queue is empty.
|
||||||
*
|
*
|
||||||
|
@ -114,15 +114,47 @@ public:
|
||||||
|
|
||||||
/** Allocate a memory block of type T, optionally blocking.
|
/** Allocate a memory block of type T, optionally blocking.
|
||||||
*
|
*
|
||||||
* @param millisec Timeout value, or osWaitForever.
|
* @param rel_time Timeout value, or Kernel::wait_for_u32_forever.
|
||||||
*
|
*
|
||||||
* @return Pointer to memory block that you can fill with mail or nullptr in case error.
|
* @return Pointer to memory block that you can fill with mail or nullptr in case error.
|
||||||
*
|
*
|
||||||
* @note You may call this function from ISR context if the millisec parameter is set to 0.
|
* @note You may call this function from ISR context if the millisec parameter is set to 0.
|
||||||
*/
|
*/
|
||||||
|
T *alloc_for(Kernel::Clock::duration_u32 rel_time)
|
||||||
|
{
|
||||||
|
return _pool.alloc_for(rel_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Allocate a memory block of type T, optionally blocking.
|
||||||
|
*
|
||||||
|
* @param millisec Timeout value, or osWaitForever.
|
||||||
|
*
|
||||||
|
* @return Pointer to memory block that you can fill with mail or nullptr in case error.
|
||||||
|
*
|
||||||
|
* @note You may call this function from ISR context if the millisec parameter is set to 0.
|
||||||
|
* @deprecated Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.
|
||||||
|
*/
|
||||||
|
MBED_DEPRECATED_SINCE("mbed-os-6.0.0", "Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.")
|
||||||
T *alloc_for(uint32_t millisec)
|
T *alloc_for(uint32_t millisec)
|
||||||
{
|
{
|
||||||
return _pool.alloc_for(millisec);
|
return alloc_for(std::chrono::duration<uint32_t, std::milli>(millisec));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Allocate a memory block of type T, blocking.
|
||||||
|
*
|
||||||
|
* @param abs_time Absolute timeout time, referenced to Kernel::Clock.
|
||||||
|
*
|
||||||
|
* @return Pointer to memory block that you can fill with mail or nullptr in case error.
|
||||||
|
*
|
||||||
|
* @note You cannot call this function from ISR context.
|
||||||
|
* @note the underlying RTOS may have a limit to the maximum wait time
|
||||||
|
* due to internal 32-bit computations, but this is guaranteed to work if the
|
||||||
|
* wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
|
||||||
|
* the wait will time out earlier than specified.
|
||||||
|
*/
|
||||||
|
T *alloc_until(Kernel::Clock::time_point abs_time)
|
||||||
|
{
|
||||||
|
return _pool.alloc_until(abs_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Allocate a memory block of type T, blocking.
|
/** Allocate a memory block of type T, blocking.
|
||||||
|
@ -136,10 +168,13 @@ public:
|
||||||
* due to internal 32-bit computations, but this is guaranteed to work if the
|
* due to internal 32-bit computations, but this is guaranteed to work if the
|
||||||
* wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
|
* wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
|
||||||
* the wait will time out earlier than specified.
|
* the wait will time out earlier than specified.
|
||||||
|
* @deprecated Pass a chrono time_point, not an integer millisecond count. For example use `Kernel::Clock::now() + 5s`
|
||||||
|
* rather than `Kernel::get_ms_count() + 5000`.
|
||||||
*/
|
*/
|
||||||
|
MBED_DEPRECATED_SINCE("mbed-os-6.0.0", "Pass a chrono time_point, not an integer millisecond count. For example use `Kernel::Clock::now() + 5s` rather than `Kernel::get_ms_count() + 5000`.")
|
||||||
T *alloc_until(uint64_t millisec)
|
T *alloc_until(uint64_t millisec)
|
||||||
{
|
{
|
||||||
return _pool.alloc_until(millisec);
|
return alloc_until(Kernel::Clock::time_point(std::chrono::duration<uint64_t, std::milli>(millisec)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Allocate a memory block of type T, and set memory block to zero.
|
/** Allocate a memory block of type T, and set memory block to zero.
|
||||||
|
@ -156,6 +191,19 @@ public:
|
||||||
return _pool.calloc();
|
return _pool.calloc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Allocate a memory block of type T, optionally blocking, and set memory block to zero.
|
||||||
|
*
|
||||||
|
* @param rel_time Timeout value, or Kernel::wait_for_u32_forever.
|
||||||
|
*
|
||||||
|
* @return Pointer to memory block that you can fill with mail or nullptr in case error.
|
||||||
|
*
|
||||||
|
* @note You may call this function from ISR context if the rel_time parameter is set to 0.
|
||||||
|
*/
|
||||||
|
T *calloc_for(Kernel::Clock::duration_u32 rel_time)
|
||||||
|
{
|
||||||
|
return _pool.alloc_for(rel_time);
|
||||||
|
}
|
||||||
|
|
||||||
/** Allocate a memory block of type T, optionally blocking, and set memory block to zero.
|
/** Allocate a memory block of type T, optionally blocking, and set memory block to zero.
|
||||||
*
|
*
|
||||||
* @param millisec Timeout value, or osWaitForever.
|
* @param millisec Timeout value, or osWaitForever.
|
||||||
|
@ -163,10 +211,29 @@ public:
|
||||||
* @return Pointer to memory block that you can fill with mail or nullptr in case error.
|
* @return Pointer to memory block that you can fill with mail or nullptr in case error.
|
||||||
*
|
*
|
||||||
* @note You may call this function from ISR context if the millisec parameter is set to 0.
|
* @note You may call this function from ISR context if the millisec parameter is set to 0.
|
||||||
|
* @deprecated Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.
|
||||||
*/
|
*/
|
||||||
|
MBED_DEPRECATED_SINCE("mbed-os-6.0.0", "Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.")
|
||||||
T *calloc_for(uint32_t millisec)
|
T *calloc_for(uint32_t millisec)
|
||||||
{
|
{
|
||||||
return _pool.calloc_for(millisec);
|
return calloc_for(std::chrono::duration<uint32_t, std::milli>(millisec));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Allocate a memory block of type T, blocking, and set memory block to zero.
|
||||||
|
*
|
||||||
|
* @param abs_time Absolute timeout time, referenced to Kernel::Clock.
|
||||||
|
*
|
||||||
|
* @return Pointer to memory block that you can fill with mail or nullptr in case error.
|
||||||
|
*
|
||||||
|
* @note You cannot call this function from ISR context.
|
||||||
|
* @note the underlying RTOS may have a limit to the maximum wait time
|
||||||
|
* due to internal 32-bit computations, but this is guaranteed to work if the
|
||||||
|
* wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
|
||||||
|
* the wait will time out earlier than specified.
|
||||||
|
*/
|
||||||
|
T *calloc_until(Kernel::Clock::time_point abs_time)
|
||||||
|
{
|
||||||
|
return _pool.calloc_until(abs_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Allocate a memory block of type T, blocking, and set memory block to zero.
|
/** Allocate a memory block of type T, blocking, and set memory block to zero.
|
||||||
|
@ -180,10 +247,13 @@ public:
|
||||||
* due to internal 32-bit computations, but this is guaranteed to work if the
|
* due to internal 32-bit computations, but this is guaranteed to work if the
|
||||||
* wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
|
* wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
|
||||||
* the wait will time out earlier than specified.
|
* the wait will time out earlier than specified.
|
||||||
|
* @deprecated Pass a chrono time_point, not an integer millisecond count. For example use `Kernel::Clock::now() + 5s`
|
||||||
|
* rather than `Kernel::get_ms_count() + 5000`.
|
||||||
*/
|
*/
|
||||||
|
MBED_DEPRECATED_SINCE("mbed-os-6.0.0", "Pass a chrono time_point, not an integer millisecond count. For example use `Kernel::Clock::now() + 5s` rather than `Kernel::get_ms_count() + 5000`.")
|
||||||
T *calloc_until(uint64_t millisec)
|
T *calloc_until(uint64_t millisec)
|
||||||
{
|
{
|
||||||
return _pool.calloc_until(millisec);
|
return calloc_until(Kernel::Clock::time_point(std::chrono::duration<uint64_t, std::milli>(millisec)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Put a mail in the queue.
|
/** Put a mail in the queue.
|
||||||
|
@ -201,7 +271,26 @@ public:
|
||||||
|
|
||||||
/** Get a mail from the queue.
|
/** Get a mail from the queue.
|
||||||
*
|
*
|
||||||
* @param millisec Timeout value (default: osWaitForever).
|
* @param millisec Timeout value.
|
||||||
|
*
|
||||||
|
* @return Event that contains mail information or error code.
|
||||||
|
* @retval osEventMessage Message received.
|
||||||
|
* @retval osOK No mail is available (and no timeout was specified).
|
||||||
|
* @retval osEventTimeout No mail has arrived during the given timeout period.
|
||||||
|
* @retval osErrorParameter A parameter is invalid or outside of a permitted range.
|
||||||
|
*
|
||||||
|
* @note You may call this function from ISR context if the millisec parameter is set to 0.
|
||||||
|
* @deprecated Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.
|
||||||
|
*/
|
||||||
|
MBED_DEPRECATED_SINCE("mbed-os-6.0.0", "Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.")
|
||||||
|
osEvent get(uint32_t millisec)
|
||||||
|
{
|
||||||
|
return get(std::chrono::duration<uint32_t, std::milli>(millisec));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get a mail from the queue.
|
||||||
|
*
|
||||||
|
* @param rel_time Timeout value (default: Kernel::wait_for_u32_forever).
|
||||||
*
|
*
|
||||||
* @return Event that contains mail information and status code. The status code
|
* @return Event that contains mail information and status code. The status code
|
||||||
* is stored in the status member:
|
* is stored in the status member:
|
||||||
|
@ -212,9 +301,9 @@ public:
|
||||||
*
|
*
|
||||||
* @note You may call this function from ISR context if the millisec parameter is set to 0.
|
* @note You may call this function from ISR context if the millisec parameter is set to 0.
|
||||||
*/
|
*/
|
||||||
osEvent get(uint32_t millisec = osWaitForever)
|
osEvent get(Kernel::Clock::duration_u32 rel_time = Kernel::wait_for_u32_forever)
|
||||||
{
|
{
|
||||||
osEvent evt = _queue.get(millisec);
|
osEvent evt = _queue.get(rel_time);
|
||||||
if (evt.status == osEventMessage) {
|
if (evt.status == osEventMessage) {
|
||||||
evt.status = osEventMail;
|
evt.status = osEventMail;
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,15 +94,38 @@ public:
|
||||||
return (T *)osMemoryPoolAlloc(_id, 0);
|
return (T *)osMemoryPoolAlloc(_id, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Allocate a memory block from a memory pool, without blocking.
|
||||||
|
@return address of the allocated memory block or nullptr in case of no memory available.
|
||||||
|
|
||||||
|
@note You may call this function from ISR context.
|
||||||
|
*/
|
||||||
|
T *try_alloc(void)
|
||||||
|
{
|
||||||
|
return (T *)osMemoryPoolAlloc(_id, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/** Allocate a memory block from a memory pool, optionally blocking.
|
/** Allocate a memory block from a memory pool, optionally blocking.
|
||||||
@param millisec timeout value (osWaitForever to wait forever)
|
@param millisec timeout value (osWaitForever to wait forever)
|
||||||
@return address of the allocated memory block or nullptr in case of no memory available.
|
@return address of the allocated memory block or nullptr in case of no memory available.
|
||||||
|
|
||||||
@note You may call this function from ISR context if the millisec parameter is set to 0.
|
@note You may call this function from ISR context if the millisec parameter is set to 0.
|
||||||
|
@deprecated Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.
|
||||||
*/
|
*/
|
||||||
|
MBED_DEPRECATED_SINCE("mbed-os-6.0.0", "Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.")
|
||||||
T *alloc_for(uint32_t millisec)
|
T *alloc_for(uint32_t millisec)
|
||||||
{
|
{
|
||||||
return (T *)osMemoryPoolAlloc(_id, millisec);
|
return alloc_for(std::chrono::duration<uint32_t, std::milli>(millisec));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Allocate a memory block from a memory pool, optionally blocking.
|
||||||
|
@param rel_time timeout value (Kernel::wait_for_u32_forever to wait forever)
|
||||||
|
@return address of the allocated memory block or nullptr in case of no memory available.
|
||||||
|
|
||||||
|
@note You may call this function from ISR context if the rel_time parameter is set to 0.
|
||||||
|
*/
|
||||||
|
T *alloc_for(Kernel::Clock::duration_u32 rel_time)
|
||||||
|
{
|
||||||
|
return (T *)osMemoryPoolAlloc(_id, rel_time.count());
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Allocate a memory block from a memory pool, blocking.
|
/** Allocate a memory block from a memory pool, blocking.
|
||||||
|
@ -114,21 +137,38 @@ public:
|
||||||
due to internal 32-bit computations, but this is guaranteed to work if the
|
due to internal 32-bit computations, but this is guaranteed to work if the
|
||||||
wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
|
wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
|
||||||
the wait will time out earlier than specified.
|
the wait will time out earlier than specified.
|
||||||
|
@deprecated Pass a chrono time_point, not an integer millisecond count. For example use `Kernel::Clock::now() + 5s`
|
||||||
|
rather than `Kernel::get_ms_count() + 5000`.
|
||||||
*/
|
*/
|
||||||
|
MBED_DEPRECATED_SINCE("mbed-os-6.0.0", "Pass a chrono time_point, not an integer millisecond count. For example use `Kernel::Clock::now() + 5s` rather than `Kernel::get_ms_count() + 5000`.")
|
||||||
T *alloc_until(uint64_t millisec)
|
T *alloc_until(uint64_t millisec)
|
||||||
{
|
{
|
||||||
uint64_t now = Kernel::get_ms_count();
|
return alloc_until(Kernel::Clock::time_point(std::chrono::duration<uint64_t, std::milli>(millisec)));
|
||||||
uint32_t delay;
|
|
||||||
if (now >= millisec) {
|
|
||||||
delay = 0;
|
|
||||||
} else if (millisec - now >= osWaitForever) {
|
|
||||||
delay = osWaitForever - 1;
|
|
||||||
} else {
|
|
||||||
delay = millisec - now;
|
|
||||||
}
|
|
||||||
return alloc_for(delay);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Allocate a memory block from a memory pool, blocking.
|
||||||
|
@param abs_time absolute timeout time, referenced to Kernel::Clock.
|
||||||
|
@return address of the allocated memory block or nullptr in case of no memory available.
|
||||||
|
|
||||||
|
@note You cannot call this function from ISR context.
|
||||||
|
@note the underlying RTOS may have a limit to the maximum wait time
|
||||||
|
due to internal 32-bit computations, but this is guaranteed to work if the
|
||||||
|
wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
|
||||||
|
the wait will time out earlier than specified.
|
||||||
|
*/
|
||||||
|
T *alloc_until(Kernel::Clock::time_point abs_time)
|
||||||
|
{
|
||||||
|
Kernel::Clock::time_point now = Kernel::Clock::now();
|
||||||
|
Kernel::Clock::duration_u32 rel_time;
|
||||||
|
if (now >= abs_time) {
|
||||||
|
rel_time = rel_time.zero();
|
||||||
|
} else if (abs_time - now > Kernel::wait_for_u32_max) {
|
||||||
|
rel_time = Kernel::wait_for_u32_max;
|
||||||
|
} else {
|
||||||
|
rel_time = abs_time - now;
|
||||||
|
}
|
||||||
|
return alloc_for(rel_time);
|
||||||
|
}
|
||||||
/** Allocate a memory block from a memory pool, without blocking, and set memory block to zero.
|
/** Allocate a memory block from a memory pool, without blocking, and set memory block to zero.
|
||||||
@return address of the allocated memory block or nullptr in case of no memory available.
|
@return address of the allocated memory block or nullptr in case of no memory available.
|
||||||
|
|
||||||
|
@ -148,10 +188,23 @@ public:
|
||||||
@return address of the allocated memory block or nullptr in case of no memory available.
|
@return address of the allocated memory block or nullptr in case of no memory available.
|
||||||
|
|
||||||
@note You may call this function from ISR context if the millisec parameter is set to 0.
|
@note You may call this function from ISR context if the millisec parameter is set to 0.
|
||||||
|
@deprecated Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.
|
||||||
*/
|
*/
|
||||||
|
MBED_DEPRECATED_SINCE("mbed-os-6.0.0", "Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.")
|
||||||
T *calloc_for(uint32_t millisec)
|
T *calloc_for(uint32_t millisec)
|
||||||
{
|
{
|
||||||
T *item = alloc_for(millisec);
|
return calloc_for(std::chrono::duration<uint32_t, std::milli>(millisec));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Allocate a memory block from a memory pool, optionally blocking, and set memory block to zero.
|
||||||
|
@param rel_time timeout value (Kernel::wait_for_u32_forever to wait forever)
|
||||||
|
@return address of the allocated memory block or nullptr in case of no memory available.
|
||||||
|
|
||||||
|
@note You may call this function from ISR context if the rel_time parameter is set to 0.
|
||||||
|
*/
|
||||||
|
T *calloc_for(Kernel::Clock::duration_u32 rel_time)
|
||||||
|
{
|
||||||
|
T *item = alloc_for(rel_time);
|
||||||
if (item != nullptr) {
|
if (item != nullptr) {
|
||||||
memset(item, 0, sizeof(T));
|
memset(item, 0, sizeof(T));
|
||||||
}
|
}
|
||||||
|
@ -167,10 +220,28 @@ public:
|
||||||
due to internal 32-bit computations, but this is guaranteed to work if the
|
due to internal 32-bit computations, but this is guaranteed to work if the
|
||||||
wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
|
wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
|
||||||
the wait will time out earlier than specified.
|
the wait will time out earlier than specified.
|
||||||
|
@deprecated Pass a chrono time_point, not an integer millisecond count. For example use `Kernel::Clock::now() + 5s`
|
||||||
|
rather than `Kernel::get_ms_count() + 5000`.
|
||||||
*/
|
*/
|
||||||
|
MBED_DEPRECATED_SINCE("mbed-os-6.0.0", "Pass a chrono time_point, not an integer millisecond count. For example use `Kernel::Clock::now() + 5s` rather than `Kernel::get_ms_count() + 5000`.")
|
||||||
T *calloc_until(uint64_t millisec)
|
T *calloc_until(uint64_t millisec)
|
||||||
{
|
{
|
||||||
T *item = alloc_until(millisec);
|
return alloc_until(Kernel::Clock::time_point(std::chrono::duration<uint64_t, std::milli>(millisec)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Allocate a memory block from a memory pool, blocking, and set memory block to zero.
|
||||||
|
@param abs_time absolute timeout time, referenced to Kernel::Clock.
|
||||||
|
@return address of the allocated memory block or nullptr in case of no memory available.
|
||||||
|
|
||||||
|
@note You cannot call this function from ISR context.
|
||||||
|
@note the underlying RTOS may have a limit to the maximum wait time
|
||||||
|
due to internal 32-bit computations, but this is guaranteed to work if the
|
||||||
|
wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
|
||||||
|
the wait will time out earlier than specified.
|
||||||
|
*/
|
||||||
|
T *calloc_until(Kernel::Clock::time_point abs_time)
|
||||||
|
{
|
||||||
|
T *item = alloc_until(abs_time);
|
||||||
if (item != nullptr) {
|
if (item != nullptr) {
|
||||||
memset(item, 0, sizeof(T));
|
memset(item, 0, sizeof(T));
|
||||||
}
|
}
|
||||||
|
|
136
rtos/Queue.h
136
rtos/Queue.h
|
@ -26,6 +26,7 @@
|
||||||
#include "rtos/mbed_rtos_types.h"
|
#include "rtos/mbed_rtos_types.h"
|
||||||
#include "rtos/mbed_rtos1_types.h"
|
#include "rtos/mbed_rtos1_types.h"
|
||||||
#include "rtos/mbed_rtos_storage.h"
|
#include "rtos/mbed_rtos_storage.h"
|
||||||
|
#include "rtos/Kernel.h"
|
||||||
#include "platform/mbed_error.h"
|
#include "platform/mbed_error.h"
|
||||||
#include "platform/NonCopyable.h"
|
#include "platform/NonCopyable.h"
|
||||||
|
|
||||||
|
@ -121,6 +122,47 @@ public:
|
||||||
return osMessageQueueGetCount(_id);
|
return osMessageQueueGetCount(_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Inserts the given element to the end of the queue.
|
||||||
|
*
|
||||||
|
* This function puts the message pointed to by `data` into the queue. The
|
||||||
|
* parameter `prio` is used to sort the message according to their priority
|
||||||
|
* (higher numbers indicate higher priority) on insertion.
|
||||||
|
*
|
||||||
|
* The timeout indicated by the parameter `rel_time` specifies how long the
|
||||||
|
* function blocks waiting for the message to be inserted into the
|
||||||
|
* queue.
|
||||||
|
*
|
||||||
|
* The parameter `rel_time` can have the following values:
|
||||||
|
* - When the duration is 0 (the default), the function returns instantly.
|
||||||
|
* - When the duration is Kernel::wait_for_u32_forever, the function waits for an
|
||||||
|
* infinite time.
|
||||||
|
* - For all other values, the function waits for the given duration.
|
||||||
|
*
|
||||||
|
* @param data Pointer to the element to insert into the queue.
|
||||||
|
* @param rel_time Timeout for the operation to be executed, or 0 in case
|
||||||
|
* of no timeout. (default: 0)
|
||||||
|
* @param prio Priority of the operation or 0 in case of default.
|
||||||
|
* (default: 0)
|
||||||
|
*
|
||||||
|
* @return Status code that indicates the execution status of the function:
|
||||||
|
* @a osOK The message has been successfully inserted
|
||||||
|
* into the queue.
|
||||||
|
* @a osErrorTimeout The message could not be inserted into the
|
||||||
|
* queue in the given time.
|
||||||
|
* @a osErrorResource The message could not be inserted because
|
||||||
|
* the queue is full.
|
||||||
|
* @a osErrorParameter Internal error or nonzero timeout specified
|
||||||
|
* in an ISR.
|
||||||
|
*
|
||||||
|
* @note You may call this function from ISR context if the rel_time
|
||||||
|
* parameter is set to 0.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
osStatus put(T *data, Kernel::Clock::duration_u32 rel_time = Kernel::Clock::duration_u32::zero(), uint8_t prio = 0)
|
||||||
|
{
|
||||||
|
return osMessageQueuePut(_id, &data, prio, rel_time.count());
|
||||||
|
}
|
||||||
|
|
||||||
/** Inserts the given element to the end of the queue.
|
/** Inserts the given element to the end of the queue.
|
||||||
*
|
*
|
||||||
* This function puts the message pointed to by `data` into the queue. The
|
* This function puts the message pointed to by `data` into the queue. The
|
||||||
|
@ -156,11 +198,74 @@ public:
|
||||||
*
|
*
|
||||||
* @note You may call this function from ISR context if the millisec
|
* @note You may call this function from ISR context if the millisec
|
||||||
* parameter is set to 0.
|
* parameter is set to 0.
|
||||||
*
|
* @deprecated Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.
|
||||||
*/
|
*/
|
||||||
|
MBED_DEPRECATED_SINCE("mbed-os-6.0.0", "Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.")
|
||||||
osStatus put(T *data, uint32_t millisec = 0, uint8_t prio = 0)
|
osStatus put(T *data, uint32_t millisec = 0, uint8_t prio = 0)
|
||||||
{
|
{
|
||||||
return osMessageQueuePut(_id, &data, prio, millisec);
|
return put(data, std::chrono::duration<uint32_t, std::milli>(millisec), prio);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get a message or wait for a message from the queue.
|
||||||
|
*
|
||||||
|
* This function retrieves a message from the queue. The message is stored
|
||||||
|
* in the value field of the returned `osEvent` object.
|
||||||
|
*
|
||||||
|
* The timeout specified by the parameter `rel_time` specifies how long the
|
||||||
|
* function waits to retrieve the message from the queue.
|
||||||
|
*
|
||||||
|
* The timeout parameter can have the following values:
|
||||||
|
* - When the timeout is 0, the function returns instantly.
|
||||||
|
* - When the timeout is Kernel::wait_for_u32_forever (default), the function waits
|
||||||
|
* infinite time until the message is retrieved.
|
||||||
|
* - When the timeout is any other value, the function waits for the
|
||||||
|
* specified time before returning a timeout error.
|
||||||
|
*
|
||||||
|
* Messages are retrieved in descending priority order. If two messages
|
||||||
|
* share the same priority level, they are retrieved in first-in, first-out
|
||||||
|
* (FIFO) order.
|
||||||
|
*
|
||||||
|
* @param rel_time Timeout value.
|
||||||
|
* (default: Kernel::wait_for_u32_forever).
|
||||||
|
*
|
||||||
|
* @return Event information that includes the message in event. Message
|
||||||
|
* value and the status code in event.status:
|
||||||
|
* @a osEventMessage Message successfully received.
|
||||||
|
* @a osOK No message is available in the queue, and no
|
||||||
|
* timeout was specified.
|
||||||
|
* @a osEventTimeout No message was received before a timeout
|
||||||
|
* event occurred.
|
||||||
|
* @a osErrorParameter A parameter is invalid or outside of a
|
||||||
|
* permitted range.
|
||||||
|
*
|
||||||
|
* @note You may call this function from ISR context if the rel_time
|
||||||
|
* parameter is set to 0.
|
||||||
|
*/
|
||||||
|
osEvent get(Kernel::Clock::duration_u32 rel_time = Kernel::wait_for_u32_forever)
|
||||||
|
{
|
||||||
|
osEvent event;
|
||||||
|
T *data = nullptr;
|
||||||
|
osStatus_t res = osMessageQueueGet(_id, &data, nullptr, rel_time.count());
|
||||||
|
|
||||||
|
switch (res) {
|
||||||
|
case osOK:
|
||||||
|
event.status = (osStatus)osEventMessage;
|
||||||
|
event.value.p = data;
|
||||||
|
break;
|
||||||
|
case osErrorResource:
|
||||||
|
event.status = osOK;
|
||||||
|
break;
|
||||||
|
case osErrorTimeout:
|
||||||
|
event.status = (osStatus)osEventTimeout;
|
||||||
|
break;
|
||||||
|
case osErrorParameter:
|
||||||
|
default:
|
||||||
|
event.status = osErrorParameter;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
event.def.message_id = _id;
|
||||||
|
|
||||||
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get a message or wait for a message from the queue.
|
/** Get a message or wait for a message from the queue.
|
||||||
|
@ -197,34 +302,13 @@ public:
|
||||||
*
|
*
|
||||||
* @note You may call this function from ISR context if the millisec
|
* @note You may call this function from ISR context if the millisec
|
||||||
* parameter is set to 0.
|
* parameter is set to 0.
|
||||||
|
* @deprecated Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.
|
||||||
*/
|
*/
|
||||||
|
MBED_DEPRECATED_SINCE("mbed-os-6.0.0", "Pass a chrono duration, not an integer millisecond count. For example use `5s` rather than `5000`.")
|
||||||
osEvent get(uint32_t millisec = osWaitForever)
|
osEvent get(uint32_t millisec = osWaitForever)
|
||||||
{
|
{
|
||||||
osEvent event;
|
return get(std::chrono::duration<uint32_t, std::milli>(millisec));
|
||||||
T *data = nullptr;
|
|
||||||
osStatus_t res = osMessageQueueGet(_id, &data, nullptr, millisec);
|
|
||||||
|
|
||||||
switch (res) {
|
|
||||||
case osOK:
|
|
||||||
event.status = (osStatus)osEventMessage;
|
|
||||||
event.value.p = data;
|
|
||||||
break;
|
|
||||||
case osErrorResource:
|
|
||||||
event.status = osOK;
|
|
||||||
break;
|
|
||||||
case osErrorTimeout:
|
|
||||||
event.status = (osStatus)osEventTimeout;
|
|
||||||
break;
|
|
||||||
case osErrorParameter:
|
|
||||||
default:
|
|
||||||
event.status = osErrorParameter;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
event.def.message_id = _id;
|
|
||||||
|
|
||||||
return event;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
osMessageQueueId_t _id;
|
osMessageQueueId_t _id;
|
||||||
char _queue_mem[queue_sz * (sizeof(T *) + sizeof(mbed_rtos_storage_message_t))];
|
char _queue_mem[queue_sz * (sizeof(T *) + sizeof(mbed_rtos_storage_message_t))];
|
||||||
|
|
Loading…
Reference in New Issue