单字节的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,所以通过给多个寄存器 ...
随机推荐
- 【Luogu】P1972HH的项链(链表+树状数组)
题目链接 难题,所以会讲得细一些. 首先我们想如何统计区间[l,r]内不同贝壳的个数. 第一个思路就是线段树/树状数组,query(1,r)-query(1,l-1)对不对? 然而这样是不对的. 然后 ...
- 【Luogu】P1586四方定理(DP)
题目链接 此题使用DP.设f[i][j]表示数i用j个数表示,则对于所有的k<=sqrt(i),有 f[i][j]=∑f[i-k*k][j-1] 但是这样会有重复情况.所以先枚举k,再枚举i和j ...
- 深入了解类加载过程及Java程序执行顺序
前言 在Java中,静态 Static关键字使用十分常见 本文全面 & 详细解析静态 Static关键字,希望你们会喜欢 目录 1. 定义 一种 表示静态属性的 关键字 / 修饰符 2. 作用 ...
- USACO Hamming Codes
题目大意:求n个两两hamming距离大于等于d的序列,每个元素是一个b bit的数 思路:仍然暴力大法好 /*{ ID:a4298442 PROB:hamming LANG:C++ } */ #in ...
- Biorhythms(poj 1006)
Description 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰 ...
- 使用FL2440之问题1
随机送的usb转串口线(一头usb一头9针,蓝色),写明HL340,装上驱动后运行正常,但电脑设备管理器显示的却是CH340,以前还用过PL2303,百度总结一下他们的区别: CH340,PL2303 ...
- Redis命令行之Set
一.Redis之Set简介 1. Set是String类型的无序集合(元素成员唯一). 2. Set是通过hash表实现的,添加.删除.查找的复杂度都是O(1). 3. 每个集合最大成员数为232-1 ...
- css可见性
overflow:hidden: 溢出隐藏 visibility:hidden: 隐藏元素,隐藏之后还占据原来的位置 display:none: 隐藏元 ...
- DBA总结
HA MHA(1)从宕机崩溃的master保存二进制日志事件(binlog events);(2)识别含有最新更新的slave:(3)应用差异的中继日志(relay log)到其他的slave:(4) ...
- VS2015 当前不会命中断点,还没有为该文档加载任何符号
这种小问题,我想只需要清理解决方案重新生成就好啦,结果...2个小时过去后.. 最后问了昨天做过修改的同事,修改了什么.. 设置成生成调试信息,仅以此文纪念我那逝去的青春