FIFO队列三(动态队列实现)

系列文章目录
FIFO队列一(原理)
FIFO队列二(静态环形队列实现)
FIFO队列三(动态队列实现)



前言

硬件:百问网100ASK_STM32F103_MINI开发板(STM32F103C8T6)
IDE:KEIL 5
按键GPIO口为:PA0
串口为:PA10(USART1_RX)、PA9(USART1_TX)
原理图如下:
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、初始化队列

/*
  函数名:
  功能:初始化一个指定的环形缓冲区
  输入参数:buffer_pst->指向目标缓冲区;
  输入参数:size->表示缓冲区分配的内存大小,单位是字节
  输出参数:
  返回值:-1->表示错误;0->表示成功
*/
int iBufInit(pRingBuffer_TypeDef buffer_pst,uint16_t size){
	
	if (buffer_pst == NULL || size == 0){
	    return -1;
	}
	
	if(buffer_pst->fifo == NULL){
	    buffer_pst->fifo = (uint8_t *)malloc(size);
	}
	buffer_pst->pr =0;
	buffer_pst->pw = 0;
	buffer_pst->buf_size = size;
	return 0;

}

二、写队列

/*
  函数名:
  功能:
  输入参数:
  输出参数:
  返回值:
*/
int iBufWrite(pRingBuffer_TypeDef buffer_pst,const uint8_t data){
	
	if(buffer_pst == NULL || buffer_pst->fifo==NULL) return -1;
	
    int i = (buffer_pst->pw+1)% buffer_pst->buf_size;
	if(i != buffer_pst->pr){
	    buffer_pst->fifo[buffer_pst->pw] = data;
		buffer_pst->pw = i; //(buffer_pst->pw+1)% buffer_pst->buf_size;
		return 0;
	}
	return -1;
}
/*
  函数名:
  功能:
  输入参数:
  输出参数:
  返回值:
*/
int iBufWriteBytes(pRingBuffer_TypeDef buffer_pst,const uint8_t * data_stream,uint8_t len){

    int i = 0;
	
    if(buffer_pst == NULL || buffer_pst->fifo==NULL) return -1;
    if(data_stream == NULL) return -1;
	if(len ==0) return -1;
    
	
    for(i=0;i<len;i++){
       if(iBufWrite(buffer_pst,data_stream[i]) != 0) break;
    }
    return i; //之后只要判断 len 是否 等于 i,就可以知道 是否存完完
}

三、读队列

/*
  函数名:
  功能:
  输入参数:
  输出参数:
  返回值:
*/
int iBufRead(pRingBuffer_TypeDef buffer_pst, uint8_t * data){
	
    if(buffer_pst == NULL || buffer_pst->fifo==NULL) return -1;
    if(data == NULL) return -1;
	
    if(buffer_pst->pr == buffer_pst->pw) return -1;
	
	*data = buffer_pst->fifo[buffer_pst->pr];
	buffer_pst->pr = (buffer_pst->pr+1)% buffer_pst->buf_size;
	return 0;
}
/*
  函数名:
  功能:
  输入参数:
  输出参数:
  返回值:
*/
int iBufReadBytes(pRingBuffer_TypeDef buffer_pst, uint8_t * data_stream,uint8_t len){
    
    int i =0;
	
    if(buffer_pst == NULL || buffer_pst->fifo==NULL) return -1;
    if(data_stream == NULL) return -1;
	if(len ==0) return -1;
	
	for(i=0;i<len;i++){
	    if(iBufRead(buffer_pst,&data_stream[i]) != 0) break;
	}
	return i;
}

四、清除队列

/*
  函数名:
  功能:
  输入参数:
  输出参数:
  返回值:
*/
int iBufClean(pRingBuffer_TypeDef buffer_pst){
	
	if(buffer_pst == NULL || buffer_pst->fifo==NULL) return -1;
	
	memset(buffer_pst->fifo,0,buffer_pst->buf_size);
	buffer_pst->pr =0;
	buffer_pst->pw = 0;
	return 0;
}

五、初始化队列


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值