【开源实战笔记】移植ringbuf

举报
LongYorke 发表于 2021/07/26 12:12:37 2021/07/26
【摘要】 1. RingBufferer 1.1简介ringbuff是环形buff,是buff缓存的一种,可以用来存放程序运行过程的暂时数据。一般的buff即是一个数组,而环形buff就是将数组的头和尾链接起来的数组。 1.2. 为什么使用RingBuffererRingBufferer比普通的buff使用更加高效灵活,可以边读数据边写数据,相较于数组,环形缓冲区对整段内存的利用达到最大。我们可以将...

1. RingBufferer

1.1简介

ringbuff是环形buff,是buff缓存的一种,可以用来存放程序运行过程的暂时数据。一般的buff即是一个数组,而环形buff就是将数组的头和尾链接起来的数组。

1.2. 为什么使用RingBufferer

RingBufferer比普通的buff使用更加高效灵活,可以边读数据边写数据,相较于数组,环形缓冲区对整段内存的利用达到最大。我们可以将串口收到数据先存进串口环形缓冲区,再设置一个消息环形缓冲区用于标识串口环形缓冲区的数据,MCU通过标识有针对性地处理数据

2. 移植RingBufferer

2.1. 准备裸机工程

事例使用Apollo开发版,主控芯片为STM32F429IG:

移植之前需要准备一份裸机工程,我使用STM32CubeMX生成,需要初始化以下配置:

初始化调试接口:

img

设置时钟来源,此处设为外部时钟:

img

配置串口USART1,中断方式接收数据,查询方式发送数据:

img

printf重定向:

此处复制了TencentOS tiny l431例程中的重定向代码,只是l431的句柄是huart2,根据原理图修改为huart1

img

2.3. 添加RingBufferer 到工程中

① 复制 RingBuffer 源码到工程中:

img

② 在keil中添加 RingBuffer 组件的源码文件与头文件路径:

img

3. 初始化配置

3.1 配置头文件

我们新建一个 config.h 文件用于集中管理头文件、宏、结构体声明、函数声明等内容

里面添加好 #include "ringbuffer.h"

img

3.1 定义消息数据类型

img

3.2 开辟消息环形缓冲区,实例化其句柄

main.c

img

3.3 初始化消息环形缓冲区

数据处理在main函数中while(1)前中进行,初始化消息环形缓冲区

img

3.4 开辟串口环形缓冲区,实例化其句柄

此处extern struct rt_ringbuffer msg_ringbuffer;声明该句柄在外部文件定义(main.c)

img

3.5 初始化消息环形缓冲区

img

3.6 使能串口相关中断

使能串口接收非空中断:__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);

若需串口接收回调,请使用HAL_UART_Receive_IT ,使用回调后,中断调用顺序为 USART1_IRQHandler ->HAL_UART_IRQHandler(&huart1)(需在中断处理函数中显示调用)->UART_Receive_IT -> HAL_UART_RxCpltCallback

使能串口接收空闲中断:__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);

声明usart1_recv_ringbuf句柄在外部文件定义(stm32f4xxit.c)

img

3.7 修改USART1中断处理函数

img

		HAL_UART_Receive(&huart1, &receive_char, 1, 1000);
		rt_ringbuffer_put(&usart1_recv_ring_buf,&receive_char,1);
		s_USART1_RecFrameLen++;

非空中断:每收到一字节数据,就向串口1环形队列中发送,s_USART1_RecFrameLen用于记录数据长度

空闲中断(即数据接收完毕):当一帧数据接收完毕时,往消息队列msg_ring_buf中发送系统消息

消息类型为:MSG_USART1_RECLFINISH

消息参数为:帧长度

3.8 消息数据处理

img

先判断消息队列不为空,则有消息需要处理

从消息环形队列中读取字节:消息类型(1字节) + 消息参数(1字节)

在switch中针对特定消息进行处理,此处以打印接收到的串口1数据为事例。

3.9 while中调用消息数据处理函数

img

4.测试

img

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。