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;
}
复制代码

 

//

posted @   小城熊儿  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示