打印

使用消息队列处理事件的例子

[复制链接]
498|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
从此不早朝|  楼主 | 2022-6-6 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在嵌入式中开发应用消息队列处理事件主要是为了解耦,减少模块与模块之间的耦合。
数据结构:
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;


使用特权

评论回复
沙发
从此不早朝|  楼主 | 2022-6-6 10:42 | 只看该作者

将消息插入到消息队列中:
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;
}


使用特权

评论回复
板凳
从此不早朝|  楼主 | 2022-6-6 12:23 | 只看该作者
获取消息:
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;
}


使用特权

评论回复
地板
从此不早朝|  楼主 | 2022-6-6 12:27 | 只看该作者

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

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

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);
}
}


使用特权

评论回复
5
从此不早朝|  楼主 | 2022-6-6 12:28 | 只看该作者
测试:
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);
}
}


使用特权

评论回复
6
tpgf| | 2022-7-3 15:41 | 只看该作者
能解释一下这种耦合吗

使用特权

评论回复
7
qcliu| | 2022-7-3 18:00 | 只看该作者
模块之间耦合的危害是什么呢

使用特权

评论回复
8
coshi| | 2022-7-3 18:09 | 只看该作者
请问模块之间如何耦合的呢

使用特权

评论回复
9
drer| | 2022-7-3 18:20 | 只看该作者
在什么情况下使用结构体呢

使用特权

评论回复
10
kxsi| | 2022-7-3 18:28 | 只看该作者
这是在裸奔的情况下添加的是吗

使用特权

评论回复
11
wiba| | 2022-7-3 18:38 | 只看该作者
这样做以后处理起来也方便

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

185

帖子

0

粉丝