?? 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 + -