实时嵌入式系统的消息处理方法



1.本发明涉及一种实时嵌入式系统的消息处理方法,属于实时嵌入式系统领域。


背景技术:



2.实时嵌入式操作系统在工业自动化、航空航天等很多领域广泛应用,包括时间正确和功能正确两个方面。消息队列是实时嵌入式操作系统提供的一种中断服务程序和任务,以及任务之间同步和通信的重要机制。很多应用任务的运行方式就是基于消息驱动的,传递的数据包括遥测、遥信和遥控等,所需要的消息种类较多,消息长度的变化范围也很大。现有消息队列机制的实现有以下一些不足之处:(1)在发送方,任务在用户缓冲区填写消息内容,实时嵌入式内核将用户缓冲区的消息复制到内核的消息队列;在接收方,实时嵌入式内核将消息队列的消息复制到用户缓冲区,然后进行消息处理。这种方式存在着较多的消息复制,一定程度上降低了系统效率。
3.(2)为了解决上述(1)的不足,消息队列采用指针数组来实现。这种方式缺乏对消息大小、消息所用缓冲区的大小和消息所用缓冲区的来源等信息的详细描述,只能依靠简单的约定,从而给处理不同类型不同长度的消息带来不方便性。
4.(3)将一个消息发送到多个消息队列需要采用重复复制的方式,降低了系统效率。
5.(4)发送消息时,如果等待任务链表中有等待任务,则把消息直接传递给等待任务链表首任务。
6.如图1所示,假设消息队列为空,任务按优先级等待接收消息,低优先级任务t1从该消息队列接收消息并阻塞;一段时间后高优先级任务t3调度运行,向该消息队列发送消息,将消息直接传递给t1,并唤醒t1;再过一段时间后中优先级任务t2调度运行,从该消息队列接收消息,但不成功,阻塞;系统调度低优先级任务t1继续运行。图1表明中优先级任务t2并没有先于低优先级任务t1而接收到消息,没有很好地遵从实时嵌入式系统中的任务优先级。
7.(5)广播消息需要唤醒任务等待链表中的所有任务,如果任务等待链表中的任务数较多,则此操作较耗时;有时任务需要同时等待包括消息队列在内的多个内核对象,只要有一个内核对象就绪就要将该任务从所有内核对象的任务等待链表中删除,此操作也较耗时。
8.如图2所示,如果允许在中断服务程序中调用发送消息接口,则需要关中断以保护临界区代码。上述的广播消息或任务同时等待包括消息队列在内的多个内核对象都会导致临界区代码变长,即关中断的时间变长,从而降低了系统的实时性。


技术实现要素:



9.为解决现有技术存在的不足,本发明提出了一种实时嵌入式系统的消息处理方法,其目的是降低消息的复制次数,详细描述消息的相关属性,接收消息时能够遵从任务的优先级,在发送消息较耗时的情况下降低系统关中断的时间。
10.为了实现上述目的,本发明采用了以下技术方案。
11.一种实时嵌入式系统的消息处理方法,其特征是:系统有一个空闲消息节点池,一个空闲数据节点池,至少一个内存分区;消息节点包括下一个指针和数据节点指针,数据节点包括内存分区控制块指针、引用计数、消息大小和消息指针,消息队列控制块包括消息链表和任务等待链表;发送消息的处理:(1)中断服务程序或任务根据要发送消息的大小,从内存分区中获取一个内存块,填写消息,从空闲数据节点池获取一个数据节点,根据所用内存分区和获取的内存块分别填写该数据节点的内存分区控制块指针和消息指针,该数据节点的引用计数为此消息要发送到的消息队列数,以该数据节点指针为输入参数调用实时嵌入式内核的发送消息接口;(2)实时嵌入式内核从空闲消息节点池获取一个消息节点,该消息节点的数据节点指针为输入参数数据节点指针,将该消息节点插入到消息链表中;(3)如果任务等待链表中有等待任务,则删除并唤醒任务等待链表首任务;接收消息的处理:(1)任务调用实时嵌入式内核的接收消息接口;(2)如果消息链表中有消息节点,则删除首消息节点,该消息节点的数据节点指针作为输出参数,把该消息节点释放到空闲消息节点池中,执行(4),否则把任务插入到任务等待链表中,任务阻塞;(3)任务被唤醒后重新从接收消息的处理(2)开始执行;(4)任务根据输出参数数据节点指针访问数据节点,根据数据节点的消息指针处理消息,将数据节点中的引用计数减1,如果引用计数为0,先把数据节点的消息指针所指的内存块释放到数据节点的内存分区控制块指针所指的内存分区中,再把数据节点释放到空闲数据节点池中。
12.内存分区控制块包括空闲内存块链表指针、内存块大小、最大内存块数和空闲内存块数,同一内存区的内存块大小一样;系统初始化时根据应用需求确定创建的内存分区数、每个内存分区的内存块大小和最大内存块数;将内存分区按照内存块大小从小到大排序,获取内存块时根据消息的大小依次遍历内存分区,从首次满足消息大小的内存分区中分配一个内存块。
13.根据应用需求来选择把消息节点插入到消息链表中的顺序是按先进先出还是后进先出;根据应用需求来选择把任务插入到任务等待链表中的顺序是按任务优先级还是先进先出。
14.当广播消息或任务同时等待包括消息队列在内的多个内核对象时,在中断服务程序中调用发送消息接口,只是将发送消息接口及其参数写到中断发布队列中,由设为最高优先级的中断发布任务从中断发布队列中读取发送消息接口及其参数,转化为在任务发送消息。
15.在任务发送消息时利用禁止任务抢占的方式来保护实时嵌入式内核的内部数据结构,以缩短关中断的时间。
16.本发明的积极效果在于:采用本发明的方法,避免了将消息从用户缓冲区复制到
实时嵌入式系统的内核,再从内核复制到接收任务的用户缓冲区共两次复制,提高了消息传递的效率。同一内存分区里的内存块大小一样,即使频繁发送消息也不会造成内存碎片。任务发送消息时根据消息大小从合适的内存分区中获得内存块,以避免内存浪费。同一消息可以无复制发送到多个消息队列。任务接收到消息后能够把数据节点的消息指针所指的内存块释放到数据节点的内存分区控制块指针所指的内存分区中。发送消息时总是将消息节点插入到消息队列中,当消息队列的任务等待链表中有等待任务时,唤醒的首任务需要重新竞争接收消息,能够遵从实时嵌入式系统的任务优先级。当广播消息或任务同时等待包括消息队列在内的多个内核对象时,通过中断发布任务来发送消息,从而缩短了关中断的时间。
附图说明
17.图1是背景技术所述现有技术发送消息时被唤醒的任务总能获得消息的时序图。
18.图2是背景技术所述现有技术在中断服务程序中直接发送消息的示意图。
19.图3是本发明实施例内存分区示意图。
20.图4是本发明实施例空闲消息节点池示意图。
21.图5是本发明实施例空闲数据节点池示意图。
22.图6是本发明实施例消息链表示意图。
23.图7是本发明实施例任务等待链表示意图。
24.图8是本发明实施例使用多个内存分区的消息队列应用示意图。
25.图9是本发明实施例发送消息时被唤醒的任务需要竞争接收消息的示意图。
26.图10是本发明实施例采用中断发布队列和中断发布任务的发送消息示意图。
具体实施方式
27.下面结合附图和具体实施例进一步说明本发明。
28.先介绍主要的数据结构。
29.如图3所示,本发明实施例内存分区包括内存分区控制块和一定数量的内存块。内存分区控制块包括空闲内存块链表指针、内存块大小、最大内存块数和空闲内存块数,同一内存分区的内存块大小一样。
30.如图4所示,本发明实施例空闲消息节点池包括空闲消息节点池控制块和一定数量的空闲消息节点。空闲消息节点池控制块包括下一个指针、空闲消息节点数和已分配消息节点数;消息节点包括下一个指针和数据节点指针。
31.如图5所示,本发明实施例空闲数据节点池包括空闲数据节点池控制块和一定数量的空闲数据节点。空闲数据节点池控制块包括下一个指针、空闲数据节点数和已分配数据节点数;数据节点包括内存分区控制块指针、引用计数、消息大小和消息指针。
32.如图6和图7所示,本发明实施例消息队列控制块包括消息链表和任务等待链表。
33.如图6所示,消息链表包括写指针、读指针和消息节点数。一个消息由消息节点、数据节点和数据三部分组成,其中数据来自内存分区里的内存块。从图6可以看出,同一消息可以无复制发送到多个消息队列,此时需要记录好引用计数。
34.如图7所示,任务等待链表包括等待任务数、尾指针和头指针。挂在任务等待链表
上的是等待控制块,等待控制块的tcb指针指向等待任务的tcb,tcb的等待控制块表指针指向该任务的首个等待控制块,tcb的等待控制块个数指明该任务同时等待的包括消息队列在内的内核对象的个数。从图7可以看出,多个任务可以等待同一个内核对象,一个任务也可以同时等待包括消息队列在内的多个内核对象,形成横向和纵向两个维度的连接状态。
35.如图8所示,本发明实施例一个系统采集的数据需要通过消息队列来传递,且创建了多个内存分区。
36.系统初始化时创建一个空闲消息节点池,一个空闲数据节点池,多个内存分区。
37.发送消息的处理:(1)中断服务程序或任务根据要发送消息的大小,从内存分区中获取一个内存块,填写消息,从空闲数据节点池获取一个数据节点,根据所用内存分区和获取的内存块分别填写该数据节点的内存分区控制块指针和消息指针,该数据节点的引用计数为此消息要发送到的消息队列数,以该数据节点指针为输入参数调用实时嵌入式内核的发送消息接口;(2)实时嵌入式内核从空闲消息节点池获取一个消息节点,该消息节点的数据节点指针为输入参数数据节点指针,将该消息节点插入到消息链表中;(3)如果任务等待链表中有等待任务,则删除并唤醒任务等待链表首任务,唤醒的首任务重新竞争接收消息;接收消息的处理:(1)任务调用实时嵌入式内核的接收消息接口;(2)如果消息链表中有消息节点,则删除首消息节点,该消息节点的数据节点指针作为输出参数,把该消息节点释放到空闲消息节点池中,执行(4);如果消息链表中没有消息节点,把任务插入到任务等待链表中,任务阻塞;(3)任务被唤醒后重新从接收消息的处理(2)开始执行;(4)任务根据输出参数数据节点指针访问数据节点,根据数据节点的消息指针处理消息,将数据节点中的引用计数减1,如果引用计数为0,先把数据节点的消息指针所指的内存块释放到数据节点的内存分区控制块指针所指的内存分区中,再把数据节点释放到空闲数据节点池中。
38.按以上发送消息和接收消息的处理,如图9所示,假设消息队列为空,任务按优先级等待接收消息,低优先级任务t1从该消息队列接收消息并阻塞;一段时间后高优先级任务t3调度运行,向该消息队列发送消息,将消息插入到消息队列,并唤醒t1;再过一段时间后中优先级任务t2调度运行,从该消息队列成功接收到消息;再过一段时间后系统调度低优先级任务t1继续运行,t1重新接收消息,因为此时消息队列为空,所以再次阻塞。图9表明中优先级任务t2先于低优先级任务t1而接收到消息,很好地遵从了实时嵌入式系统中的任务优先级。
39.系统初始化时根据应用需求确定创建的内存分区数、每个内存分区的内存块大小和最大内存块数。假设消息的数据部分长度或称消息大小以字节为单位分布在以下区间段:(0,32],(32,64],(64,96],(96,256],并且消息大小分布在区间段(96,256]的频率较低,分布在区间段(0,32]的频率居中,分布在区间段(32,64]和(64,96]的频率较高,那么就可以创建4个内存分区,内存分区控制块指针依次是mempart1、mempart2、mempart3和mempart4,内存块的大小分别是32字节、64字节、96字节和256字节,最大内存块数分别是8
块、32块、32块和4块。
40.本实施例的4个内存分区按照内存块大小从小到大排序,依次是32字节、64字节、96字节和256字节,用一个内存分区控制块指针数组来存放排序结果,即mempart[4]={mempart1,mempart2,mempart3,mempart4}。获取内存块时根据消息的大小依次遍历内存分区,从首次满足消息大小的内存分区中分配一个内存块。比如任务需要填写一个88字节的消息,按从小到大依次遍历内存分区的结果是选择内存块大小是96字节的内存分区,即mempart3,接下来从mempart3中获取一个内存块来填写消息,相应的数据节点中的内存分区控制块指针为mempart3,消息指针为所获取的内存块指针。
[0041]
根据应用需求来选择把消息节点插入到消息链表中的顺序是按先进先出还是后进先出;根据应用需求来选择把任务插入到任务等待链表中的顺序是按任务优先级还是先进先出。
[0042]
当存在广播消息或任务同时等待包括消息队列在内的多个内核对象时,如图10所示,在中断服务程序中调用发送消息接口,只是将发送消息接口及其参数写到中断发布队列中,由设为最高优先级的中断发布任务从中断发布队列中读取发送消息接口及其参数,转化为在任务发送消息。
[0043]
引入的额外开销是在中断服务程序和中断发布任务之间需要通过关中断来实现临界区,但所涉及的只是中断发布队列和最高优先级0的中断发布任务相关的内部数据结构,系统中其它任务的优先级都不能设置为0。在任务发送消息时利用禁止任务抢占的方式来保护实时嵌入式内核的内部数据结构,以缩短关中断的时间。

技术特征:


1.一种实时嵌入式系统的消息处理方法,其特征是:系统有一个空闲消息节点池,一个空闲数据节点池,至少一个内存分区;消息节点包括下一个指针和数据节点指针,数据节点包括内存分区控制块指针、引用计数、消息大小和消息指针,消息队列控制块包括消息链表和任务等待链表;发送消息的处理:(1)中断服务程序或任务根据要发送消息的大小,从内存分区中获取一个内存块,填写消息,从空闲数据节点池获取一个数据节点,根据所用内存分区和获取的内存块分别填写该数据节点的内存分区控制块指针和消息指针,该数据节点的引用计数为此消息要发送到的消息队列数,以该数据节点指针为输入参数调用实时嵌入式内核的发送消息接口;(2)实时嵌入式内核从空闲消息节点池获取一个消息节点,该消息节点的数据节点指针为输入参数数据节点指针,将该消息节点插入到消息链表中;(3)如果任务等待链表中有等待任务,则删除并唤醒任务等待链表首任务;接收消息的处理:(1)任务调用实时嵌入式内核的接收消息接口;(2)如果消息链表中有消息节点,则删除首消息节点,该消息节点的数据节点指针作为输出参数,把该消息节点释放到空闲消息节点池中,执行(4),否则把任务插入到任务等待链表中,任务阻塞;(3)任务被唤醒后重新从接收消息的处理(2)开始执行;(4)任务根据输出参数数据节点指针访问数据节点,根据数据节点的消息指针处理消息,将数据节点中的引用计数减1,如果引用计数为0,先把数据节点的消息指针所指的内存块释放到数据节点的内存分区控制块指针所指的内存分区中,再把数据节点释放到空闲数据节点池中。2.如权利要求1所述的实时嵌入式系统的消息处理方法,其特征是:内存分区控制块包括空闲内存块链表指针、内存块大小、最大内存块数和空闲内存块数,同一内存区的内存块大小一样;系统初始化时根据应用需求确定创建的内存分区数、每个内存分区的内存块大小和最大内存块数;将内存分区按照内存块大小从小到大排序,获取内存块时根据消息的大小依次遍历内存分区,从首次满足消息大小的内存分区中分配一个内存块。3.如权利要求1所述的实时嵌入式系统的消息处理方法,其特征是:根据应用需求来选择把消息节点插入到消息链表中的顺序是按先进先出还是后进先出;根据应用需求来选择把任务插入到任务等待链表中的顺序是按任务优先级还是先进先出。4.如权利要求1或2或3所述的实时嵌入式系统的消息处理方法,其特征是:当广播消息或任务同时等待包括消息队列在内的多个内核对象时,在中断服务程序中调用发送消息接口,只是将发送消息接口及其参数写到中断发布队列中,由设为最高优先级的中断发布任务从中断发布队列中读取发送消息接口及其参数,转化为在任务发送消息。5.如权利要求4所述的实时嵌入式系统的消息处理方法,其特征是:在任务发送消息时利用禁止任务抢占的方式来保护实时嵌入式内核的内部数据结构,以缩短关中断的时间。

技术总结


本发明是一种实时嵌入式系统的消息处理方法。系统有一个空闲消息节点池,一个空闲数据节点池,至少一个内存分区。中断服务程序或任务根据要发送消息的大小,从内存分区中获取一个内存块。一个消息包括消息节点、数据节点和数据三部分,数据节点的引用计数表示同一消息要发送到的消息队列数。任务等待链表的首任务唤醒后需要重新竞争接收消息。处理完消息后递减数据节点的引用计数,当引用计数为0时,先把数据节点的消息指针所指的内存块释放到数据节点的内存分区控制块指针所指的内存分区中,再把数据节点释放到空闲数据节点池中。再把数据节点释放到空闲数据节点池中。再把数据节点释放到空闲数据节点池中。


技术研发人员:

韩明峰

受保护的技术使用者:

烟台理工学院

技术研发日:

2023.01.10

技术公布日:

2023/3/10

本文发布于:2024-09-21 18:56:12,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/69510.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:消息   节点   内存   指针
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议