单字节的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】P2953牛的数字游戏(博弈论)
题目链接 自己乱搞……然后一遍AC啦! 思路从基本的必胜态和必败态开始分析.我们把减去最大数得到的数叫作Max,减去最小数得到的数叫作Min. 那么开始分析. 一.0是必败态. 这个没法解释.题目就这 ...
- 【Luogu】P1967货车运输(最大生成森林+倍增LCA)
题目链接 倍增LCA是个什么蛇皮原理啊,循环完了还得再往上跳一次才能到最近公共祖先 合着我昨天WA两次就是因为这个 建最大生成森林,因为图不一定是联通的,所以不一定是一棵树.这个地方用克鲁斯卡尔就好了 ...
- [COI2007] Patrik 音乐会的等待 (单调栈,模拟)
题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...
- KD-Tree 的笔记
声明: 蒟蒻对于 KD-Tree 的一点理解,写在博客里面作为笔记. 1.KD-Tree 的定义 1)关于 K-D KD-Tree 中的 D 即为 Dimension ,意思也就是维度. 所以 KD- ...
- 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it
http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...
- 互不侵犯King(bzoj 1087)
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...
- 栅格网络流(cogs 750)
[问题描述] Bob 觉得一般图的最大流问题太难了,他不知道如何解决,于是他想尝试一个简单点的:栅格网络中的最大流问题,这个虽说简单了一点,但对 Bob 来说依旧太难,现在他有个麻烦需要你帮忙:给你一 ...
- 云计算与 OpenStack
“云计算” 算是近年来最热的词了.现在 IT 行业见面不说这三个字您都不好意思跟人家打招呼. 对于云计算,学术界有各种定义,大家有兴趣可以百度一下. CloudMan 这里主要想从技术的角度谈谈对云计 ...
- net8:XML的读写操作【广告控件的XML文件实例】
原文发布时间为:2008-08-05 -- 来源于本人的百度文章 [由搬家工具导入] 【用了datalist控件,datalist控件自己学会,主要知道其他按钮COMMANDNAME属性应该改为edi ...
- yii 之数据库关联查询
<?php namespace app\controllers; use yii\web\Controller; use app\models\Customer; class CustomerC ...