c语言模仿kfifo撰写的一个共用代码框架,可根据需要

发布时间 2023-10-17 13:55:03作者: 小城熊儿

//

// 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;
}

 

//