原创 环形缓冲区的实现

2010-12-15 10:46 1787 5 5 分类: MCU/ 嵌入式

1、环形缓冲区的实现原理­


环形缓冲区通常有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区。通过移动读指针和写指针就可以实现缓冲区的数据读取和写入。在通常情况下,环形缓冲区的读用户仅仅会影响读指针,而写用户仅仅会影响写指针。如果仅仅有一个读用户和一个写用户,那么不需要添加互斥保护机制就可以保证数据的正确性。如果有多个读写用户访问环形缓冲区,那么必须添加互斥保护机制来确保多个用户互斥访问环形缓冲区。­


图1、图2和图3是一个环形缓冲区的运行示意图。图1是环形缓冲区的初始状态,可以看到读指针和写指针都指向第一个缓冲区处;图2是向环形缓冲区中添加了一个数据后的情况,可以看到写指针已经移动到数据块2的位置,而读指针没有移动;图3是环形缓冲区进行了读取和添加后的状态,可以看到环形缓冲区中已经添加了两个数据,已经读取了一个数据。图片 ­


­



­

­


­


2、实例:环形缓冲区的实现­


环形缓冲区是数据通信程序中使用最为广泛的数据结构之一,下面的代码,实现了一个环形缓冲区:­


/*ringbuf .c*/­


#include<stdio. h>­


   #include<ctype. h>­


#define NMAX 8­


int iput = 0; /*环形缓冲区的当前放入位置*/­


int iget = 0; /*缓冲区的当前取出位置*/­


int n = 0; /*环形缓冲区中的元素总数量*/­


double buffer[NMAX];­


/*环形缓冲区的地址编号计算函数,如果到达唤醒缓冲区的尾部,将绕回到头部。­


环形缓冲区的有效地址编号为:0到(NMAX-1)­


*/­


int addring (int i)­



        return (i+1) == NMAX ? 0 : i+1;­



/*从环形缓冲区中取一个元素*/­


double get(void)­



int pos;­


if (n>0){­


                    Pos = iget;­


                    iget = addring(iget);­


                    n--;­


                    return buffer[pos];­



else {­


printf(“Buffer is empty\n”);­


return 0.0;­



­


/*向环形缓冲区中放入一个元素*/­


void put(double z)­



if (n<NMAX){­


                    buffer[iput]=z;­


                    iput = addring(iput);­


                    n++;­



else­


printf(“Buffer is full\n”);­



­


int main{void)­



chat opera[5];­


double z;­


do {­


printf(“Please input p|g|e?”);­


scanf(“%s”, &opera);­


              switch(tolower(opera[0])){­


              case ‘p’: /* put */­


                  printf(“Please input a float number?”);­


                  scanf(“%lf”, &z);­


                  put(z);­


                  break;­


case ‘g’: /* get */­


                  z = get();­


printf(“%8.2f from Buffer\n”, z);­


break;­


case ‘e’:­


                  printf(“End\n”);­


                  break;­


default:­


                  printf(“%s - Operation command error! \n”, opera);­


}/* end switch */­


}while(opera[0] != ’e’);­


return 0;­


文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条