关于-队列实现消息触发机制

本文探讨了在嵌入式开发中使用C语言实现队列处理消息机制的方法,对比了传统的flag标志位处理方式,详细介绍了如何利用RT-Thread的RingBuffer实现事件消息的存储与处理,以增强系统的耦合性和健壮性。

C语言—队列处理消息机制

使用背景介绍

嵌入式开发中,经常使用触发flag标志位去处理很多事件,最典型的就是中断触发类型,flag置位。然后主程序轮询检查flag状态,如果检测flag置位条件满足,则进行下一步的操作,比如说中断读取串口数据操作。
在这里插入图片描述

通用处理情况

中断回调函数处理如下,将触发标志置1

rt_err_t rz_uart1_recv_callback(rt_device_t dev, rt_size_t size)
{

	.......

 	recv_flag = 1;

	.......

}


应用处理处理,判断触发标志是否满足,

if (recv_flag) {
   recv_flag = 0;
    .......
}

这种处理方式适合通用处理方法,优点是程序简单,缺点是程序接口不好,要注意标志位清除。
如果多种类型的触发标志,那么要定义很多的flag去识别,这样对程序开发很不友好!

采用队列方式存储事件消息

队列使用RT-Thread自带的数据接口 RingBuffer 其实就是先进先出(FIFO)的循环缓冲区。把一段线性的存储空间当作一个环形的存储空间使用,可以提高存储空间的利用率。

具体的使用说明,参考这位博友的文章,写的很清楚。
ringbuffer使用
在这里插入图片描述

设计思路

  1. 将所有触发的标志位类型作为事件消息,入队操作,保证每个触发事件类型有且唯一。

  2. 出队获取对应的事件消息,判断是否对应的触发类型。

这样设计的好处利于系统的耦合性及健壮性。

中断程序修改如下:

msg_put(MSG_TYPE_RECV_DATA); /* 相当于	recv_flag = 1; 入队操作*/

应用程序修改:

msg_put(&msg_code);    /* recv_flag = 0,出队操作 */
if (MSG_TYPE_RECV_DATA == msg_code ) {
	........
}

源文件程序

使用LW_OOPC框架,使用面向对象思想进行模块封装。

#ifndef __RZ_MSG_H
#define __RZ_MSG_H

#include <rtthread.h>
#include "lw_oopc.h"
#include <stdbool.h>
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值