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

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

【技术实现步骤摘要】
实时嵌入式系统的消息处理方法


[0001]本专利技术涉及一种实时嵌入式系统的消息处理方法,属于实时嵌入式系统领域。

技术介绍

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

技术实现思路

[0009]为解决现有技术存在的不足,本专利技术提出了一种实时嵌入式系统的消息处理方法,其目的是降低消息的复制次数,详细描述消息的相关属性,接收消息时能够遵从任务的优先级,在发送消息较耗时的情况下降低系统关中断的时间。
[0010]为了实现上述目的,本专利技术采用了以下技术方案。
[0011]一种实时嵌入式系统的消息处理方法,其特征是:系统有一个空闲消息节点池,一个空闲数据节点池,至少一个内存分区;消息节点包括下一个指针和数据节点指针,数据节点包括内存分区控制块指针、引用计数、消息大小和消息指针,消息队列控制块包括消息链表和任务等待链表;发送消息的处理:(1)中断服务程序或任务根据要发送消息的大小,从内存分区中获取一个内存块,填写消息,从空闲数据节点池获取一个数据节点,根据所用内存分区和获取的内存块分别填写该数据节点的内存分区控制块指针和消息指针,该数据节点的引用计数为此消息要发送到的消息队列数,以该数据节点指针为输入参数调用实时嵌入式内核的发送消息接口;(2)实时嵌入式内核从空闲消息节点池获取一个消息节点,该消息节点的数据节点指针为输入参数数据节点指针,将该消息节点插入到消息链表中;(3)如果任务等待链表中有等待任务,则删除并唤醒任务等待链表首任务;接收消息的处理:(1)任务调用实时嵌入式内核的接收消息接口;(2)如果消息链表中有消息节点,则删除首消息节点,该消息节点的数据节点指针作为输出参数,把该消息节点释放到空闲消息节点池中,执行(4),否则把任务插入到任务等待链表中,任务阻塞;(3)任务被唤醒后重新从接收消息的处理(2)开始执行;(4)任务根据输出参数数据节点指针访问数据节点,根据数据节点的消息指针处理消息,将数据节点中的引用计数减1,如果引用计数为0,先把数据节点的消息指针所指的内存块释放到数据节点的内存分区控制块指针所指的内存分区中,再把数据节点释放到空闲数据节点池中。
[0012]内存分区控制块包括空闲内存块链表指针、内存块大小、最大内存块数和空闲内存块数,同一内存区的内存块大小一样;系统初始化时根据应用需求确定创建的内存分区数、每个内存分区的内存块大小和最大内存块数;将内存分区按照内存块大小从小到大排序,获取内存块时根据消息的大小依次遍历内存分区,从首次满足消息大小的内存分区中分配一个内存块。
[0013]根据应用需求来选择把消息节点插入到消息链表中的顺序是按先进先出还是后进先出;根据应用需求来选择把任务插入到任务等待链表中的顺序是按任务优先级还是先进先出。
[0014]当广播消息或任务同时等待包括消息队列在内的多个内核对象时,在中断服务程序中调用发送消息接口,只是将发送消息接口及其参数写到中断发布队列中,由设为最高优先级的中断发布任务从中断发布队列中读取发送消息接口及其参数,转化为在任务发送消息。
[0015]在任务发送消息时利用禁止任务抢占的方式来保护实时嵌入式内核的内部数据结构,以缩短关中断的时间。
[0016]本专利技术的积极效果在于:采用本专利技术的方法,避免了将消息从用户缓冲区复制到
实时嵌入式系统的内核,再从内核复制到接收任务的用户缓冲区共两次复制,提高了消息传递的效率。同一内存分区里的内存块大小一样,即使频繁发送消息也不会造成内存碎片。任务发送消息时根据消息大小从合适的内存分区中获得内存块,以避免内存浪费。同一消息可以无复制发送到多个消息队列。任务接收到消息后能够把数据节点的消息指针所指的内存块释放到数据节点的内存分区控制块指针所指的内存分区中。发送消息时总是将消息节点插入到消息队列中,当消息队列的任务等待链表中有等待任务时,唤醒的首任务需要重新竞争接收消息,能够遵从实时嵌入式系统的任务优先级。当广播消息或任务同时等待包括消息队列在内的多个内核对象时,通过中断发布任务来发送消息,从而缩短了关中断的时间。
附图说明
[0017]图1是
技术介绍
所述现有技术发送消息时被唤醒的任务总能获得消息的时序图。
[0018]图2是
技术介绍
所述现有技术在中断服务程序中直接发送消息的示意图。
[0019]图3是本专利技术实施例内存分区示意图。
[0020]图4是本专利技术实施例空闲消息节点池示意图。
[0021]图5是本专利技术实施例空闲数据节点池示意图。
[0022]图6是本专利技术实施例消息链表示意图。
[0023]图7是本专利技术实施例任务等待链表示意图。
[0024]图8是本专利技术实施例使用多个内存分区的消息队列应用示意图。
[0025]图9是本专利技术实施例发送本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种实时嵌入式系统的消息处理方法,其特征是:系统有一个空闲消息节点池,一个空闲数据节点池,至少一个内存分区;消息节点包括下一个指针和数据节点指针,数据节点包括内存分区控制块指针、引用计数、消息大小和消息指针,消息队列控制块包括消息链表和任务等待链表;发送消息的处理:(1)中断服务程序或任务根据要发送消息的大小,从内存分区中获取一个内存块,填写消息,从空闲数据节点池获取一个数据节点,根据所用内存分区和获取的内存块分别填写该数据节点的内存分区控制块指针和消息指针,该数据节点的引用计数为此消息要发送到的消息队列数,以该数据节点指针为输入参数调用实时嵌入式内核的发送消息接口;(2)实时嵌入式内核从空闲消息节点池获取一个消息节点,该消息节点的数据节点指针为输入参数数据节点指针,将该消息节点插入到消息链表中;(3)如果任务等待链表中有等待任务,则删除并唤醒任务等待链表首任务;接收消息的处理:(1)任务调用实时嵌入式内核的接收消息接口;(2)如果消息链表中有消息节点,则删除首消息节点,该消息节点的数据节点指针作为输出参数,把该消息节点释放到空闲消息节点池中,执行(4),否则把任务插入到任务等待链表中,任务阻塞;(3)任务被唤醒后重新从接收消息的处理(2)开始执行;(4)任务根据输出参数数据节点指针访问数据节点,根据数据节点的消息指针处理消息,将数据节点中的引用计数减1,如果引用计数为0...

【专利技术属性】
技术研发人员:韩明峰
申请(专利权)人:烟台理工学院
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1