⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buffer(1).h

📁 哈工大的几个人开发的操作系统pyos的部分源码
💻 H
字号:
#ifndef _PYOS_BUFFER_H_
#define _PYOS_BUFFER_H_

/* 定义缓冲区队列 */
/* 由于没有内存分配函数,因此不能使用 new */
template< typename T >
class class_template_pyos_Buffer{
  protected:
    T* Buffer ; // 缓冲区的指针
    unsigned int BufferMaxLength ; // 缓冲区的大小
    volatile int BufferHead ; // 缓冲区头位置
    volatile int BufferTail ; // 缓冲区尾位置  
  public:
    /* 缓冲区初始化 */
    void Init( T* buffer_addr , unsigned int buffer_max_length ) ; 
    /* 从缓冲区中读数据,存放在 save_into_data 中,返回读出个数,如缓冲区为空,则返回零 
    ** move_it_out如为true 则表示把此数据移出缓冲区
    */    
    unsigned int ReadData( T& save_into_data , bool move_it_out = true ) ;
    /* 把数据放入缓冲区,如果缓冲区满则直接返回零,否则返回放入个数 
    ** force_put_and_put_at_first 如果为直表示此数据非常重要,需要强行放入且放入第一个位置,
    ** 则不论此缓冲区是否满,都会将数据放入缓冲区,且放入第一个位置,如果缓冲区满,则最后一个数据
    ** 被缓冲区丢弃
    */
    unsigned int PutData( T data , bool froce_put_and_put_at_first = false ) ;
} ;

/* 缓冲区初始化 */
template< typename T >
void class_template_pyos_Buffer< T >::Init( T* buffer_addr , unsigned int buffer_max_length )
{
  Buffer = buffer_addr ;
  BufferMaxLength = buffer_max_length ;
  /* 初始化缓冲区队列队头及队尾参数,
  ** 队头 == 队尾 : 缓冲区为空
  ** ( 队尾 + 1 ) % 队长度 == 队头 : 队满
  ** 存放时,先队尾 + 1,再存放于队尾所指处,队头所指处永远是无效数据
  */
  BufferHead = 0 ;
  BufferTail = BufferHead ; // 队头 == 队尾,缓冲区为空
}
/* 从缓冲区读数据 */
template< typename T >
unsigned int class_template_pyos_Buffer< T >::ReadData( T& save_into_data , bool move_it_out )
{
  int count = 0 ;
  int pos ;
  if( BufferHead != BufferTail ){
    // 缓冲区不为空
    pos = ( BufferHead + 1 ) % BufferMaxLength ;
    save_into_data = Buffer[ pos ] ;
    ++count ;
    if( move_it_out ){
    // 需要将读过的数据移出缓冲区
      BufferHead = pos ;
    }
  }
  return count ;
}
/* 在缓冲区中放入数据 */
template< typename T >
unsigned int class_template_pyos_Buffer< T >::PutData( T data , bool force_put_and_put_at_first )
{
  int count = 0 ;
  if( force_put_and_put_at_first ){
    // 强行放入队头
    Buffer[ BufferHead ] = data ;
    ++count ;
    /* 队头前移一个位置 */
    --BufferHead ;
    if( BufferHead < 0 ){
      BufferHead += BufferMaxLength ;
    }
    if( BufferHead == BufferTail ){
      // 表示在放入数据前,队列已满了,因此需要放弃队列的最后一个元素,移动队尾位置
      --BufferTail ;
      if( BufferTail < 0 ){
        BufferTail += BufferMaxLength ;
      }
    }
  }
  else{
    // 不需要强行放入
    /* 测试缓冲区是否已满 */
    if( ( BufferTail + 1 ) % BufferMaxLength != BufferHead ){
      // 缓冲区未满,放入数据
      BufferTail = ( BufferTail + 1 ) % BufferMaxLength ;
      Buffer[ BufferTail ] = data ;
      ++count ;
    }
  }
  return count ;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -