📄 buffer.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 + -