c语言模仿kfifo撰写的一个共用代码框架,可根据需要
//
// kfifo 简化版本,根据需要进行改装 // 定义KFIFO结构体 typedef struct { uint8_t *buffer; // 缓冲区指针 uint32_t size; // 缓冲区大小, 如果要求是 2^n-1 可以将取余操作修改为按位与操作,同时修改其他相关信息 volatile uint32_t in; // 入队指针 volatile uint32_t out;// 出队指针 } KFIFO; // 初始化KFIFO void kfifo_init(KFIFO *fifo, uint8_t *buffer, uint32_t size) { fifo->buffer = buffer; fifo->size = size; fifo->in = 0; fifo->out = 0; } // 向KFIFO中写入数据//再次归0时,跳过一个周期,取数据时检测并调整out void kfifo_put(KFIFO *fifo, uint8_t data) { fifo->buffer[fifo->in % fifo->size] = data; fifo->in++; if(fifo->in==0){fifo->in=fifo->size;} } // 从KFIFO中读取数据 uint8_t kfifo_get(KFIFO *fifo) { uint8_t data = fifo->buffer[fifo->out % fifo->size]; fifo->out++; return data; } // 判断KFIFO是否为空//取数据时进行判断,并强制将out归位,保证最大差别是一个周期 bool kfifo_is_empty(KFIFO *fifo) { uint32_t in=fifo->in; uint32_t out=fifo->out; if(in==out){return true;}//无数据 if(out>in){ out=out%fifo->size; } uint32_t flag=in - out; if(flag>fifo->size){ fifo->out=fifo->in-fifo->size; } return false; } // 判断KFIFO是否已满//在归零时,会有一定的误差,但是不影响整体存放数据 bool kfifo_is_full(KFIFO *fifo) { uint32_t in=fifo->in; uint32_t out=fifo->out; if(out>in){return true;} return (in - out) >= fifo->size; }
//