【开源实战笔记】移植ringbuf
1. RingBufferer
1.1简介
ringbuff是环形buff,是buff缓存的一种,可以用来存放程序运行过程的暂时数据。一般的buff即是一个数组,而环形buff就是将数组的头和尾链接起来的数组。
1.2. 为什么使用RingBufferer
RingBufferer比普通的buff使用更加高效灵活,可以边读数据边写数据,相较于数组,环形缓冲区对整段内存的利用达到最大。我们可以将串口收到数据先存进串口环形缓冲区,再设置一个消息环形缓冲区用于标识串口环形缓冲区的数据,MCU通过标识有针对性地处理数据
2. 移植RingBufferer
2.1. 准备裸机工程
事例使用Apollo开发版,主控芯片为STM32F429IG:
移植之前需要准备一份裸机工程,我使用STM32CubeMX生成,需要初始化以下配置:
初始化调试接口:
设置时钟来源,此处设为外部时钟:
配置串口USART1,中断方式接收数据,查询方式发送数据:
printf重定向:
此处复制了TencentOS tiny l431例程中的重定向代码,只是l431的句柄是huart2,根据原理图修改为huart1
2.3. 添加RingBufferer 到工程中
① 复制 RingBuffer 源码到工程中:
② 在keil中添加 RingBuffer 组件的源码文件与头文件路径:
3. 初始化配置
3.1 配置头文件
我们新建一个 config.h 文件用于集中管理头文件、宏、结构体声明、函数声明等内容
里面添加好 #include "ringbuffer.h"
3.1 定义消息数据类型
3.2 开辟消息环形缓冲区,实例化其句柄
main.c
3.3 初始化消息环形缓冲区
数据处理在main函数中while(1)前中进行,初始化消息环形缓冲区
3.4 开辟串口环形缓冲区,实例化其句柄
此处extern struct rt_ringbuffer msg_ringbuffer;声明该句柄在外部文件定义(main.c)
3.5 初始化消息环形缓冲区
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)
3.7 修改USART1中断处理函数
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 消息数据处理
先判断消息队列不为空,则有消息需要处理
从消息环形队列中读取字节:消息类型(1字节) + 消息参数(1字节)
在switch中针对特定消息进行处理,此处以打印接收到的串口1数据为事例。
3.9 while中调用消息数据处理函数
4.测试
- 点赞
- 收藏
- 关注作者
评论(0)