写了有关缓冲区定义和访问的程序,可实现FIFO和LIFO功能
2007-07-02 09:35
357 查看
//定义数据类型
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned int INT16U;
typedef signed int INT16S;
typedef unsigned long INT32U;
typedef signed long INT32S;
typedef float FP32;
typedef double FP64;
typedef INT8S BYTE;
typedef INT8U UBYTE;
typedef INT16S WORD;
typedef INT16U UWORD;
typedef INT32U ULONG;
typedef INT32S LONG;
typedef FP32 FP;
typedef FP64 DFP;
//定义常熟,表示缓冲器访问函数返回的缓冲器的状态
#define BUFFER_NO_ERR 0 /*缓冲器无错*/
#define BUFFER_FULL 1 /*缓冲器满*/
#define BUFFER_FLUSH 2 /*缓冲器空*/
//定义缓冲器控制块的数据类型
typedef struct
{
void *BuffStart; //指向缓冲器的起始单元的地址
void *BuffEnd; //执行缓冲器的结束单元的下一个地址
void *MemberIn; //插入成员的指针
void *MemberOut; //取出成员的指针(在LIFO方式下也是插入成员的指针)(取出成员时总是从该指针指向的地址取出)
UWORD BuffSize; //缓冲区大小(成员总数)
UWORD BuffEntries; //可使用的成员数
UWORD MemberSizeof; //成员的类型
} STR_BufferCB; //缓冲器控制块类型定义
//定义初始化缓冲器控制块的函数:参数1-控制块指针;参数2-缓冲器的首地址;参数3-缓冲器大小(最大成员数);参数4-成员数据类型,可由sizeof函数得到
void InitBufferCB(STR_BufferCB *pbcb,void *pbufs,UWORD bsize,UWORD bsizeof)
{
pbcb->BuffStart=(void *)pbufs;
pbcb->MemberIn=(void *)pbufs;
pbcb->MemberOut=(void *)pbufs;
pbcb->BuffSize=bsize;
pbcb->MemberSizeof=bsizeof;
pbcb->BuffEntries=bsize;
pbcb->BuffEnd=(void *)((UBYTE *)pbufs+bsize*bsizeof);
}
//定义晴空缓冲器控制块的函数:参数-控制块指针
void BufferCBFlush(STR_BufferCB *pbcb)
{
pbcb->BuffEntries=pbcb->BuffSize;
pbcb->MemberOut=pbcb->MemberIn;
}
//定义缓冲器中放入一个成员的函数(FIFO方式):参数1-控制块指针;参数2-指向成员的指针
UWORD BufferMemberPush(STR_BufferCB *pbcb,void *pmenber) //FIFO
{
UBYTE *psrc;
UBYTE *pdest;
UWORD i;
if(pbcb->BuffEntries==0)
{
return(BUFFER_FULL);
}
psrc=(UBYTE *)pmenber;
pdest=(UBYTE *)(pbcb->MemberIn);
for(i=0;i<pbcb->MemberSizeof;i++)
{
*pdest++=*psrc++;
}
pbcb->BuffEntries--;
pbcb->MemberIn=(void *)pdest;
if(pbcb->MemberIn==pbcb->BuffEnd)
{
pbcb->MemberIn=pbcb->BuffStart;
}
return(BUFFER_NO_ERR);
}
//定义缓冲器中放入一个成员的函数(LIFO方式):参数1-控制块指针;参数2-指向成员的指针
UWORD BufferMemberPushFront(STR_BufferCB *pbcb,void *pmenber) //LIFO
{
UBYTE *psrc;
UBYTE *pdest;
UWORD i;
if(pbcb->BuffEntries==0)
{
return(BUFFER_FULL);
}
if(pbcb->MemberOut==pbcb->BuffStart)
{
pbcb->MemberOut=pbcb->BuffEnd;
}
pdest=(UBYTE *)(pbcb->MemberOut);
pdest=pdest-(pbcb->MemberSizeof);
pbcb->MemberOut=(void *)pdest;
psrc=(UBYTE *)pmenber;
for(i=0;i<pbcb->MemberSizeof;i++)
{
*pdest++=*psrc++;
}
pbcb->BuffEntries--;
return(BUFFER_NO_ERR);
}
//定义从缓冲区中取出一个成员的函数:参数1-控制块指针;参数2-保存取出来的成员的变量的指针
UWORD BufferMemberPop(STR_BufferCB *pbcb,void *pmenber)
{
UBYTE *psrc;
UBYTE *pdest;
UWORD i;
if(pbcb->BuffEntries>=pbcb->BuffSize)
{
return(BUFFER_FLUSH);
}
pdest=(UBYTE *)pmenber;
psrc=(UBYTE *)(pbcb->MemberOut);
for(i=0;i<pbcb->MemberSizeof;i++)
{
*pdest++=*psrc++;
}
pbcb->BuffEntries++;
pbcb->MemberOut=(void *)psrc;
if(pbcb->MemberOut==pbcb->BuffEnd)
{
pbcb->MemberOut=pbcb->BuffStart;
}
return(BUFFER_NO_ERR);
}
//得到缓冲器的大小(最大成员数)
UWORD GetBufferSize(STR_BufferCB *pbcb)
{
return(pbcb->BuffSize);
}
//得到缓冲器的可以使用的成员数
UWORD GetBufferEntries(STR_BufferCB *pbcb)
{
return(pbcb->BuffEntries);
}
//得到缓冲器的成员的数据类型
UWORD GetBufferSizeof(STR_BufferCB *pbcb)
{
return(pbcb->MemberSizeof);
}
//得到缓冲器的首地址
void * GetBufferStartAddr(STR_BufferCB *pbcb)
{
return(pbcb->BuffStart);
}
//得到缓冲器的最后一个成员的下一个单元的地址
void * GetBufferEndAddr(STR_BufferCB *pbcb)
{
return(pbcb->BuffEnd);
}
//得到缓冲器的在FIFO方式下插入下一个成员的地址
void * GetBufferInAddr(STR_BufferCB *pbcb)
{
return(pbcb->MemberIn);
}
//得到缓冲器的在LIFO方式下插入下一个成员的地址
void * GetBufferInAddrFront(STR_BufferCB *pbcb)
{
UBYTE *pdest;
void *ptemp;
ptemp=pbcb->MemberOut;
if(ptemp==pbcb->BuffStart)
{
ptemp=pbcb->BuffEnd;
}
pdest=(UBYTE *)ptemp;
pdest=pdest-(pbcb->MemberSizeof);
return((void *)pdest);
}
//得到缓冲器的取出成员的地址
void * GetBufferOutAddr(STR_BufferCB *pbcb)
{
return(pbcb->MemberOut);
}
使用时:
1:先定义一个缓冲区,定义一个缓冲区控制块变量
2:初始化缓冲器控制块
3:可调用其他的对缓冲器的操作函数
例子:
typedef struct
{
UWORD uw_v;
ULONG ul_v;
} str_type;
#define BUF1_SIZE 5
STR_BufferCB Buffer1CB;
str_type Buffer1[BUF1_SIZE];
void main(void)
{
str_type ul_1var;
str_type ul_2var;
str_type ul_3var;
str_type ul_4var;
UWORD uw_msg[20];
void *vp_1var;
void *vp_2var;
void *vp_3var;
void *vp_4var;
void *vp_5var;
UWORD uw_1var;
UWORD uw_2var;
UWORD uw_3var;
InitBufferCB(&Buffer1CB,(void *)Buffer1,BUF1_SIZE,sizeof(Buffer1[0]));
uw_msg[0]=BufferMemberPush(&Buffer1CB,(void *)&ul_1var);
//uw_msg[1]=BufferMemberPush(&Buffer1CB,(void *)&ul_1var);
//uw_msg[2]=BufferMemberPush(&Buffer1CB,(void *)&ul_1var);
//uw_msg[3]=BufferMemberPush(&Buffer1CB,(void *)&ul_1var);
//uw_msg[4]=BufferMemberPush(&Buffer1CB,(void *)&ul_1var);
//uw_msg[5]=BufferMemberPush(&Buffer1CB,(void *)&ul_1var);
uw_msg[6]=BufferMemberPushFront(&Buffer1CB,(void *)&ul_2var);
//uw_msg[7]=BufferMemberPushFront(&Buffer1CB,(void *)&ul_2var);
//uw_msg[8]=BufferMemberPushFront(&Buffer1CB,(void *)&ul_2var);
//uw_msg[9]=BufferMemberPushFront(&Buffer1CB,(void *)&ul_2var);
//uw_msg[10]=BufferMemberPushFront(&Buffer1CB,(void *)&ul_2var);
//uw_msg[11]=BufferMemberPushFront(&Buffer1CB,(void *)&ul_2var);
//uw_msg[12]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
//uw_msg[13]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
//uw_msg[14]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
//uw_msg[15]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
//uw_msg[16]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
//uw_msg[17]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
//uw_msg[18]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
vp_1var=GetBufferStartAddr(&Buffer1CB);
vp_2var=GetBufferEndAddr(&Buffer1CB);
vp_3var=GetBufferInAddr(&Buffer1CB);
vp_4var=GetBufferInAddrFront(&Buffer1CB);
vp_5var=GetBufferOutAddr(&Buffer1CB);
uw_1var=GetBufferSize(&Buffer1CB);
uw_2var=GetBufferSizeof(&Buffer1CB);
uw_3var=GetBufferEntries(&Buffer1CB);
for(;
{
NOP();
}
}
有什么不足的地方,大家一起讨论讨论。
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned int INT16U;
typedef signed int INT16S;
typedef unsigned long INT32U;
typedef signed long INT32S;
typedef float FP32;
typedef double FP64;
typedef INT8S BYTE;
typedef INT8U UBYTE;
typedef INT16S WORD;
typedef INT16U UWORD;
typedef INT32U ULONG;
typedef INT32S LONG;
typedef FP32 FP;
typedef FP64 DFP;
//定义常熟,表示缓冲器访问函数返回的缓冲器的状态
#define BUFFER_NO_ERR 0 /*缓冲器无错*/
#define BUFFER_FULL 1 /*缓冲器满*/
#define BUFFER_FLUSH 2 /*缓冲器空*/
//定义缓冲器控制块的数据类型
typedef struct
{
void *BuffStart; //指向缓冲器的起始单元的地址
void *BuffEnd; //执行缓冲器的结束单元的下一个地址
void *MemberIn; //插入成员的指针
void *MemberOut; //取出成员的指针(在LIFO方式下也是插入成员的指针)(取出成员时总是从该指针指向的地址取出)
UWORD BuffSize; //缓冲区大小(成员总数)
UWORD BuffEntries; //可使用的成员数
UWORD MemberSizeof; //成员的类型
} STR_BufferCB; //缓冲器控制块类型定义
//定义初始化缓冲器控制块的函数:参数1-控制块指针;参数2-缓冲器的首地址;参数3-缓冲器大小(最大成员数);参数4-成员数据类型,可由sizeof函数得到
void InitBufferCB(STR_BufferCB *pbcb,void *pbufs,UWORD bsize,UWORD bsizeof)
{
pbcb->BuffStart=(void *)pbufs;
pbcb->MemberIn=(void *)pbufs;
pbcb->MemberOut=(void *)pbufs;
pbcb->BuffSize=bsize;
pbcb->MemberSizeof=bsizeof;
pbcb->BuffEntries=bsize;
pbcb->BuffEnd=(void *)((UBYTE *)pbufs+bsize*bsizeof);
}
//定义晴空缓冲器控制块的函数:参数-控制块指针
void BufferCBFlush(STR_BufferCB *pbcb)
{
pbcb->BuffEntries=pbcb->BuffSize;
pbcb->MemberOut=pbcb->MemberIn;
}
//定义缓冲器中放入一个成员的函数(FIFO方式):参数1-控制块指针;参数2-指向成员的指针
UWORD BufferMemberPush(STR_BufferCB *pbcb,void *pmenber) //FIFO
{
UBYTE *psrc;
UBYTE *pdest;
UWORD i;
if(pbcb->BuffEntries==0)
{
return(BUFFER_FULL);
}
psrc=(UBYTE *)pmenber;
pdest=(UBYTE *)(pbcb->MemberIn);
for(i=0;i<pbcb->MemberSizeof;i++)
{
*pdest++=*psrc++;
}
pbcb->BuffEntries--;
pbcb->MemberIn=(void *)pdest;
if(pbcb->MemberIn==pbcb->BuffEnd)
{
pbcb->MemberIn=pbcb->BuffStart;
}
return(BUFFER_NO_ERR);
}
//定义缓冲器中放入一个成员的函数(LIFO方式):参数1-控制块指针;参数2-指向成员的指针
UWORD BufferMemberPushFront(STR_BufferCB *pbcb,void *pmenber) //LIFO
{
UBYTE *psrc;
UBYTE *pdest;
UWORD i;
if(pbcb->BuffEntries==0)
{
return(BUFFER_FULL);
}
if(pbcb->MemberOut==pbcb->BuffStart)
{
pbcb->MemberOut=pbcb->BuffEnd;
}
pdest=(UBYTE *)(pbcb->MemberOut);
pdest=pdest-(pbcb->MemberSizeof);
pbcb->MemberOut=(void *)pdest;
psrc=(UBYTE *)pmenber;
for(i=0;i<pbcb->MemberSizeof;i++)
{
*pdest++=*psrc++;
}
pbcb->BuffEntries--;
return(BUFFER_NO_ERR);
}
//定义从缓冲区中取出一个成员的函数:参数1-控制块指针;参数2-保存取出来的成员的变量的指针
UWORD BufferMemberPop(STR_BufferCB *pbcb,void *pmenber)
{
UBYTE *psrc;
UBYTE *pdest;
UWORD i;
if(pbcb->BuffEntries>=pbcb->BuffSize)
{
return(BUFFER_FLUSH);
}
pdest=(UBYTE *)pmenber;
psrc=(UBYTE *)(pbcb->MemberOut);
for(i=0;i<pbcb->MemberSizeof;i++)
{
*pdest++=*psrc++;
}
pbcb->BuffEntries++;
pbcb->MemberOut=(void *)psrc;
if(pbcb->MemberOut==pbcb->BuffEnd)
{
pbcb->MemberOut=pbcb->BuffStart;
}
return(BUFFER_NO_ERR);
}
//得到缓冲器的大小(最大成员数)
UWORD GetBufferSize(STR_BufferCB *pbcb)
{
return(pbcb->BuffSize);
}
//得到缓冲器的可以使用的成员数
UWORD GetBufferEntries(STR_BufferCB *pbcb)
{
return(pbcb->BuffEntries);
}
//得到缓冲器的成员的数据类型
UWORD GetBufferSizeof(STR_BufferCB *pbcb)
{
return(pbcb->MemberSizeof);
}
//得到缓冲器的首地址
void * GetBufferStartAddr(STR_BufferCB *pbcb)
{
return(pbcb->BuffStart);
}
//得到缓冲器的最后一个成员的下一个单元的地址
void * GetBufferEndAddr(STR_BufferCB *pbcb)
{
return(pbcb->BuffEnd);
}
//得到缓冲器的在FIFO方式下插入下一个成员的地址
void * GetBufferInAddr(STR_BufferCB *pbcb)
{
return(pbcb->MemberIn);
}
//得到缓冲器的在LIFO方式下插入下一个成员的地址
void * GetBufferInAddrFront(STR_BufferCB *pbcb)
{
UBYTE *pdest;
void *ptemp;
ptemp=pbcb->MemberOut;
if(ptemp==pbcb->BuffStart)
{
ptemp=pbcb->BuffEnd;
}
pdest=(UBYTE *)ptemp;
pdest=pdest-(pbcb->MemberSizeof);
return((void *)pdest);
}
//得到缓冲器的取出成员的地址
void * GetBufferOutAddr(STR_BufferCB *pbcb)
{
return(pbcb->MemberOut);
}
使用时:
1:先定义一个缓冲区,定义一个缓冲区控制块变量
2:初始化缓冲器控制块
3:可调用其他的对缓冲器的操作函数
例子:
typedef struct
{
UWORD uw_v;
ULONG ul_v;
} str_type;
#define BUF1_SIZE 5
STR_BufferCB Buffer1CB;
str_type Buffer1[BUF1_SIZE];
void main(void)
{
str_type ul_1var;
str_type ul_2var;
str_type ul_3var;
str_type ul_4var;
UWORD uw_msg[20];
void *vp_1var;
void *vp_2var;
void *vp_3var;
void *vp_4var;
void *vp_5var;
UWORD uw_1var;
UWORD uw_2var;
UWORD uw_3var;
InitBufferCB(&Buffer1CB,(void *)Buffer1,BUF1_SIZE,sizeof(Buffer1[0]));
uw_msg[0]=BufferMemberPush(&Buffer1CB,(void *)&ul_1var);
//uw_msg[1]=BufferMemberPush(&Buffer1CB,(void *)&ul_1var);
//uw_msg[2]=BufferMemberPush(&Buffer1CB,(void *)&ul_1var);
//uw_msg[3]=BufferMemberPush(&Buffer1CB,(void *)&ul_1var);
//uw_msg[4]=BufferMemberPush(&Buffer1CB,(void *)&ul_1var);
//uw_msg[5]=BufferMemberPush(&Buffer1CB,(void *)&ul_1var);
uw_msg[6]=BufferMemberPushFront(&Buffer1CB,(void *)&ul_2var);
//uw_msg[7]=BufferMemberPushFront(&Buffer1CB,(void *)&ul_2var);
//uw_msg[8]=BufferMemberPushFront(&Buffer1CB,(void *)&ul_2var);
//uw_msg[9]=BufferMemberPushFront(&Buffer1CB,(void *)&ul_2var);
//uw_msg[10]=BufferMemberPushFront(&Buffer1CB,(void *)&ul_2var);
//uw_msg[11]=BufferMemberPushFront(&Buffer1CB,(void *)&ul_2var);
//uw_msg[12]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
//uw_msg[13]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
//uw_msg[14]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
//uw_msg[15]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
//uw_msg[16]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
//uw_msg[17]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
//uw_msg[18]=BufferMemberPop(&Buffer1CB,(void *)&ul_3var);
vp_1var=GetBufferStartAddr(&Buffer1CB);
vp_2var=GetBufferEndAddr(&Buffer1CB);
vp_3var=GetBufferInAddr(&Buffer1CB);
vp_4var=GetBufferInAddrFront(&Buffer1CB);
vp_5var=GetBufferOutAddr(&Buffer1CB);
uw_1var=GetBufferSize(&Buffer1CB);
uw_2var=GetBufferSizeof(&Buffer1CB);
uw_3var=GetBufferEntries(&Buffer1CB);
for(;
{
NOP();
}
}
有什么不足的地方,大家一起讨论讨论。
相关文章推荐
- 模块管理常规功能自己定义系统的设计与实现(53--演示程序和视频解说 )
- 谁能用jQuery和Ajax做的访问ado.net程序-----跪求各位大侠(有相似的也可以,只要实现的是类似的功能就可以)
- 一个简单的程序来访问该数据库,实现 show tables 功能
- AIDL_android接口定义语言_IPC_实现远程访问其他程序的服务
- 2,改写本章例2.1程序,要求: (1)将数据成员改为私有; (2)将输入和输出的功能改为由成员函数实现; (3)在类体内定义成员函数;
- 在一个程序中需要用到全局变量(在多个class之间共享数据),请问如何定义具有这种功能的变量?或者是否有其他的方法解决多个class之间的数据共享(尽量简单实现)。 首先应该明确 Java中没有全局变
- 模块管理常规功能自定义系统的设计与实现(53--演示程序和视频讲解 )
- 对《自定义GridView分页模板中页码Button的实现》中程序的改进,追加显示空行功能
- 用C语言实现Ping程序功能---转
- java--集合框架Treemap的定义与特殊功能实现
- 微信公众号WebApp接管返回键实现“再按一次退出程序”功能
- [转]自定义ASP.NET AJAX拖放功能示例程序:实现IDragSource和IDropTarget接口将商品拖放至购物车中
- 微信小程序实现自定义加载图标功能
- 1)编写Animal接口,接口中声明run()方法; 2)定义Bird类和Fish类实现Animal接口; 3)编写Bird类和Fish类的测试程序,并调用其中的run()方法
- C#实现切换窗口程序功能 —— 任务管理器 切换至 功能
- 编写程序实现strlen()函数,strcmp(),strcpy(),strcat()的功能
- [微信小程序]搜索功能实现,搜索框样式
- 微信小程序 收藏功能实现
- Java swing实现钢琴程序,支持录音等功能之Java钢琴源码
- 在窗体上放置一个标签、一个按钮、一个fontDialog控件。标签内容改为“烟台大学”。实现功能:1)程序运行时,单击打开字体对话框按钮,可选择字体,并以所选字体作为标签字体。