# node-queue **Repository Path**: plant-some-trees/node-queue ## Basic Information - **Project Name**: node-queue - **Description**: 本项目是一个简单的环形节点队列缓冲区实现,适用于嵌入式系统。 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-03 - **Last Updated**: 2025-09-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 节点队列 =========== 专为嵌入式系统设计的节点队列(循环节点队列缓冲),图示如下: +---------------------------------------------------------------------+ | 节点队列(NODE_QUEUE_t)结构体 | |---------------------------------------------------------------------| | *base → [Buffer 数据缓冲区] (连续内存,循环使用) | | size=512 | 0x00 | 0x01 | ... | 0x1FF | | | len (当前已用长度,例如 300) | | | | *node → [节点(NODE_t)数组] (管理数据块) | | max=20 +------------+------------+------------+-----+ | | | NODE_t[0] | NODE_t[1] | NODE_t[2] | ... | | | num=5 +------------+------------+------------+-----+ | | cnt=2 | rdy=1 | rdy=1 | rdy=0 | | | | | len=100 | len=200 | len=0 | | | | | *addr=base | *addr=base+100 | NULL | | | +---------------------------------------------------------------------+ 是将数据缓冲区分作n个节点进行管理,每个节点的长度(len)可以不同。 数据缓冲区的大小必须是2的幂次,节点缓冲区最多可以包含 buff_size-1 字节。 采用宏初始化更加方便:#define NQ_INIT(nq, buf, node) node_queue_init(nq, buf, sizeof(buf), node, sizeof(node)/sizeof(NODE_t)) 如下,初始化一个节点队列缓冲区: ```c NODE_t node[20]; uint8_t buff[512]; NODE_QUEUE_t node_queue; NQ_INIT(&node_queue, buff, node); ``` 在这个例子中,节点个数为20个,缓冲区大小为512字节,也就是说可以将512字节分成20份不同大小的节点,节点队列就是对这个缓冲区进行管理。 该模块为访问节点队列缓冲区提供了以下功能(相关文档可在 node_queue.h 中找到): ```c /* 初始化节点队列 */ void node_queue_init(NODE_QUEUE_t *nq, uint8_t *base, uint16_t size, NODE_t *node, uint8_t max); /* 清空节点队列 */ void node_queue_clear(NODE_QUEUE_t *nq); /* 获取节点队列已收到的数据条数 */ uint8_t node_queue_num_items(NODE_QUEUE_t *nq); /* 查询当前节点队列入队的长度 */ uint16_t node_queue_node_length(NODE_QUEUE_t *nq); /* 查询当前节点队列缓存可用空间 */ uint16_t node_queue_free_space(NODE_QUEUE_t *nq); /* 向节点队列中插入1个字节 */ uint8_t node_queue_insert_byte(NODE_QUEUE_t *nq, uint8_t indt, NQ_SW_t sw); /* 向节点队列中插入多个字节 */ uint16_t node_queue_insert_buffer(NODE_QUEUE_t *nq, uint8_t *buff, uint16_t buflen, NQ_SW_t sw); /* 查看节点队列中数据, 但不删除数据 */ uint16_t node_queue_peek(NODE_QUEUE_t *nq, uint8_t *dst, uint16_t length); /* 从节点队列中读取数据, 读完后清空 */ uint16_t node_queue_read(NODE_QUEUE_t *nq, uint8_t *dst); ```