单片机开发中经常碰到需要用到缓存的地方,例如串口,DMA等设备工作时,下面介绍一种简单的环形缓存队列
定义数据结构
typedef struct _char_fifo
{
uint8_t* pbuf; /* 缓存数据的内存空间 */
volatile uint32_t in; /* 写队列idx */
volatile uint32_t out; /* 读队列idx */
uint32_t mask; /* 2^N -1,N is 1~32,方便对idx进行处理 */
} cycle_common_fifo;
这里队列长读必须使用2^N,mask = 2^N -1。这样会很方便的处理idx读写问题 let`s get start
/*
* 向环形缓存队列写入len个字节数据
*/
int32_t drv_cycle_fifo_in_len(cycle_common_fifo* p_fifo, uint8_t* data, uint32_t len)
{
uint32_t rest_len, rest_in;
/* 计算队列剩余长读 */
rest_len = p_fifo->in - p_fifo->out;
rest_len = p_fifo->mask + 1 - rest_len;
if (rest_len >= len) {
/* 写idx到队列尾长度 */
rest_in = p_fifo->mask + 1 - (p_fifo->in & p_fifo->mask);
if (rest_in >= len) {