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

📄 buffer.c

📁 基于HMS7202的波形发生器源程序
💻 C
字号:


#include <utils.h>
#include "usb.h"

static void IRingBufferReset(IRingBuffer_t *ring)
{
	ring->head = 0;
	ring->tail = 0;
}

/*************************************************************/
/*        返回循环队列中的元素个数 以字为单位
**************************************************************/
static int IRingBufferAvailable(IRingBuffer_t *ring)
{
	int count;
	int head = ring->head;
	int tail = ring->tail;
	if( head >= tail)
		count = head - tail;
	else
		count = ring->size - tail + head;

	return count;
}

/******************************************************************/
/*       返回队列的剩余空间  以字为单位
        若结果大于0,表示还有剩余空间
*******************************************************************/
static int IRingBufferEmpty(IRingBuffer_t *ring)
{
	return ( ring->size - ring->available(ring) -1 );
}

static int IRingBufferPut(IRingBuffer_t *ring, int data)
{
	int irqsave;
	if(ring->empty(ring) <= 0 )
		return FAIL;

	irqsave = isIRQ();
	if(irqsave) {              //允许IRQ
		sys_setirq(0);
		ring->bufp[ring->head] = data;
		ring->head = ++ring->head % ring->size;
		sys_setirq(1);
	}
	else {
		ring->bufp[ring->head] = data;
		ring->head = ++ring->head % ring->size;
	}

	return OK;
}


/***************************************************************/
/*     在保证屏蔽IRQ的情况下,循环队列尾部的1字内容出队列,
       并放入由data指定的内存处
****************************************************************/
static int IRingBufferGet(IRingBuffer_t *ring, int *data)
{
	int irqsave;

	if(ring->available(ring) <= 0 )//若循环队列空,则失败
		return FAIL;

	irqsave = isIRQ();//若在CPSR中未屏蔽IRQ,则返回1
	if(irqsave) {//说明在CPSR中未屏蔽IRQ
		sys_setirq(0); //先屏蔽IRQ
		*data = ring->bufp[ring->tail];
		ring->tail = ++ring->tail % ring->size;
		sys_setirq(1); //允许IRQ
	}
	else {
		*data = ring->bufp[ring->tail];
		ring->tail = ++ring->tail % ring->size;
	}
	return OK;
}


static int IRingBufferPutData(IRingBuffer_t *ring, int *data, int count)
{
	int irqsave;
	int i;

	if(ring->empty(ring) < count )
		return FAIL;

	irqsave = isIRQ();
	if(irqsave) {
		sys_setirq(0);
		for( i=0; i< count ; i++) {
			ring->bufp[ring->head] = *(data + i);
			ring->head = ++ring->head % ring->size;
		}
		sys_setirq(1);
	}
	else {
		for( i=0; i< count ; i++) {
			ring->bufp[ring->head] = *(data + i);
			ring->head = ++ring->head % ring->size;
		}
	}

	return OK;
}

static int IRingBufferGetData(IRingBuffer_t *ring, int *data, int count)
{
	int irqsave;
	int i;

	if(ring->available(ring) < count )
		return FAIL;

	irqsave = isIRQ();
	if(irqsave) {
		sys_setirq(0);
		for( i=0; i< count ; i++) {
			*(data + i) = ring->bufp[ring->tail];
			ring->tail = ++ring->tail % ring->size;
		}
		sys_setirq(1);
	}
	else {
		for( i=0; i< count ; i++) {
			*(data + i) = ring->bufp[ring->tail];
			ring->tail = ++ring->tail % ring->size;
		}
	}
	return OK;
}
/***************************************************************/
/*             USB 收发循环队列初始化
   addr:循环队起始地址
   size:循环队列大小,以字为单位
****************************************************************/
void IRingBufferInit(IRingBuffer_t *ring, char *name, int addr, int size)
{
	ser_printf("[%s] IRingBufferInit base=0x%08x, int count=0x%x(%d)\n", name, addr, size, size);
	strncpy(ring->name, name, strlen(name)+1);
	ring->size = size; 
	ring->bufp = (int *)addr; 
	ring->head = 0;
	ring->tail = 0;
	ring->available = IRingBufferAvailable;
	ring->empty = IRingBufferEmpty;
	ring->get = IRingBufferGet;
	ring->put = IRingBufferPut;
	ring->getData = IRingBufferGetData;
	ring->putData = IRingBufferPutData;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -