12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #ifndef __QUEUE_H
- #define __QUEUE_H
- /**@brief 队列模式类型
- * @details
- * Also, it keeps the information about which memory is allocated for the buffer
- * and its size. This structure must be initialized by app_fifo_init() before use.
- */
- typedef enum
- {
- QUEUE_MODE_OVERFLOW, //!< If the queue is full, new element will overwrite the oldest.
- QUEUE_MODE_NO_OVERFLOW, //!< If the queue is full, new element will not be accepted.
- } queue_mode_t;
- /**@brief A FIFO instance structure.
- * @details Keeps track of which bytes to read and write next.
- * Also, it keeps the information about which memory is allocated for the buffer
- * and its size. This structure must be initialized by app_fifo_init() before use.
- */
- typedef enum
- {
- size_4 = 0x0004U,
- size_8 = 0x0008U,
- size_16 = 0x0010U,
- size_32 = 0x0020U,
- size_64 = 0x0040U,
- size_128 = 0x0080U,
- size_256 = 0x0100U,
- size_512 = 0x0200U,
- size_1024 = 0x0400U,
- size_2048 = 0x0800U,
- size_4096 = 0x1000U,
- size_8192 = 0x2000U,
- size_16384 = 0x4000U,
- size_32768 = 0x8000U,
- } queue_size_t;
- typedef struct
- {
- volatile unsigned short front; //!< Queue front index.
- volatile unsigned short back; //!< Queue back index.
- void * p_buffer; //!< Pointer to the memory that is used as storage.
- queue_size_t size; //!< Size of the queue.
- unsigned short element_count;
- unsigned short element_size; //!< Size of one element.
- queue_mode_t mode;
- } queue_t;
- /******************************API 接口*************************************/
- #define QUEUE_DEF(element_type, _name, _size, _mode) \
- element_type _name##_queue_buffer[(_size)]; \
- queue_t _name= \
- { \
- .front = 0, \
- .back = 0, \
- .p_buffer = _name##_queue_buffer, \
- .size = (_size), \
- .element_count = 0, \
- .element_size = sizeof(element_type), \
- .mode = _mode, \
- }
- //元素进队列
- unsigned short queue_in(queue_t * p_queue, void const * p_element);
- //元素出队列
- unsigned short queue_out(queue_t * p_queue, void * p_element);
- //查看队列中最后一个元素,队列中元素并没有减少
- unsigned short queue_peek(queue_t * p_queue, void * p_element);
- //清空队列
- void queue_reset(queue_t * p_queue);
- //获取队列中元素个数
- unsigned short queue_element_count(queue_t * p_queue);
- //查看队列中指定数组下标的元素的从最早进入队列的元素下标index==0开始算
- unsigned short queue_read(queue_t * p_queue, void * p_element ,int index);
- //扔掉掉列最后一个元素
- unsigned short queue_throw_element(queue_t * p_queue);
- #endif
|