1915_开源C语言实现的通用队列

经常在工作中遇到一些队列处理的场景,以前要么是借用FreeRTOS这样的系统中的相关功能,要么是通过数组做一个简单的队列模型。但是,这两种方案都具有一定的局限性能,前者要求的FreeRTOS不见得相应的软件中有,而后者只能够是设计专用的功能。为此,尝试找了一个开源的通用方案。
参考链接: GitHub - SMFSW/cQueue: Queue handling library (written in plain c)

● Initialize a Queue using q_init(Queue_t * pQ, size_t size_rec, uint16_t nb_recs, QueueType type, bool overwrite):pQ - pointer to the queue struct

○ size_rec - size of a record in the queue

○ nb_recs - number of records in the queue

○ type - queue implementation type: FIFO, LIFO

○ overwrite - overwrite previous records when queue is full if set to true

● OR a statically allocated Queue using q_init_static(Queue_t * pQ, size_t size_rec, uint16_t nb_recs, QueueType type, bool overwrite, void * pQDat, size_t lenQDat):pQ - pointer to the queue struct

○ size_rec - size of a record in the queue

○ nb_recs - number of records in the queue

○ type - queue implementation type: FIFO, LIFO

○ overwrite - overwrite previous records when queue is full if set to true

○ pQDat - pointer to static data queue

○ lenQDat - length of static data queue (in bytes)

● Push stuff to the queue using q_push(Queue_t * pQ, void * rec)returns true if successfully pushed into queue

○ returns false is queue is full

● Pop stuff from the queue using q_pop(Queue_t * pQ, void * rec) or q_pull(Queue_t * pQ, void * rec)returns true if successfully popped from queue

○ returns false if queue is empty

● Peek stuff from the queue using q_peek(Queue_t * pQ, void * rec)returns true if successfully peeked from queue

○ returns false if queue is empty

● Drop stuff from the queue using q_drop(Queue_t * pQ)returns true if successfully dropped from queue

○ returns false if queue is empty

● Peek stuff at index from the queue using q_peekIdx(Queue_t * pQ, void * rec, uint16_t idx)returns true if successfully peeked from queue

○ returns false if index is out of range

○ warning: no associated drop function, not to use with q_drop

● Peek latest stored from the queue using q_peekPrevious(Queue_t * pQ, void * rec)returns true if successfully peeked from queue

○ returns false if queue is empty

○ warning: no associated drop function, not to use with q_drop

○ note: only useful with FIFO implementation, use q_peek instead with a LIFO

● Other methods:q_isInitialized(Queue_t * pQ): true if initialized properly, false otherwise

○ q_isEmpty(Queue_t * pQ): true if empty, false otherwise

○ q_isFull(Queue_t * pQ): true if full, false otherwise

○ q_sizeof(Queue_t * pQ): queue size in bytes (returns 0 in case queue allocation failed)

○ q_getCount(Queue_t * pQ) or q_nbRecs(Queue_t * pQ): number of records stored in the queue

○ q_getRemainingCount(Queue_t * pQ): number of records left in the queue

○ q_clean(Queue_t * pQ) or q_flush(Queue_t * pQ): remove all items in the queue

就这个模块库提供的基本功能来说还是很全面了,尤其是针对小型的嵌入式系统,提供的这种静态创建的方式非常不错。

接下来,针对常用的接口做个简单的测试:

复制代码
#include <stdio.h>`
`#include <stdint.h>`
`#include "cQueue.h"`

`Queue_t queue_hanlde;`
`uint8_t * queue_data[5];`
`uint8_t a = 1U;`
`uint8_t b = 2U;`
`uint8_t c = 3U;`
`uint8_t d = 4U;`

`void queue_lld_init(void)`
`{`
`    (void)q_init_static(&queue_hanlde, sizeof(uint8_t *), 5U, FIFO, false, queue_data, sizeof(uint8_t *) * 5);`
`}`

`int main(void)`
`{`
`    uint8_t *rec;`

`    printf("test for queue.\n");`
`    printf("initialize the queue.\n");`
`    queue_lld_init();`

`    printf("size of queue: %d\n", q_sizeof(&queue_hanlde));`
`    printf("count of queue: %d\n", q_getCount(&queue_hanlde));`

`    printf("push data...\n");`
`    printf("count of queue: %d\n", q_getCount(&queue_hanlde));`
`    printf("remaining count: %d\n", q_getRemainingCount(&queue_hanlde));`
`    rec = &a;`
`    q_push(&queue_hanlde, &rec);`
`    printf("count of queue: %d\n", q_getCount(&queue_hanlde));`
`    printf("remaining count: %d\n", q_getRemainingCount(&queue_hanlde));`
`    rec = &b;`
`    q_push(&queue_hanlde, &rec);`
`    printf("count of queue: %d\n", q_getCount(&queue_hanlde));`
`    printf("remaining count: %d\n", q_getRemainingCount(&queue_hanlde));`
`    rec = &c;`
`    q_push(&queue_hanlde, &rec);`
`    printf("count of queue: %d\n", q_getCount(&queue_hanlde));`
`    printf("remaining count: %d\n", q_getRemainingCount(&queue_hanlde));`
`    rec = &d;`
`    q_push(&queue_hanlde, &rec);`
`    printf("count of queue: %d\n", q_getCount(&queue_hanlde));`
`    printf("remaining count: %d\n", q_getRemainingCount(&queue_hanlde));`
`    printf("push data done...\n");`

`    printf("pop data...\n");`
`    q_pop(&queue_hanlde, &rec);`
`    printf("count of queue: %d\n", q_getCount(&queue_hanlde));`
`    printf("remaining count: %d\n", q_getRemainingCount(&queue_hanlde));`
`    printf("data 1: %d\n", *rec);`
`    q_pop(&queue_hanlde, &rec);`
`    printf("count of queue: %d\n", q_getCount(&queue_hanlde));`
`    printf("remaining count: %d\n", q_getRemainingCount(&queue_hanlde));`
`    printf("data 2: %d\n", *rec);`
`    q_pop(&queue_hanlde, &rec);`
`    printf("count of queue: %d\n", q_getCount(&queue_hanlde));`
`    printf("remaining count: %d\n", q_getRemainingCount(&queue_hanlde));`
`    printf("data 3: %d\n", *rec);`
`    q_pop(&queue_hanlde, &rec);`
`    printf("count of queue: %d\n", q_getCount(&queue_hanlde));`
`    printf("remaining count: %d\n", q_getRemainingCount(&queue_hanlde));`
`    printf("data 4: %d\n", *rec);`

`    return 0;`
`}`
`

测试运行效果:

这里只是做了一个简单的功能性的尝试,这个模块的优点还在于具备了类似FreeRTOS的复用性。有这样的功能之后,一些嵌入式中的处理功能写起来就更加得心应手了。

相关推荐
mlidongfeng8 分钟前
[AI][C++26] SIMD 编程模型思考
开发语言·c++·人工智能
j7~8 分钟前
【Linux】二十七.线程篇四《Linux多线程编程:线程互斥(互斥量的底层到封装)、线程安全和冲入、死锁》---详解
linux·开发语言·c++·线程安全·死锁·线程互斥·重入
刘名喜18 分钟前
第09篇-协程基础-Kotlin异步编程
开发语言·kotlin·springboot
其实防守也摸鱼23 分钟前
HackBar 工具完全指南:信息探测、漏洞验证与安全测试实战
开发语言·人工智能·学习·安全·网络安全·安全威胁分析·安全性测试
会博通·代码搬运工36 分钟前
会博通API对接实战:工程企业文档分布式采集系统的技术实现与Python SDK详解
开发语言·分布式·python·线性代数·矩阵·架构·电子档案合规
(Charon)1 小时前
【C++】手写 MySQL 连接池(三):异步任务队列与工作线程
c语言·c++
林森lsjs1 小时前
完结撒花!Java SE 语法阶段总结!
java·开发语言
lupai1 小时前
短信接口快速接入与调用实战指南
java·开发语言·数据库
刘名喜1 小时前
第12篇-Gradle-Kotlin-DSL构建指南
开发语言·kotlin·springboot
大鱼>1 小时前
DSPy:LLM程序自动编译与提示词优化
开发语言·人工智能·python·深度学习