单字节的FIFO缓存(30天自制操作系统--读书笔记)
从今天起,写一些读书笔记。最近几个月都在看《30天自制操作系统这本书》,书虽说看的是电子书,但可以花钱买的正版书,既然花费了金钱,就总得有些收获。
任何人都不能总是固步自封,想要进步就得学习别人的知识,对于程序员而言,最简单的方法即是学习别人的代码。
今天的标题是“单字节的FIFO缓存”,其实就是做一个FIFO,看名字就知道了。也就4个函数和1个相关结构体,这样的小代码在嵌入式系统中很常用,也会很好用。
1、相关数据结构体
struct FIFO8
{
unsigned char *buf; //实际存放数据的内存
int w_pos,r_pos,size,free_left,flags;
//w_pos是对缓存写入位置的记录
//r_pos是对缓存读出位置的记录
//size是缓存的数据大小
//free_left是缓存中空出来的可供写入数据的空间大小
//flags是标志记录
}
2、初始化一个缓存空间
void fifo8_init(struct FIFO8 *fifo,int size,unsigned char *buf)
{
fifo->buf = buf;
fifo->size = size;
fifo->w_pos = ;
fifo->r_pos = ;
fifo->free_left = size;
fifo->flags = ;
}
3、向缓存中加入一个数据
int fifo8_put(struct FIFO8 *fifo,unsigned char data)
{
if(fifo->free_left == )
{
fifo->flags |= FLAG_OVERRUN; //define FLAG_OVERRUN 1
return -;
}
//free_left的判断标准就是
//写人一个数据free_left减一,读出一个数据free_left加一,
//最开始的时候,free_left为缓存大小,也就是整个缓存都是可以被写入的
fifo->buf[fifo->w_pos] = data;
fifo->w_pos++;
if(fifo->w_pos == fifo->size)
{
fifo->w_pos = ; //对写指针进行位置限定
}
fifo->free_left --;
return ;
}
4、从缓存中取出一个数据
int fifo8_get(struct FIFO8 *fifo)
{
int data;
if(fifo->free_left == fifo->size)
{
return -; //整个缓冲区都是空的,也就没有数据可读
}
data = fifo->buf[fifo->r_pos];
fifo->r_pos ++;
if(fifo->r_pos == fifo->size)
{
fifo->r_pos = ; //读取位置重定位
}
fifo->free_left++;
return data; //注意data是unsigned char型,返回值是int型
}
5、获取缓存区的状态 (缓存区有无数据可读)
int fifo8_status(struct FIFO8 *fifo)
{
return (fifo->size - fifo->free_left);
//缓存大小减去空着的大小,即缓存中存于数据的个数
}
如何使用上述“单字节的FIFO缓存”代码,这个就很简单了:
1、先初始化
unsigned char buf_for_fifo[32];//定义缓存本身
struct FIFO8 testFifo; //定义缓存结构体
fifo8_init(&testFifo,32,buf_for_fifo); //调用此函数即完成了初始化
2、在需要的地方向缓存区中写数据
ret = fifo8_put(&testFifo,1); //向缓存区中写数据1
3、在需要的地方查询缓存中有无存放数据,并读取出来
if(fifo8_status(&testFifo) > 0)
{
data = fifo8_get(&testFifo);
//处理这些数据即可
}
以上代码设计的要点就是数据结构体设计,另外代码具有良好的可移植性,其关键操作代码中,传入的参数都是其核心数据结构的指针,这一点是不是很像C++中的this指针。
今天到此为止。
单字节的FIFO缓存(30天自制操作系统--读书笔记)的更多相关文章
- 《30天自制操作系统》笔记(06)——CPU的32位模式
<30天自制操作系统>笔记(06)——CPU的32位模式 进度回顾 上一篇中实现了启用鼠标.键盘的功能.屏幕上会显示出用户按键.点击鼠标的情况.这是通过设置硬件的中断函数实现的,可以说硬件 ...
- 《30天自制操作系统》笔记(02)——导入C语言
<30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】
转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...
- 《30天自制操作系统》笔记3 --- (Day2 上节)完全解析文件系统
Day2 汇编语言学习与Makefile入门 本文仅带着思路,研究源码里关于文件系统的参数 关于day2主程序部分及更多内容,请看<30天自制操作系统>笔记 导航 发现学习中的变化 源码差 ...
- 《30天自制操作系统》笔记(03)——使用Vmware
<30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...
- 《30天自制操作系统》笔记2 --- 初步了解汇编产生的二进制(Day1)
nask.exe应该就是nas kit(nas开发工具的意思),由于这个编译器是作者自己写的,所以这种汇编语言应该是作者改造出来的,所以我叫它nas汇编语言. 作者说nask是模仿nasm语法的,关于 ...
- 《30天自制操作系统》笔记4 --- (Day2 下节)了解如何用汇编写操作系统中的HelloWorld
关于上一节,我测试了发现3e.4c.4e都OK ,4b 4d 4f都进不去系统还把qemu卡死了. 50不会输出HelloWorld,可能需要hex偶数且在0x3e~4f区间吧.上节复制并运行命令如下 ...
- 《30天自制操作系统》笔记5 --- (Day3)
这个专题荒废了许久,今天补点东西 不够准确的小结 用汇编来开发操作系统,就是使用汇编本身的功能再加上BIOS中断提供的功能来完成功能的过程. 汇编本身的功能不够,毕竟没有外部IO,所以通过给多个寄存器 ...
随机推荐
- 刷题总结——小凸玩矩阵(scoi)
题目: 题目背景 SCOI2015 DAY1 T1 题目描述 小凸和小方是好朋友,小方给了小凸一个 n×m(n≤m)的矩阵 A,并且要求小凸从矩阵中选出 n 个数,其中任意两个数都不能在同一行或者同一 ...
- 【php wamp的配置】
- 圆桌聚餐(cogs 729)
«问题描述:假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为ri(i=1,2,3...m), .会议餐厅共有n张餐桌,每张餐桌可容纳c i(i=1,2...n) 个代表就餐.为了 ...
- 标准C程序设计七---20
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- FastDFS上传/下载过程[转载-经典图列]
FastDFS上传/下载过程: 首先客户端 client 发起对 FastDFS 的文件传输动作,是通过连接到某一台 Tracker Server 的指定端口来实现的,Tracker Server 根 ...
- 用GDB远程调试android native程序
上次写了几个native程序,想着如何调试,经过一阵子搜索和测试,终于完成了.有几个关键点: 1 gdb和gdbserver 因为这两个需要配套,建议使用同一个ndk下面的gdb和gdbserver ...
- P2085 最小函数值 洛谷
https://www.luogu.org/problem/show?pid=2085 题目描述 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*) ...
- Java I/O概述
Java的I/O通过java.io包下的类.接口来支持.在java.io包下主要包括输入.输出两种IO流,每种输入.输出流又可分为字符流.字节流两大类. 字符流以字符为单位处理输入.输出操作,字节流以 ...
- Nginx负载均衡配置实例(转)
1.轮询 轮询即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器.配置的例子如下: http{ upstream sampleapp { serv ...
- iOS WKWebView添加网页加载进度条(转)
一.效果展示 WKWebProgressViewDemo.gif 二.主要步骤 1.添加UIProgressView属性 @property (nonatomic, strong) WKWebView ...