环形缓存队列

本文介绍了单片机开发中环形缓存队列的使用,特别是在串口和DMA设备中的应用。通过定义适合的数据结构,并确保队列长度为2的幂,以简化索引处理。文章探讨了环形缓存如何优化数据传输和存储效率。
摘要由CSDN通过智能技术生成

单片机开发中经常碰到需要用到缓存的地方,例如串口,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) {
   
			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值