📄 fifobuffer.c
字号:
#include "FIFOBuffer.h"
Node* FIFOHeader;
Node* FIFOTailer;
POOL data_type DMAPool;
/*
* _k_malloc_()
* 从片内内存POOL中分配一个u16类型的地址空间
* 分配失败: 返回0;成功:返回地址
*/
Node * _k_malloc_()
{
Node *p;
if( DMAPool.curlen < POOL_BLOCK_NUM ) //(DMAPool.tailer + 1)%POOL_BLOCK_NUM != DMAPool.header )
{
p = &DMAPool.pool[DMAPool.tailer];
DMAPool.tailer = (DMAPool.tailer + 1)%POOL_BLOCK_NUM;
DMAPool.curlen++;
}
else
p = 0;
return p;
}
/*
* _free_()
* 将一个内存的一个Node类型的地址空间换回到POOL中
* 释放成功: 返回1;失败:返回0
*/
u8 _free_(Node *p )
{
if( DMAPool.curlen >0 && p==&DMAPool.pool[DMAPool.header] ){
DMAPool.header = (DMAPool.header + 1)%POOL_BLOCK_NUM;
DMAPool.curlen--;
return 1;
}
else{
return 0;
}
}
void InitPOOL(void)
{
DMAPool.header = 0;
DMAPool.tailer = 0;
DMAPool.curlen = 0;
}
/*
* u8 InsertBuffer(u16 * p, u16 len )
* 向FIFOBuffer中插入一帧数据 数据长度<= DMA_BLOCK_SIZE
* 插入成功:返回1;插入失败: 返回0;插入成功后分配空间失败:2;
*/
u8 InsertBuffer( u16 *p ,u8 len)
{
u16 i ;
Node* ptmp;
if( len > DMA_BLOCK_SIZE ) return 0;
if(FIFOTailer)
for( i=0; i<len ; i++){
FIFOTailer->buffer[i] = *(p+i);
}
ptmp = (Node*)_k_malloc_();
if(!ptmp) return 2;
FIFOTailer->next = ptmp;
FIFOTailer = FIFOTailer->next;
FIFOTailer->next = (Node*)0;
return 1;
}
/*
* u8 ReadBuffer(u16 * p, u16 len )
* 从FIFOBuffer中读取一帧数据 数据长度<= DMA_BLOCK_SIZE
* 插入成功:返回1;失败: 返回0
*/
u8 ReadBuffer(u16 * p, u16 len )
{
u16 i ;
Node * ptmp;
if(len > DMA_BLOCK_SIZE) return 0;
if(FIFOHeader == FIFOTailer) return 0;
for(i=0 ; i<len ; i++)
{
*(p+i) = FIFOHeader->buffer[i];
}
ptmp = FIFOHeader;
FIFOHeader = FIFOHeader->next;
return _free_(ptmp);
}
void InitFIFOBuffer(void)
{
Node *ptmp;
InitPOOL();
ptmp = (Node*)_k_malloc_();
if(!ptmp) return;
FIFOTailer = ptmp;
FIFOHeader = FIFOTailer;
FIFOTailer->next = (Node*)0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -