⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fifobuffer.c

📁 这是一个基于c8051F060的示波器程序
💻 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 + -