# embed_ringbuffer **Repository Path**: jhembed/embed_ringbuffer ## Basic Information - **Project Name**: embed_ringbuffer - **Description**: 一款纯C99标准实现的嵌入式优化的循环缓冲区,DMA零内存拷贝技术。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2024-04-13 - **Last Updated**: 2025-09-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ```c /* * main.c * * Created on: 2024年4月12日 * Author: hello */ #include #include "rb.h" #define debug_printf(...) do{printf(__VA_ARGS__);fflush(stdout);}while(0) // 缓冲区大小 #define QUEUE_SIZE 16 // 缓冲区对象 rb_t rb; // 缓冲区 char payload[QALIGN4(QUEUE_SIZE)]; int main() { char* ptr; char buf[64]; int len; // 初始化 rb_init(&rb, QUEUE_SIZE, payload, NULL, NULL); // 获取大小 debug_printf("size: %d \n", rb_get_size(&rb)); // 写 len = rb_write(&rb, "helloworld", 10); debug_printf("actual write %d bytes ! \n", len); // 读 len = rb_read(&rb, buf, len); buf[len] = 0; debug_printf("actual read %d bytes: %s \n", len, buf); // 查询使用量 len = rb_get_used(&rb); debug_printf("used: %d \n", len); // 获取连续内存写地址(用于给DMA接收) ptr = rb_get_write_linear_buffer(&rb, &len); debug_printf("write linear buffer length: %d \n", len); // 模拟被DAM写入数据 memset(buf, 'A', len); memcpy(ptr, buf, len); // 跳写(只移动写指针位置,在DMA接收完成之后执行) len = rb_write_skip(&rb, len); debug_printf("skip write %d bytes ! \n", len); // 查询使用量 len = rb_get_used(&rb); debug_printf("used: %d \n", len); // 窥读(只读出数据,不会移动读指针) len = rb_read_peek(&rb, buf, len); buf[len] = 0; debug_printf("peek read %d bytes: %s \n", len, buf); // 查询使用量 len = rb_get_used(&rb); debug_printf("used: %d \n", len); // 获取连续内存读地址(用于给DMA发送) ptr = rb_get_read_linear_buffer(&rb, &len); debug_printf("read linear buffer size: %d \n", len); // 模拟被DMA发送出去了 memcpy(buf, ptr, len); buf[len] = 0; debug_printf("read linear buffer data: %s \n", buf); // 跳读(只移动读指针位置,在DMA发送完成之后执行) len = rb_read_skip(&rb, len); debug_printf("skip read %d bytes \n", len); // 查询使用量 len = rb_get_used(&rb); debug_printf("used: %d \n", len); return 0; } /* 运行结果: size: 16 actual write 10 bytes ! actual read 10 bytes: helloworld used: 0 write linear buffer length: 7 skip write 7 bytes ! used: 7 peek read 7 bytes: AAAAAAA used: 7 read linear buffer length: 7 skip read 7 bytes used: 0 */ ```