嵌入式 | 使用消息队列处理事件的例子

Posted 嵌入式大杂烩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式 | 使用消息队列处理事件的例子相关的知识,希望对你有一定的参考价值。

原文:https://blog.csdn.net/qq_36413982/article/details/108110422

在嵌入式中开发应用消息队列处理事件主要是为了解耦,减少模块与模块之间的耦合。

实现

数据结构:

typedef struct msg_node
 void *parm;
 void (*handler)(void *parm); 
msg_node_t;  /* 消息数据结构 */

typedef struct msg_driver
    unsigned int in;               //写入的位置
    unsigned int out;              //读出的位置
    msg_node_t *buf[MSG_DRIVER_SIZE];    
msg_driver_t;

将消息插入到消息队列中:

bool publish_msg(msg_driver_t *msg_buf, msg_node_t *msg)

    if( is_msg_buf_full (msg_buf) == TRUE )
    
        return FALSE;
    

    msg_buf->buf[msg_buf->in] = msg;
    msg_buf->in = (++msg_buf->in) % MSG_DRIVER_SIZE;    //防止越界
 
 return TRUE;

获取消息:

static msg_node_t *get_messge(msg_driver_t *msg_buf)

 msg_node_t *msg = NULL;
    if( is_msg_buf_empty(msg_buf) )
    
        return NULL;
    

    msg = msg_buf->buf[msg_buf->out];
    msg_buf->out = (++msg_buf->out) % MSG_DRIVER_SIZE;    //防止越界

    return msg;

从队列循环取出消息处理:

由于每次发布消息都是送的处理函数指针,所以处理函数都不用修改。

void message_driver_handle(msg_driver_t *msg_buf)

 msg_node_t *msg;
 while( (msg = get_messge(msg_buf)) != NULL )
 
  if (msg->handler != NULL)
   msg->handler(msg->parm);
 

测试:

msg_driver_t msg_driver;

static void msg1_handle(void *parm)

 printf("gets msg1\\r\\n");


static void msg2_handle(void *parm)

 printf("get msg2\\r\\n");


static void msg3_handle(void *parm)

 printf("do msg3\\r\\n");


msg_node_t msg1 = 
 .parm = "I love u",
 .handler = msg1_handle
;

msg_node_t msg2 = 
 .parm = "I hate u",
 .handler = msg2_handle
;

msg_node_t msg3 = 
 .parm = NULL,
 .handler = msg3_handle
;

publish_msg(&msg_driver, &msg1);
publish_msg(&msg_driver, &msg2);
publish_msg(&msg_driver, &msg3);

int main(void)

 while(1)
 
   message_driver_handle(&msg_driver);
 

版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

猜你喜欢:

一个实用的、可应用于单片机的内存管理模块

分享一款小巧好用的代码对比工具

一个300多行代码实现的多任务管理的OS

分享嵌入式中几个实用的shell脚本!

分享一份嵌入式软件工具清单!

queue.h:一个实用的头文件

一个高效的界面开发解决方案

分享一组通用的C基础库

实用 | 10分钟教你搭建一个嵌入式web服务器

干货 | 浅析程序开机自启动

几个Makefile通用模板分享!

实用 | 一个高性能通信库的简单使用分享

实用工具 | LVGL GUI-Guider的使用分享

C语言、嵌入式中几个非常实用的宏技巧

在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总。

点击阅读原文,查看更多分享。

点个

以上是关于嵌入式 | 使用消息队列处理事件的例子的主要内容,如果未能解决你的问题,请参考以下文章

如何使用消息队列在 Node JS 中执行长事件处理?

Qt事件机制(是动作发生后,一种通知对象的消息,是被动与主动的总和。先处理自己队列中的消息,然后再处理系统消息队列中的消息)

裸机中环形队列与RTOS中消息队列的区别

消息队列和事件循环

译文|如何将 Pulsar 用作消息队列

阿里云消息队列 RocketMQ 5.0 全新升级:消息事件流融合处理平台