单字节的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,所以通过给多个寄存器 ...
随机推荐
- Codeforces 895.A Pizza Separation
A. Pizza Separation time limit per test 1 second memory limit per test 256 megabytes input standard ...
- uva 11762 数学期望+记忆化搜索
题目大意:给一个正整数N,每次可以在不超过N的素数中随机选择一个P,如果P是N的约数,则把N变成N/p,否则N不变,问平均情况下需要多少次随机选择,才能把N变成1? 分析:根据数学期望的线性和全期望公 ...
- uva 1426 离散平方根
1426 - Discrete Square Roots Time limit: 3.000 seconds A square root of a number x <tex2html_verb ...
- POJ 3585 Accumulation Degree
二次扫描与换根法 用于解决无根树,对于每一个节点作为根时都要统计 做法: 1.先以任意一个节点为根,做树形DP,保存每个节点的DP值 2.然后自上而下dfs,对于每个节点考虑以他为根的最大值 #inc ...
- 集合 Properties 的 简单例子(Spring)
Java代码: package com.ioc; import java.util.Properties; public class Student { private String name; pr ...
- 【SPOJ220】Relevant Phrases of Annihilation(后缀数组,二分)
题意: n<=10,len<=1e4 思路: #include<cstdio> #include<cstring> #include<string> # ...
- Python入门--14--字典
基础知识: 0.python对值没有要求,但对key有些要求,必须是非变量(变量,列表,字典) 1.在列表中使用成员资格操作符,和在字典中使用成员资格操作符,后者会更快 2.fromkeys这个函数会 ...
- excel批量导入数据库SQL server
思路: 第一是文件上传,可以参照Jakarta的FileUpload组件,用普通的Post也就行了.第二是Excel解析,用JSL或者POI都行第三是数据保存,这个应该简单吧,一个循环,一行对应一条数 ...
- js采用concat和sort将N个数组拼接起来的方法
<script type="text/javascript" > function concatAndSortArray(array1, array2) { if (a ...
- Centos7安装遇到的问题及详解
1.虚拟机中选择的是NAT模式,我的笔记本电脑是拨号上网,用桥接模式,找不到网卡,在windows的dos界面用ipconfig查看的结果 PPP适配器 宽带连接:IPv4 地址 . . . . . ...