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

📄 fifo.c

📁 在luminary平台下移植lwip到freertos,集成开发环境KEIL
💻 C
字号:
/* Author: Magnus Ivarsson <magnus.ivarsson@volvo.com> *//* ---------------------------------------------- *//* --- fifo 4 unix ------------------------------ *//* ---------------------------------------------- */#include "netif/fifo.h"#include "lwip/debug.h"#include "lwip/def.h"#include "lwip/sys.h"#include "lwip/arch.h"#include <unistd.h>#ifndef TRUE#define TRUE  1#endif#ifndef FALSE#define FALSE 0#endifu8_t fifoGet(fifo_t * fifo) {	u8_t c;	sys_sem_wait(fifo->sem);      /* enter critical section */	if (fifo->dataslot == fifo->emptyslot) 	{            fifo->getWaiting = TRUE;    /* tell putFifo to signal us when data is available */            sys_sem_signal(fifo->sem);  /* leave critical section (allow input from serial port..) */            sys_sem_wait(fifo->getSem); /* wait 4 data */            sys_sem_wait(fifo->sem);    /* reenter critical section */	}	c = fifo->data[fifo->dataslot++];	fifo->len--;	if (fifo->dataslot == FIFOSIZE) 	{		fifo->dataslot = 0; 	}	sys_sem_signal(fifo->sem);    /* leave critical section */	return c;}s16_t fifoGetNonBlock(fifo_t * fifo) {	u16_t c;	sys_sem_wait(fifo->sem);      /* enter critical section */	if (fifo->dataslot == fifo->emptyslot) 	{            /* empty fifo */		c = -1;	}	else	{		c = fifo->data[fifo->dataslot++];		fifo->len--;		if (fifo->dataslot == FIFOSIZE) 		{			fifo->dataslot = 0; 		}	}	sys_sem_signal(fifo->sem);    /* leave critical section */	return c;}void fifoPut(fifo_t * fifo, int fd) {	/* FIXME: mutex around struct data.. */	int cnt=0;	sys_sem_wait( fifo->sem ); /* enter critical */	LWIP_DEBUGF( SIO_FIFO_DEBUG,("fifoput: len%d dat%d empt%d --> ", fifo->len, fifo->dataslot, fifo->emptyslot ) );	if ( fifo->emptyslot < fifo->dataslot )	{		cnt = read( fd, &fifo->data[fifo->emptyslot], fifo->dataslot - fifo->emptyslot );	} 	else	{		cnt = read( fd, &fifo->data[fifo->emptyslot], FIFOSIZE-fifo->emptyslot );	}	fifo->emptyslot += cnt;	fifo->len += cnt;	LWIP_DEBUGF( SIO_FIFO_DEBUG,("len%d dat%d empt%d\n", fifo->len, fifo->dataslot, fifo->emptyslot ) );	if ( fifo->len > FIFOSIZE )	{		printf( "ERROR: fifo overrun detected len=%d, flushing\n", fifo->len );		fifo->dataslot  = 0;		fifo->emptyslot = 0;		fifo->len = 0;	}	if ( fifo->emptyslot == FIFOSIZE )	{		fifo->emptyslot = 0;		LWIP_DEBUGF( SIO_FIFO_DEBUG, ("(WRAP) ") );		sys_sem_signal( fifo->sem ); /* leave critical */		fifoPut( fifo, fd );		return;	}	if ( fifo->getWaiting )	{		fifo->getWaiting = FALSE;		sys_sem_signal( fifo->getSem );	}	sys_sem_signal( fifo->sem ); /* leave critical */	return;}void fifoInit(fifo_t * fifo){  fifo->dataslot  = 0;  fifo->emptyslot = 0;  fifo->len       = 0;  fifo->sem    = sys_sem_new(1);  /* critical section 1=free to enter */  fifo->getSem = sys_sem_new(0);  /* 0 = no one waiting */  fifo->getWaiting = FALSE;}

⌨️ 快捷键说明

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