一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种事件驱动型消息处理方法与流程

2022-10-29 00:32:31 来源:中国专利 TAG:


1.本公开一般涉及计算机控制技术领域,具体涉及一种事件驱动型消息处理方法。


背景技术:

2.事件发起-处理是计算机控制系统常见的处理方式,在嵌入式控制领域中,事件消息的发起以及对事件消息的处理通常都耦合在一起;在该耦合方式中,需要把多个功能块绑定在一起进行处理,这就导致在多个功能块绑定处理的过程中,处理效率较低,浪费了嵌入式实时操作系统的多任务特性以及cpu多核特定,同时增多的功能块也降低了事件发起的效率。


技术实现要素:

3.鉴于现有技术中的上述缺陷或不足,期望提供可解决上述技术问题的一种事件驱动型消息处理方法。
4.本技术提供一种事件驱动型消息处理方法,包括:
5.通过消息队列接收驱动消息结构体,所述驱动消息结构体存储有所述事件消息的类型、所有权属性、指向所述事件消息的指针以及所述事件消息的长度;所述事件消息的类型为枚举型变量;
6.定义驱动消息结构体变量,将所接收到的所述驱动消息结构体赋值到所述驱动消息结构体变量中;
7.定义事件处理结构体,所述事件处理结构体包括事件处理类型以及与事件处理类型对应的消息处理函数指针;所述事件处理类型的类型为枚举型变量;
8.定义事件消息处理表,所述事件消息处理表包括多个所述事件处理结构体;
9.根据所述驱动消息结构体变量的事件消息的类型,通过所述事件消息处理表确定所述消息处理函数指针;以寻址方式运行所述消息处理函数指针所指向的消息处理函数;
10.判断所述驱动消息结构体变量的事件消息的所有权属性为0x00时,将所述驱动消息结构体变量拷贝到全局数据空间作为公有数据使用;判断所述驱动消息结构体变量的事件消息的所有权属性为0x01时,将所述驱动消息结构体变量发送到待使用任务。
11.根据本技术实施例提供的技术方案,所述驱动消息结构体由发送端通过以下步骤实现:
12.基于ucos中队列创建函数osqcreate创建消息队列;
13.接收所述驱动消息结构体的地址以及所述消息队列的句柄;
14.基于ucos中队列发送函数osqpost通过所述消息队列发送所述驱动消息结构体。
15.根据本技术实施例提供的技术方案,所述驱动消息结构体由以下步骤生成得到:
16.定义驱动消息结构体,所述驱动消息结构体的成员包括事件消息的类型、所有权属性、指向所述事件消息的指针以及所述事件消息的长度;所述事件消息的类型为枚举型变量;
17.在发送线程中对所述驱动消息结构体的各成员赋值。
18.根据本技术实施例提供的技术方案,还包括:设置接收所述驱动消息结构体的阻塞时间。
19.根据本技术实施例提供的技术方案,在发送线程中对所述驱动消息结构体赋值的方法具体为,在发送线程中:
20.将事件消息的类型赋值到所述驱动消息结构体中的事件消息的类型成员;
21.将事件消息的所有权属性赋值到所述驱动消息结构体中的所有权属性成员;
22.使用c标准库提供的动态内存申请函数malloc申请存储空间,所述存储空间的大小为所述事件消息所占内存空间的大小,将所述事件消息存储至所申请到的存储空间中,得到指向所述事件消息的指针,并将其赋值到所述驱动消息结构体中的指向所述事件消息的指针成员;
23.将事件消息的长度赋值到所述驱动消息结构体中的事件消息的长度成员。
24.根据本技术实施例提供的技术方案,所述在发送线程中对所述驱动消息结构体赋值之前,还包括:初始化所述驱动消息结构体。
25.根据本技术实施例提供的技术方案,所述事件驱动型消息处理方法还包括:定义用户数据结构体;所述消息处理函数指针为导航数据融合函数指针,所述导航数据融合函数指针指向导航数据融合函数,所述导航数据融合函数用于:
26.获取所述驱动消息结构体中的所述指向所述事件消息的指针和所述事件消息的长度;
27.使用c标准库中的内存拷贝函数将所述指向所述事件消息的指针为起始地址,将具有所述事件消息的长度的事件消息拷贝到所述用户数据结构体中,并使用所述用户数据结构体中的数据进行卡尔曼滤波计算。
28.本技术的有益效果在于:通过在发送线程中以消息队列为载体,将所述事件消息的类型、所有权属性、指向所述事件消息的指针以及所述事件消息的长度以驱动消息结构体的形式发送至接收端,接收端接收到该驱动消息结构体后,通过所定义的事件消息处理表确定该事件消息类型所对应的消息处理函数指针,以寻址方式运行该消息处理函数,以便于对所述事件消息进行处理,最后通过判断驱动消息结构体中事件消息的所有权属性,使得可以适应性的、定向的将其分配至全局数据空间或发送至待使用其的任务线程中,由此实现了事件消息的发起者与处理者的解耦合,通过消息队列的隔离,发起者只需将事件消息的信息通过消息队列发送出去,不用关心处理者的处理逻辑,以便处理者根据系统调度最大效率的处理事件消息。对于同一个事件处理者增多的情况,由于消息队列的隔离,不会降低消息事件的发起效率。
附图说明
29.通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本技术的其它特征、目的和优点将会变得更明显:
30.图1为本技术提供的一种事件驱动型消息处理方法的结构图。
eventprocessor包括事件处理类型以及与事件处理类型对应的消息处理函数指针;所述事件处理类型的类型为枚举型变量;
50.具体的,所述事件处理结构体中的事件处理类型eventtype以及所述消息处理函数指针一一对应;
51.s4:定义事件消息处理表,所述事件消息处理表包括多个所述事件处理结构体,本实例中以表-1为例进行说明:
[0052][0053][0054]
表-1
[0055]
s5:根据所述驱动消息结构体变量的事件消息的类型,通过所述事件消息处理表确定所述消息处理函数指针;以寻址方式运行所述消息处理函数指针所指向的消息处理函数;
[0056]
本实例中所接收到的驱动消息结构体struct threadevent中事件消息的类型为导航数据类型;由上述表1可知,该导航数据类型所对应的消息处理函数指针为:导航数据融合函数指针nav_tackle,消息处理函数为导航数据融合函数;
[0057]
s6:判断所述驱动消息结构体变量的事件消息的所有权属性为0x01,将所述驱动消息结构体变量发送到待使用任务。
[0058]
工作原理:通过在发送线程中以消息队列为载体,将所述事件消息的类型、所有权属性、指向所述事件消息的指针以及所述事件消息的长度以驱动消息结构体的形式发送至接收端,接收端接收到该驱动消息结构体后,通过所定义的事件消息处理表确定该事件消息类型所对应的消息处理函数指针,以寻址方式运行该消息处理函数指针所指向的消息处理函数,以便于对所述事件消息进行处理,最后通过判断驱动消息结构体中事件消息的所有权属性,使得可以适应性的、定向的将其分配至全局数据空间或发送至待使用其的任务线程中,由此实现了事件消息的发起者与处理者的解耦合,通过消息队列的隔离,发起者只需将事件消息的信息通过消息队列发送出去,不用关心处理者的处理逻辑,以便处理者根据系统调度最大效率的处理事件消息。对于同一个事件处理者增多的情况,由于消息队列的隔离,不会降低消息事件的发起效率。
[0059]
在一些实施例中,所述驱动消息结构体由发送端通过以下步骤实现:
[0060]
基于ucos中队列创建函数osqcreate创建消息队列;
[0061]
接收所述驱动消息结构体的地址以及所述消息队列的句柄;
[0062]
基于ucos中队列发送函数osqpost通过所述消息队列发送所述驱动消息结构体。
[0063]
具体的,所述ucos是指一种开源的抢占式多任务实时操作系统。
[0064]
在一些实施例中,步骤s1中通过消息队列接收驱动消息结构体具体为:
[0065]
在接收端使用任务接收函数osqpend对所述驱动消息结构体进行接收处理,所述任务接收函数osqpend的传入参数包括:
[0066]

所述消息队列的句柄;
[0067]

接收数据所存放的地址,即驱动消息结构体变量revent的地址。
[0068]
在一些实施例中,还包括:设置接收所述驱动消息结构体的阻塞时间。优选的,所述设置接收所述驱动消息结构体的阻塞时间作为所述任务接收函数osqpend的传入参数,例如所述阻塞时间设置为portmax_delay,表示如果队列为空,则一直阻塞。
[0069]
在一些实施例中,所述驱动消息结构体由以下步骤生成得到:
[0070]
定义驱动消息结构体,所述驱动消息结构体的成员包括事件消息的类型、所有权属性、指向所述事件消息的指针以及所述事件消息的长度;所述事件消息的类型为枚举型变量;
[0071]
在发送线程中对所述驱动消息结构体的各成员赋值,即对所述驱动消息结构体中的四个成员赋值:事件消息的类型、所有权属性、指向所述事件消息的指针以及所述事件消息的长度。
[0072]
在一些实施例中,在发送线程中对所述驱动消息结构体赋值的方法具体为,在发送线程中:
[0073]
将事件消息的类型赋值到所述驱动消息结构体中的事件消息的类型成员;
[0074]
将事件消息的所有权属性赋值到所述驱动消息结构体中的所有权属性成员;
[0075]
使用c标准库提供的动态内存申请函数malloc申请存储空间,所述存储空间的大小为所述事件消息所占内存空间的大小,将所述事件消息存储至所申请到的存储空间中,得到指向所述事件消息的指针,并将其赋值到所述驱动消息结构体中的指向所述事件消息的指针成员;
[0076]
将事件消息的长度赋值到所述驱动消息结构体中的事件消息的长度成员。
[0077]
具体的,所述存储空间例如可以为:操作系统中的堆空间。
[0078]
在一些实施例中,所述在发送线程中对所述驱动消息结构体赋值之前,还包括:初始化所述驱动消息结构体。即对所述驱动消息结构体的各成员进行清零处理。
[0079]
在一些实施例中,所述事件驱动型消息处理方法还包括:定义用户数据结构体;所述消息处理函数指针为导航数据融合函数指针,所述导航数据融合函数指针指向导航数据融合函数,所述导航数据融合函数用于:
[0080]
获取所述驱动消息结构体中的所述指向所述事件消息的指针和所述事件消息的长度;
[0081]
使用c标准库中的内存拷贝函数将所述指向所述事件消息的指针为起始地址,将具有所述事件消息的长度的事件消息拷贝到所述数据结构体中,并使用所述用户数据结构体中的数据进行卡尔曼滤波计算。
[0082]
由此实现了将驱动消息结构体的数据存储至用户数据结构体中,避免了事件处理
者直接操作事件消息触发端的数据,进而避免当多个事件处理者同时操作数据时出现数据的篡改;同时将根据数据指针和长度直接赋值到所述用户数据结构体可以自然将数据进行解析,方便进一步使用。
[0083]
以上描述仅为本技术的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本技术中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离所述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本技术中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献