zoukankan      html  css  js  c++  java
  • 单字节的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 = 0;
            fifo->r_pos = 0;
            fifo->free_left = size;
            fifo->flags = 0;  
    } 
    
    

         3、向缓存中加入一个数据

    int fifo8_put(struct FIFO8 *fifo,unsigned char data)
    {
            if(fifo->free_left == 0)
           {
                   fifo->flags |= FLAG_OVERRUN;      //define FLAG_OVERRUN 1
                   return -1;
           }        
           //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 = 0;    //对写指针进行位置限定  
            }
           fifo->free_left --;
          
    return 0; }

        4、从缓存中取出一个数据

    int fifo8_get(struct FIFO8 *fifo)
    {
           int data;
           if(fifo->free_left == fifo->size)
           {
                  return  -1;      //整个缓冲区都是空的,也就没有数据可读 
            }  
            data = fifo->buf[fifo->r_pos];
            fifo->r_pos ++;
            if(fifo->r_pos == fifo->size)
            {
                   fifo->r_pos = 0;    //读取位置重定位 
             }
             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指针。

    今天到此为止。

  • 相关阅读:
    SharePoint Framework 构建你的第一个web部件(二)
    win32
    win32
    win32
    win32
    C++ 将filesystem::path转换为const BYTE*
    win32
    win32
    win32
    win32
  • 原文地址:https://www.cnblogs.com/kanite/p/4475003.html
Copyright © 2011-2022 走看看