循环队列存储数据
2009-07-16 14:30
387 查看
再来一遍
近来在项目中,要在EEPROM中存储最近48小数的数据,使用的MCU为兼容的8052芯片(V9001,电能计量SOC),考虑到使用的是模拟I2C和52的处理能力,使用一个循环队列来控制数据存储的位置.
一.队列构建
struct Queue
{
uint16 xdata *DataID;
uint8 Size;
uint8 front; //头指针
uint8 rear;//尾指针
};
//================================
//初始化队列
//==================================
void InitQueue(struct Queue *p,uint8 DataNum,uint16 *dataID)
{
p->DataID=dataID;
p->front=1;
p->rear=0;
p->Size=DataNum;
}
//==================================
//队列满判断
//==================================
int IsFull(struct Queue *p)
{
return (p->rear+2)%(p->Size)==p->front;
}
//========================
//队列空判断
//=========================
int IsEmpty(struct Queue *p)
{
return (p->rear+1)%(p->Size)==p->front;
}
//========================
//队列插入
//=========================
int Insert(struct Queue *p,uint16 DataID)
{
if(IsFull( p))
return 0;
else
{
p->rear=(p->rear+1)%(p->Size);
*(p->DataID+p->rear)=DataID;
return 1 ;
}
}
//==========================================
//队列删除
//==========================================
int Delete(struct Queue *p)
{
if(IsEmpty(p))
return 0;
else
{
p->front=(p->front+1)%(p->Size);
return 1;
}
}
队列采用空出一个位置来判断队空和队满的问题.
二.如何在再次上电后回复队列状态
每次进行队列操作,都会在EEPROM中保存队列首指针和尾指针的值,同时保存首指针所指的数组中的值.因为所要存储的是一个连续的值,只要恢复了这三个数据,就能得到上次系统运行时的队列状态.
以7个数据项(0xc160~0XC167)为例子
recover the front and rear pointer
DataFront=EEPROM[Frontaddress]
if(rear>front)
index=front:rear
if(DataFront>0xc167)
DataFront=0xc160
Data[index]=DataFront
loop
else
index=front:7
if(DataFront>0xc167)
DataFront=0xc160
Data[index]=DataFront
loop
index=0:rear
if(DataFront>0xc167)
DataFront=0xc160
Data[index]=DataFront
loop
三、数据存储和队列修改
当需要存储当前小时电量数据的时候,只要调用队列的插入和删除方法,同时将队列信息写入EEPROM中,以防系统突然当机等问题。
近来在项目中,要在EEPROM中存储最近48小数的数据,使用的MCU为兼容的8052芯片(V9001,电能计量SOC),考虑到使用的是模拟I2C和52的处理能力,使用一个循环队列来控制数据存储的位置.
一.队列构建
struct Queue
{
uint16 xdata *DataID;
uint8 Size;
uint8 front; //头指针
uint8 rear;//尾指针
};
//================================
//初始化队列
//==================================
void InitQueue(struct Queue *p,uint8 DataNum,uint16 *dataID)
{
p->DataID=dataID;
p->front=1;
p->rear=0;
p->Size=DataNum;
}
//==================================
//队列满判断
//==================================
int IsFull(struct Queue *p)
{
return (p->rear+2)%(p->Size)==p->front;
}
//========================
//队列空判断
//=========================
int IsEmpty(struct Queue *p)
{
return (p->rear+1)%(p->Size)==p->front;
}
//========================
//队列插入
//=========================
int Insert(struct Queue *p,uint16 DataID)
{
if(IsFull( p))
return 0;
else
{
p->rear=(p->rear+1)%(p->Size);
*(p->DataID+p->rear)=DataID;
return 1 ;
}
}
//==========================================
//队列删除
//==========================================
int Delete(struct Queue *p)
{
if(IsEmpty(p))
return 0;
else
{
p->front=(p->front+1)%(p->Size);
return 1;
}
}
队列采用空出一个位置来判断队空和队满的问题.
二.如何在再次上电后回复队列状态
每次进行队列操作,都会在EEPROM中保存队列首指针和尾指针的值,同时保存首指针所指的数组中的值.因为所要存储的是一个连续的值,只要恢复了这三个数据,就能得到上次系统运行时的队列状态.
以7个数据项(0xc160~0XC167)为例子
recover the front and rear pointer
DataFront=EEPROM[Frontaddress]
if(rear>front)
index=front:rear
if(DataFront>0xc167)
DataFront=0xc160
Data[index]=DataFront
loop
else
index=front:7
if(DataFront>0xc167)
DataFront=0xc160
Data[index]=DataFront
loop
index=0:rear
if(DataFront>0xc167)
DataFront=0xc160
Data[index]=DataFront
loop
三、数据存储和队列修改
当需要存储当前小时电量数据的时候,只要调用队列的插入和删除方法,同时将队列信息写入EEPROM中,以防系统突然当机等问题。
相关文章推荐
- 数据结构(C实现)------- 顺序队列(循环队列之少用一个存储空间实现) .
- 数据结构之循环队列(顺序表存储)——C++模板类实现
- 【原创】循环队列存储数据
- 3.4.3 循环队列之动态存储空间 (3 )
- 数据结构之顺序循环队列
- 采用顺序存储实现循环队列的初始化、入队、出队操作。
- 关于循环队列的存储问题
- MySQL存储过程循环添加数据
- 数据结构---队列---循环队列---顺序存储
- mysql 存储过程一个简单的循环遍历操作数据
- 数据结构 利用循环队列层次遍历一棵二叉树 递归实现
- 存储过程实例 判断临时表是否存在 循环添加主外键两张表数据
- QT循环队列实时处理数据(二)
- MYSQL存储过程循环遍历插入数据
- 数据结构基础之循环队列C语言实现
- 数据结构(循环队列子系统:c实现)
- 数据结构之循环队列(改)
- [置顶] 数据结构——循环队列存储结构以及实现
- 大数据高并发系统架构实战方案(LVS负载均衡、Nginx、共享存储、海量数据、队列缓存)
- MySQL 存储过程循环插入数据