首页 > 其他分享 >c语言模仿kfifo撰写的一个共用代码框架,可根据需要

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

时间:2023-10-17 13:56:53浏览次数:35  
标签:kfifo fifo 共用 size KFIFO uint32 模仿 out

//

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

 

//

标签:kfifo,fifo,共用,size,KFIFO,uint32,模仿,out
From: https://www.cnblogs.com/RYSBlog/p/17769519.html

相关文章

  • 14 | 网络安全:和别人共用Wi-Fi时,你的信息会被窃取吗?
    内网中的最小权限原则对内网进行水平划分:划分不同的身份和权限对内网进行垂直划分:内、外网隔离 有线和无线网络安全无线网络的防护:使用安全协议(WAP2协议),认证技术(“强制门户”,再次认证),以及对办公网络中的未知热点进行扫描,避免伪造热点有线网络安全防护:只需要防护劫持。第一......
  • 13 | Linux系统安全:多人共用服务器,如何防止别人干“坏事”?
    Linux中的安全模型内核层防护:确保使用官方的镜像并保持更新用户层防护:确保正确配置权限 黄金法则应用Linux中的认证机制安全问题:认证是linux内核提供的,在用户层只需要关注弱密码导致的身份信息泄露防护:在/etc/shadow中,制定适当的密码策略;使用已知的弱密码库来检测linux中......
  • 抽取共用API类,并用 Maven打包成 jar
    抽取共用API类,并用Maven打包成jar可以解压e_commerce....jar可以看到打包后的.class文件测试成功!!!......
  • app测试日常踩坑——新老版本共用缓存问题
    需求:在测一个页面,老版本就存在的一个页面(多个模块,一个接口分成三次请求返回),但是新版本要新增一个模块。老的页面的实现方式是页面直接读取redis数据(还有其他逻辑,方便解释暂时这样说),截取模块的方式来分接口返回,新增的一个模块是要放在中间。方案:方案是沿用老的redis缓存,在老得缓存......
  • C语言-结构体、共用体,内存管理
    结构体结构体的定义及变量使用#include<stdio.h>#include<string.h>structstudent{charname[20];intage;charsex;}stu3;//定义结构体的同时定义结构体变量。此时是全局变量intmain(intargc,charconst*argv[]){structstudentstu1,s......
  • union共用体
    一、总结1.共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。2.当一个共用体被声明时,编译程序自动地产生一个变量,其长度为联合中类型字节数最多的变......
  • 共用体详解
    共用体同结构体的定义形式上相同,只是把关键字struct改为union。有时需要把几种不同类型的变量放在同有一内存区域中,见图12-6,把一个整型变量,一个字符变量,一个实型变量放在同一内存区域中,尽管三个变量占用字节数各不相同,但起始地址都一样(例如1000)它要用“覆盖’’技术,使多个变量互相......
  • Qt模仿多标签页窗口拖拽操作
    本功能的实现主要依托于Qt的拖拽操作。从本文可以学到Qt的拖拽机制,自定义QMimeData的数据类型,和自定义的QGraphicsEffect效果。本文的视觉特效是应用于拖拽的时候指示当前鼠标的位置和拖拽结果新标签页会放置在当前窗口的第几个标签页之后。以下是窗口的效果图片,为了方便标签是用......
  • oracle查看所有用户_Oracle实用命令查看共用一个表空间的所有用户
    oracle查看所有用户_Oracle实用命令查看共用一个表空间的所有用户news2023/8/1413:13:55概述有朋友问到如何查出表空间都被哪些用户使用的一些方法,因为有几种情况需要考虑,也顺便做个总结。需求:如何查看共用一个表空间的所有用户查看某表空间下表的所有者使用dba用户......
  • C# 仿写 共用体
       [StructLayout(LayoutKind.Explicit,CharSet=CharSet.Ansi,Pack=1)]   publicstructstrUion   {       [FieldOffset(0)]       publicushortcrc16;       [FieldOffset(0)]       publicbytecrc16L;       [......