从今天起,写一些读书笔记。最近几个月都在看《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天自制操作系统--读书笔记)的更多相关文章

  1. 《30天自制操作系统》笔记(06)——CPU的32位模式

    <30天自制操作系统>笔记(06)——CPU的32位模式 进度回顾 上一篇中实现了启用鼠标.键盘的功能.屏幕上会显示出用户按键.点击鼠标的情况.这是通过设置硬件的中断函数实现的,可以说硬件 ...

  2. 《30天自制操作系统》笔记(02)——导入C语言

    <30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...

  3. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...

  4. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】

    转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...

  5. 《30天自制操作系统》笔记3 --- (Day2 上节)完全解析文件系统

    Day2 汇编语言学习与Makefile入门 本文仅带着思路,研究源码里关于文件系统的参数 关于day2主程序部分及更多内容,请看<30天自制操作系统>笔记 导航 发现学习中的变化 源码差 ...

  6. 《30天自制操作系统》笔记(03)——使用Vmware

    <30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...

  7. 《30天自制操作系统》笔记2 --- 初步了解汇编产生的二进制(Day1)

    nask.exe应该就是nas kit(nas开发工具的意思),由于这个编译器是作者自己写的,所以这种汇编语言应该是作者改造出来的,所以我叫它nas汇编语言. 作者说nask是模仿nasm语法的,关于 ...

  8. 《30天自制操作系统》笔记4 --- (Day2 下节)了解如何用汇编写操作系统中的HelloWorld

    关于上一节,我测试了发现3e.4c.4e都OK ,4b 4d 4f都进不去系统还把qemu卡死了. 50不会输出HelloWorld,可能需要hex偶数且在0x3e~4f区间吧.上节复制并运行命令如下 ...

  9. 《30天自制操作系统》笔记5 --- (Day3)

    这个专题荒废了许久,今天补点东西 不够准确的小结 用汇编来开发操作系统,就是使用汇编本身的功能再加上BIOS中断提供的功能来完成功能的过程. 汇编本身的功能不够,毕竟没有外部IO,所以通过给多个寄存器 ...

随机推荐

  1. vector 类中的 push_back( ) 函数

    函数名 push_back,算法语言里面的一个函数名,如:   1) c++中的vector头文件里面就有这个push_back函数:   2) 在vector类中作用为在vector尾部加入一个数据 ...

  2. properties类的基本使用方法

    properties类的基本使用方法1.假设有“pp.properties”,内容有       age=22       2.java中用下面方法:   Properties   props   = ...

  3. ElasticSearch中辅助API常用用法详解

    本篇是使用Elasticsearch必不可少的必备知识,并且适用于所有的Rest Api. 返回数据格式化 当在Rest请求后面添加?pretty时,结果会以Json格式化的方式显示.另外,如果添加? ...

  4. 巧克力王国 BZOJ 2850

    巧克力王国 [问题描述] 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力.对于每一块巧克力,我们设x和y为其牛奶和可可的含量.由于 ...

  5. jsp 时间格式

    <%@ taglib prefix='fmt' uri="http://java.sun.com/jsp/jstl/fmt" %> <fmt:formatDate ...

  6. RabbitMQ 简介以及使用场景

    目录 一. RabbitMQ 简介 二. RabbitMQ 使用场景 1. 解耦(为面向服务的架构(SOA)提供基本的最终一致性实现) 2. 异步提升效率 3. 流量削峰 三. 引入消息队列的优缺点 ...

  7. sprak pom

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...

  8. 前端模板Nunjucks简介

    参考资料: https://mozilla.github.io/nunjucks/ https://mozilla.github.io/nunjucks/templating.html https:/ ...

  9. GBDT调参

    gbm算法流程图: gbdt 参数:参考scikit-learn The overall parameters can be divided into 3 categories: Tree-Speci ...

  10. 转:linux下ip修改与域名解析查看等

    转自: http://www.justwinit.cn/post/7038/ IP:     ifconfiggateway:172.16.0.254 [root@localhost ~]# nets ...