diff options
| author | liuxianliang <[email protected]> | 2021-10-13 15:20:29 +0800 |
|---|---|---|
| committer | liuxianliang <[email protected]> | 2021-10-13 15:20:29 +0800 |
| commit | 9f2616e32313bd3c642ed46e72707f80f8272de3 (patch) | |
| tree | 26803569a833e7751a70a6f20e9fc68ca0981730 /components/cplusplus/cxx_queue.h | |
| parent | 0211f2fcc191f37a7a3eb54aadfbbc9d226d15f0 (diff) | |
[modify] those file name is risky if you use both "c++" and "POSIX pthread".
Diffstat (limited to 'components/cplusplus/cxx_queue.h')
| -rw-r--r-- | components/cplusplus/cxx_queue.h | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/components/cplusplus/cxx_queue.h b/components/cplusplus/cxx_queue.h new file mode 100644 index 0000000000..f6b91e1a21 --- /dev/null +++ b/components/cplusplus/cxx_queue.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2016/10/1 Bernard The first version + */ + +#pragma once + +#include <stdint.h> +#include <string.h> + +#include <rtthread.h> + +namespace rtthread { + +/** + * The Queue class allow to control, send, receive, or wait for messages. + * A message can be a integer or pointer value to a certain type T that is send + * to a thread or interrupt service routine. + * @param T data type of a single message element. + * @param queue_sz maximum number of messages in queue. + */ +template<typename T, uint32_t queue_sz> +class Queue +{ +public: + /** Create and initialise a message Queue. */ + Queue() + { + rt_mq_init(&mID, "mq", mPool, sizeof(T), sizeof(mPool), RT_IPC_FLAG_FIFO); + }; + + ~Queue() + { + rt_mq_detach(&mID); + }; + + /** Put a message in a Queue. + @param data message pointer. + @param millisec timeout value or 0 in case of no time-out. (default: 0) + @return status code that indicates the execution status of the function. + */ + rt_err_t put(T& data, int32_t millisec = 0) + { + return rt_mq_send(&mID, &data, sizeof(data)); + } + + /** Get a message or Wait for a message from a Queue. + @param millisec timeout value or 0 in case of no time-out. (default: osWaitForever). + @return bool . + */ + bool get(T& data, int32_t millisec = WAIT_FOREVER) + { + rt_int32_t tick; + + if (millisec < 0) + tick = -1; + else + tick = rt_tick_from_millisecond(millisec); + + return rt_mq_recv(&mID, &data, sizeof(data), tick) == RT_EOK; + } + +private: + struct rt_messagequeue mID; + + char mPool[(sizeof(void *) + RT_ALIGN(sizeof(T), RT_ALIGN_SIZE)) * queue_sz]; +}; + +} |
