**循环缓冲fifo是先进先出的。生产者和消费者都只有一个,linux系统下使用提供了一种免锁的机制,处理时不用加锁。**UART下收发fifo主要是解决收发中断过于频繁,会导致CPU效率不高。
#include<stdio.h>
struct cycle_fifo_t
{
int *fifo_ptr;//数据缓冲的起始位置
volatile int rd;//读指针的地址
volatile int wr;//写指针的地址
int fifo_buffer;//数据区的大小
};
enum isr_name_t
{
second = 0,//秒任务的中断
button, //按键的中断
};
enum isr_name_t isr_name;//中断向量名
struct cycle_fifo_t isr_fifo;//中断向量的双向循环fifo
//
void fifo_init(struct cycle_fifo_t *fifo, void *buffer, int len)
{
fifo->fifo_ptr = buffer;//指向同一片内存地址
fifo->rd = 0;
fifo->wr = 0;
fifo->fifo_buffer = len;
}
//往fifo里面存放中断向量名
void fifo_put_byte(struct cycle_fifo_t *fifo, int isr_name)
{
//首先判断下fifo还有没有空间可以写
if (fifo_get_free_byte(fifo))
{
fifo->fifo_ptr[fifo->wr] = isr_name;
}
if (++fifo->wr == fifo->fifo_buffer)//fifo缓存的内容写到头了,需要从头开始写
{
fifo->wr =