• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

fifo环形队列的c写法

wago2008 2018-04-04 浏览量:1043
请大家帮忙写个fifo 环形队列,正在学习中
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 以51串口多字节接收为例:https://blog.csdn.net/kellygod/article/details/54236619

    /**
        用途:     小内存环形缓冲区(FIFO模式)
        作者: 南栀<kellygod95@gmail.com>
    */
    #define BUFFER_MAX  16      //缓冲区大小

    typedef struct _circle_buffer{
        unsigned char head_pos;             //缓冲区头部位置
        unsigned char tail_pos;             //缓冲区尾部位置   
        unsigned char circle_buffer[BUFFER_MAX];    //缓冲区数组 
    }circle_buffer;

    circle_buffer buffer;

    void bufferPop(unsigned char* _buf)
    {
        if(buffer.head_pos==buffer.tail_pos)        //如果头尾接触表示缓冲区为空
            *_buf=0xFF;
        else
        {
            *_buf=buffer.circle_buffer[buffer.head_pos];    //如果缓冲区非空则取头节点值并偏移头节点
            if(++buffer.head_pos>=BUFFER_MAX)
                buffer.head_pos=0;
        }
    }

    void bufferPush(const unsigned char _buf)
    {   
        buffer.circle_buffer[buffer.tail_pos]=_buf; //从尾部追加
        if(++buffer.tail_pos>=BUFFER_MAX)           //尾节点偏移
            buffer.tail_pos=0;                      //大于数组最大长度 制零 形成环形队列
            if(buffer.tail_pos==buffer.head_pos)    //如果尾部节点追到头部节点 则修改头节点偏移位置丢弃早期数据
            if(++buffer.head_pos>=BUFFER_MAX)
                buffer.head_pos=0;

    }

    • 发布于 2018-04-04
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了 :原厂定制件,没有相关文件。 回复

其他答案 数量:5
  • 学习算法最好的是理解核心知识,首先是FIFO的实现,其次是环形如何实现,FIFO其实就是一种数据的平移,环形实现可以单链表也可以双链表
    • 发布于2018-04-04
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :是一个运放IC,原厂封装: SOIC−8 回复

  • #define BUFFER_MAX  16      //缓冲区大小
    #define BUFFER_EMPTY (-1) //缓冲区为空
    #define BUFFER_OK  0 //缓冲区正常
    #define BUFFER_OVER 1 //缓冲区存在覆盖写入
    
    typedef struct _circle_buffer{
        unsigned char head_pos;             //缓冲区头部位置
        unsigned char tail_pos;             //缓冲区尾部位置   
        unsigned char circle_buffer[BUFFER_MAX];    //缓冲区数组 
    }circle_buffer;
    
    circle_buffer buffer;
    
    int bufferPop(unsigned char* _buf){
        if(buffer.head_pos==buffer.tail_pos) {       //如果头尾接触表示缓冲区为空
           return BUFFER_EMPTY ;
        }else {
            *_buf=buffer.circle_buffer[buffer.head_pos];    //如果缓冲区非空则取头节点值并偏移头节点
            buffer.head_pos=(buffer.head_pos+1)%BUFFER_MAX;
            return BUFFER_OK; 
        }
    }
    
    int bufferPush(const unsigned char _buf)
    {   
        buffer.circle_buffer[buffer.tail_pos]=_buf; //从尾部追加
        buffer.tail_pos=(buffer.tail_pos+1)%BUFFER_MAX; //尾节点偏移
        if(buffer.tail_pos==buffer.head_pos) {   //如果尾部节点追到头部节点 则修改头节点偏移位置丢弃早期数据
           buffer.head_pos=(buffer.head_pos+1)%BUFFER_MAX;
           return BUFFER_OVER;
        }
       return BUFFER_OK;
    }
    • 发布于2018-04-04
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :https://datasheets.maximintegrated.com/en/ds/MAX20408-MAX20410.pdf 回复

  • 环形缓冲器的思想就是写入的位置一直加,加到最后就重头开始,并且把头部的数据释放

    可以参考一下这篇文章https://www.cnblogs.com/mm327596194/p/6726115.html

    • 发布于2018-04-07
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :参数不一样,在规格书ELECTRICAL CHARACTERISTICS部分有具体的参数对比 回复

  • int fFifoPush(CFifo *myfifo, UCHAR c){
          UINT tmp_len; 
          if(myfifo->fullflag != FULL){
             tmp_len = myfifo->m_wp;     
             myfifo->m_buf[tmp_len] = c;  
             tmp_len++;  
             if (tmp_len >= myfifo->m_bufsize) tmp_len = 0;                                     
             if (tmp_len == myfifo->m_rp) {
                myfifo-> fullflag = FULL;
             }
          myfifo->m_wp = tmp_len; 
          myfifo-> emptyflag = !EMPTY;
          return TRUE;  
         }

       else return ERROR_FULL_W ;  
    }

    3.从队列中读出数据

    int fFifoPop(CFifo *myfifo, int *data){
         UINT tmp_len;     
         UCHAR tmp_char;
         if(myfifo->emptyflag != EMPTY){
             tmp_len = myfifo->m_rp;
             tmp_char = myfifo->m_buf[tmp_len];     
             *data = tmp_char;
             tmp_len++;     
             if (tmp_len >= myfifo->m_bufsize) tmp_len = 0;
                myfifo->m_rp = tmp_len;
             if (tmp_len == myfifo->m_wp) { 
                myfifo->emptyflag = EMPTY;
              }
        myfifo-> fullflag = !FULL;
        return TRUE;
         }
      else  return ERROR_EMPTY_R;
    }

    4.计算队列中数据长度

    UINT fFifoCheckLen(CFifo *myfifo){

        if(myfifo->emptyflag == EMPTY)      return 0;
        else if(myfifo->fullflag == FULL)   return myfifo->m_bufsize;
        if(myfifo->m_wp >= myfifo->m_rp ){
        return myfifo->m_wp - myfifo->m_rp ; 
     }
     else{ 
           return myfifo->m_bufsize - myfifo->m_rp + myfifo->m_wp;
           }
    }

    • 发布于2018-04-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个可以参考数据结构教材给出的算法,大概就是对环形队列长度的一个取模,使得当前队列位置一直是队列长度的取模值。

    • 发布于2018-04-30
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

fifo环形队列的c写法