# CirBuff **Repository Path**: openes/cirbuff ## Basic Information - **Project Name**: CirBuff - **Description**: 循环缓冲器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-08-15 - **Last Updated**: 2025-07-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 实现功能:循环缓冲器 * 使用说明: 1. 调用cir_buf_init函数初始化循环缓冲器 2. 调用cir_buf_put函数向循环缓冲区写入一个数据 3. 调用cir_buf_get函数从循环缓冲区读取一个数据 * 示例代码: ```c CIR_BUFF cir_buff; int data_src[100]; int main(void) { int put_data = 0; cir_buf_init(&cir_buff, data_src, sizeof(int), 100); /* 向循环缓冲区写数据 */ put_data = 1; cir_buf_put(&cir_buff, &put_data); put_data = 2; cir_buf_put(&cir_buff, &put_data); put_data = 3; cir_buf_put(&cir_buff, &put_data); /* 从循环缓冲区读数据 */ printf("%d\n", *(int *)cir_buf_get(&cir_buff)); printf("%d\n", *(int *)cir_buf_get(&cir_buff)); printf("%d\n", *(int *)cir_buf_get(&cir_buff)); return 0; } ``` * 附加一个使用宏定义方式实现循环队列 ```c // 缓冲区指针 a 前移,若已超出缓冲区右侧,则指针循环 #define RING_INC(a) ((a) = (a) < (RING_BUF_SIZE-1) ? (a)+1 : 0) // 获取循环队列 queue 中已存放的数据个数 #define RING_NUMS(queue) ((queue)->len) // 往循环队列 queue 中放入一个数据 #define RING_PUT(c, queue) \ (void)({(queue)->buf[(queue)->head] = (c); RING_INC((queue)->head); (queue)->len < RING_BUF_SIZE ? (queue)->len++ : RING_INC((queue) ->tail);}) // 从循环队列 queue 中取出一个数据 #define RING_GET(queue, c) \ (void)({c = (queue)->buf[(queue)->tail]; RING_INC((queue)->tail); (queue)->len ? (queue)->len-- : 0;}) /******************************************** 使用说明 ******************************************************** * 使用前先定义以下内容 * #define RING_BUF_SIZE 8 // 定义循环队列的缓冲区存放的最大数据个数 * struct RingQueue * { * U32 head; // 循环队列缓冲区中数据头指针 * U32 tail; // 循环队列缓冲区中数据尾指针 * U32 len; // 循环队列缓冲区数据长度 * U32 buf[RING_BUF_SIZE]; // 循环队列的缓冲区,根据需要更改为自己需要的数据结构,struct 结构体也是可以的 * }; * struct RingQueue myQueue; // 实例化一个循环队列 * RING_PUT(1, &myQueue); // 往循环队列中放入一个数据 * U32 data; RING_GET(&myQueue, data); // 从循环队列中取出一个数据 *************************************************************************************************************/ ```