环形队列数据的循环读写
2010-03-13 17:17
330 查看
在内存中建立一个环形队列的数据结构,此数据结构遵循先进先出的原则,它是用于对交通灯驱动程序的上半部和下半部之间缓冲数据,其中ring_buf_read()函数用于对环形队列进行读取数据。(本算法来自蒋静《操作系统原理。技术与编程》一书P392页)
#define R_SIGNATURE 0x860510
typedef struct{
long signature;
int *head;
int *tail;
int *end;
int *begin;
int buffer[64];
}ring_buf; //定义一个环形队列数据结构
#include <unistd.h>
#include <linux/kernel.h>
#include "ring.h"
int tag=0;
int * psudo_head=NULL;
void ring_buf_init(ring_buf *round)
{
round->signature=R_SIGNATURE;
round->head=round->buffer;
round->tail=round->buffer;
round->begin=round->buffer;
round->end=&round->buffer[sizeof(round->buffer)-1];
}
/** read the user_defined value from the ring_buffer,
** if no value available 0 is returned, on error -1 is
** returned, on success 1 is returned **/
int ring_buf_read(ring_buf *round,int *val)
{
int* tmp=round->tail;//每次调用该函数时都会将round->tail指针的值赋给tmp,因为round->tail始终指向环形队列中未读数据的地址,这是下面round->tail=tmp语句来实现的
if(round->signature !=R_SIGNATURE){
printk("ring_buf_read:signature fake/n");
return(-1);
}
if((tmp<round->begin)||(tmp>round->end)){
printk("ring_buf_read:tail bad/n");
return(-1);
}
if(tmp==round->head){
return(0);
}
*val=*tmp++;//将*tmp指向的值赋给val,实现数据的读出操作
if(tmp>round->end)
tmp=round->begin;
round->tail=tmp;//保证round->tail始终指向环形队列中未读数据的地址,从而实现循环读取
if(tag){
round->head=psudo_head;
tag=0;
}
return(1);
}
int ring_buf_write(ring_buf *round,int val)
{
int* tmp=round->head;
if(round->signature !=R_SIGNATURE){
printk("ring_buf_write:signature fake/n");
return(-1);
}
if((tmp<round->begin)||(tmp>round->end)){
printk("ring_buf_write:head bad/n");
return(-1);
}
if(tag)
return 0;
(*tmp)=val;
tmp++;
if(tmp>round->end)
tmp = round->begin;
if(tmp==round->tail){
tag=1;
psudo_head=tmp;
return(1);
}
round->head=tmp;
return(1);
}
#define R_SIGNATURE 0x860510
typedef struct{
long signature;
int *head;
int *tail;
int *end;
int *begin;
int buffer[64];
}ring_buf; //定义一个环形队列数据结构
#include <unistd.h>
#include <linux/kernel.h>
#include "ring.h"
int tag=0;
int * psudo_head=NULL;
void ring_buf_init(ring_buf *round)
{
round->signature=R_SIGNATURE;
round->head=round->buffer;
round->tail=round->buffer;
round->begin=round->buffer;
round->end=&round->buffer[sizeof(round->buffer)-1];
}
/** read the user_defined value from the ring_buffer,
** if no value available 0 is returned, on error -1 is
** returned, on success 1 is returned **/
int ring_buf_read(ring_buf *round,int *val)
{
int* tmp=round->tail;//每次调用该函数时都会将round->tail指针的值赋给tmp,因为round->tail始终指向环形队列中未读数据的地址,这是下面round->tail=tmp语句来实现的
if(round->signature !=R_SIGNATURE){
printk("ring_buf_read:signature fake/n");
return(-1);
}
if((tmp<round->begin)||(tmp>round->end)){
printk("ring_buf_read:tail bad/n");
return(-1);
}
if(tmp==round->head){
return(0);
}
*val=*tmp++;//将*tmp指向的值赋给val,实现数据的读出操作
if(tmp>round->end)
tmp=round->begin;
round->tail=tmp;//保证round->tail始终指向环形队列中未读数据的地址,从而实现循环读取
if(tag){
round->head=psudo_head;
tag=0;
}
return(1);
}
int ring_buf_write(ring_buf *round,int val)
{
int* tmp=round->head;
if(round->signature !=R_SIGNATURE){
printk("ring_buf_write:signature fake/n");
return(-1);
}
if((tmp<round->begin)||(tmp>round->end)){
printk("ring_buf_write:head bad/n");
return(-1);
}
if(tag)
return 0;
(*tmp)=val;
tmp++;
if(tmp>round->end)
tmp = round->begin;
if(tmp==round->tail){
tag=1;
psudo_head=tmp;
return(1);
}
round->head=tmp;
return(1);
}
相关文章推荐
- 秒杀多线程第十五篇 多线程十大经典案例之一 双线程读写队列数据
- 数据结构之队列11循环队列定义及实现
- 数据结构 利用循环队列层次遍历一棵二叉树 递归实现
- 秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据
- 循环队列实现高速缓存的读写
- 数据结构之循环队列和栈的应用
- 数据结构之---C语言实现循环队列
- 数据结构(队列):循环队列
- 设备驱动中环形缓冲区数据存储和读写同步的实现
- 数据结构之循环队列(SeqQueue)源码
- 看数据结构写代码(16)顺序队列的实现(循环队列)
- 数据结构(ZKNU OJ) 周末舞会(循环队列解法)
- 数据结构(5):循环队列——队列的顺序表示和实现
- Atitit.提升软件稳定性---基于数据库实现的持久化 循环队列 环形队列
- 数据结构——循环队列操作
- 数据结构与算法之循环队列
- 【数据结构】——顺序循环队列的相关操作
- 郝斌数据结构 47 循环队列程序演示
- 14.[个人]C++线程入门到进阶(14)----双线程读写队列数据
- 秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据