线程间消息监控方法、装置、计算机设备和存储介质与流程

文档序号:13804694阅读:127来源:国知局
线程间消息监控方法、装置、计算机设备和存储介质与流程
本发明涉及计算机
技术领域
,特别是涉及一种线程间消息监控方法、装置、计算机设备和存储介质。
背景技术
:随着计算机科学技术的发展,越来越多的设备装载嵌入式系统,嵌入式系统的软件复杂度越来越高,对于一些偶然发生的错误,需要花费很长的时间和很高的成本才能够实现问题重现,而且由于不知道嵌入式系统内部的运行情况,即使问题重现也无法判断故障的原因,导致检测和修复这些软件故障成为难题。传统的分析故障的方法大多是通过问题的现象推测原因,然后通过对涉及原因部分的代码进行修改,根据修改后的代码判断故障的原因,这种方法耗时长、效率低,有时甚至找不到根本原因,只能采用规避故障的方式,防止错误再次发生。技术实现要素:基于此,有必要针对判断故障原因耗时长、效率低的问题,提供一种线程间消息监控方法、装置、计算机设备和存储介质。一种线程间消息监控方法,所述方法包括:获取线程间消息;通过缓存状态器检测环形缓冲区是否处于空闲状态;若所述环形缓冲区处于空闲状态,则通过缓存控制器锁定所述环形缓冲区,将所述线程间消息存储在所述环形缓冲区中;将所述环形缓冲区中的所述线程间消息发送到监控设备,以使所述监控设备对所述线程间消息进行监控。一种线程间消息监控方法,所述方法包括:接收嵌入式设备发送的线程间消息,所述线程间消息是所述嵌入式设备采用线程间消息监控方法获取到的;将所述线程间消息输出到显示界面;检测所述线程间消息是否存在异常,若是,则解析所述线程间消息,生成线程间消息文本信息;在显示界面输出所述线程间消息文本信息,并输出对所述线程间消息存在异常的提示信息。一种线程间消息监控装置,所述装置包括:消息获取模块,用于获取线程间消息;状态检测模块,用于通过缓存状态器检测环形缓冲区是否处于空闲状态;消息存储模块,用于若所述环形缓冲区处于空闲状态,则通过缓存控制器锁定所述环形缓冲区,将所述线程间消息存储在所述环形缓冲区中;消息发送模块,用于将所述环形缓冲区中的所述线程间消息发送到监控设备,以使所述监控设备对所述线程间消息进行监控。一种线程间消息监控装置,所述装置包括:消息接收模块,用于接收嵌入式设备发送的线程间消息,所述线程间消息是所述嵌入式设备采用线程间消息监控方法获取到的;消息输出模块,用于将所述线程间消息输出到显示界面;消息解析模块,用于检测所述线程间消息是否存在异常,若是,则解析所述线程间消息,生成线程间消息文本信息;文本信息显示模块,用于在显示界面输出所述线程间消息文本信息,并输出对所述线程间消息存在异常的提示信息。一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:获取线程间消息;通过缓存状态器检测环形缓冲区是否处于空闲状态;若所述环形缓冲区处于空闲状态,则通过缓存控制器锁定所述环形缓冲区,将所述线程间消息存储在所述环形缓冲区中;将所述环形缓冲区中的所述线程间消息发送到监控设备,以使所述监控设备对所述线程间消息进行监控。一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:获取线程间消息;通过缓存状态器检测环形缓冲区是否处于空闲状态;若所述环形缓冲区处于空闲状态,则通过缓存控制器锁定所述环形缓冲区,将所述线程间消息存储在所述环形缓冲区中;将所述环形缓冲区中的所述线程间消息发送到监控设备,以使所述监控设备对所述线程间消息进行监控。上述线程间消息监控方法、装置、计算机设备和存储介质,通过获取线程间消息,通过缓存状态器判定环形缓冲区处于空闲状态时,通过缓存控制器将线程间消息存储在环形缓冲区中,将环形缓冲区中的线程间消息发送到监控设备,以使监控设备对线程间消息进行监控。通过环形缓冲区存储线程间消息,避免了系统繁忙时由于通讯异常导致线程间消息传递延迟或者阻塞,通过将环形缓冲区中的线程间消息发送到监控设备,使得用户能实时地了解嵌入式系统内部程序的运行情况,从而便捷和高效的确定嵌入式设备的故障原因。附图说明图1为一个实施例中线程间消息监控方法的应用环境图;图2为一个实施例中计算机设备的内部结构框图;图3为一个实施例中线程间消息监控方法的流程图;图4为另一个实施例中线程间消息监控方法的流程图;图5为一个实施例中存储溢出的线程间消息的记录信息的流程图;图6为一个实施例中将线程记录信息发送到监控设备的流程图;图7为又一个实施例中线程间消息监控方法的流程图;图8为一个实施例中线程间消息监控方法的原理图;图9为一个实施例中环形缓冲区的原理图;图10为一个实施例中写入数据的原理图;图11为一个实施例中通讯协议的原理图;图12为一个实施例中输出线程间消息的界面示意图;图13为一个实施例中解析线程间消息的界面示意图;图14为一个实施例中线程间消息监控装置的结构框图;图15为另一个实施例中线程间消息监控装置的结构框图;图16为又一个实施例中线程间消息监控装置的结构框图。具体实施方式为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。如图1所示,在一个实施例中,线程间消息监控方法应用于一种线程间消息监控系统,该系统包括嵌入式设备110和监控设备120,嵌入式设备110和监控设备120通过网络或硬件接口相连接,嵌入式设备110可为通讯设备、家用电器、车载设备、仪表设备、工控设备、移动存储设备、对讲机等,但并不局限于此。监控设备120可为平板电脑、笔记本电脑或者台式计算机等,但并不局限于此。具体的,嵌入式设备110获取线程间消息,通过缓存状态器检测环形缓冲区是否处于空闲状态,若环形缓冲区处于空闲状态,则通过缓存控制器锁定环形缓冲区,将线程间消息存储在环形缓冲区中,将环形缓冲区中的线程间消息发送到监控设备120。监控设备120接收嵌入式设备110发送的线程间消息,将线程间消息输出到显示界面,检测线程间消息是否存在异常,若是,则解析线程间消息,生成线程间消息文本信息,在显示界面输出线程间消息文本信息,并输出对线程间消息存在异常的提示信息。具体的,线程间消息监控系统可用于输出嵌入式设备产生的线程间消息、输出设备调试信息、输出错误日志、输出自定义信息、记录当前固件版本、记录当前线程列表、记录产品序列号、记录线程创建时间等。如图2所示,在一个实施例中,提供了一种计算机设备的内部结构框图。该计算机设备可以是如图1所示的嵌入式设备110或监控设备120,包括系统总线连接的处理器、非易失性存储介质、内存储器、flash存贮器、uart接口、usb接口和网络接口。其中计算机设备的非易失性存储介质存储有操作系统,还存储有实现一种线程间消息监控方法的计算机程序,该计算机程序被处理器执行时,可使得处理器执行线程间消息监控方法。处理器用于提供计算和控制能力,支撑装置运行。该内存储器中可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器执行线程间消息监控方法。uart接口、usb接口和网络接口用于与其它设备进行网络通信,如将环形缓冲区中的线程间消息发送到监控设备等。图2中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。如图3所示,在一个实施例中,提供了一种线程间消息监控方法,该方法以应用于如图1所示的嵌入式设备中进行举例说明,包括:步骤302,获取线程间消息。线程是程序执行流的最小单元,也可被称为轻量级进程(lightweightprocess,lwp),是进程中的一个实体,是被系统独立调度和分派的基本单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。步骤304,通过缓存状态器检测环形缓冲区是否处于空闲状态。缓存状态器是一组数据结构,可用于指示环形缓冲区的当前状态,包括:当前写入位置、当前读取位置、空闲或忙碌状态(读写状态)、消息序列号和是否溢出消息的状态等。其中,当前写入位置可为指示写入地址偏移量的参数;当前读取位置可为指示读取地址偏移量的参数;空闲或忙碌状态可为指示环形缓冲区是否正在读取或写入;消息序列号可用于指示当前写入消息的序号,从而识别消息是否重复或者遗漏,例如:从0开始计数,每写入一条线程间消息后加1,直到0xffffffff,再返回0重新计数;溢出状态可为指示环形缓冲区是否溢出消息,以及溢出了多少条消息。检测环形缓冲区是否正在读取或写入状态,若否,则认为环形缓冲区处于空闲状态,可将消息写入环形缓冲区或读取环形缓冲区的消息。进一步的,检测环形缓冲区是否处于被锁定状态,若否,则认为环形缓冲区处于空闲状态,可将消息写入环形缓冲区或读取环形缓冲区的消息。步骤306,若环形缓冲区处于空闲状态,则通过缓存控制器锁定环形缓冲区,将线程间消息存储在环形缓冲区中。缓存控制器是一组数据结构,可用于设置环形缓冲区或对环形缓冲区进行控制,包括:控制开关、过滤器、缓存深度设置器、输出端口切换器、线程列表、并发控制器等,其中,控制开关可为控制环形缓冲区能否写入的开关,通过控制开关可开启或关闭向环形缓冲区的写入;过滤器可用于过滤指定的消息,从而选择写入环形缓冲区的消息;缓存深度设置器可用于设置环形缓冲区的大小;输出端口切换器可用于控制环形缓冲区输出端口的切换,例如将环形缓冲区输出端口在通用串行总线(universalserialbus,usb)或通用异步收发传输器(universalasynchronousreceivertransmitter,uart)之间切换;线程列表可为将所有线程映射到当前列表中的数据关系列表,列表可包含线程名称、线程编号、线程优先级、线程堆栈大小、线程标识等;并发控制器可控制环形缓冲区的并发写入或读取的处理,并发控制器具有锁定和解除锁定的功能,通过并发控制器可锁定环形缓冲区,拒绝其他线程的锁定请求,从而进行数据的写入,在数据写入完成后,通过并发控制器解除对环形缓冲区的锁定。缓冲控制器可具有如下的数据结构:其中,fifo(firstinputfirstoutput,先入先出队列)可为环形缓冲区。步骤308,将环形缓冲区中的线程间消息发送到监控设备,以使监控设备对线程间消息进行监控。将环形缓冲区中的线程间消息通过通信接口发送到监控设备,以使监控设备可对线程间消息进行监控,同时避免环形缓冲区中的数据溢出,造成数据丢失。进一步的,将环形缓冲区中的线程列表发送到监控设备,以使监控设备实时监控正在运行的线程;可通过监控设备对缓存控制器的过滤器进行设置,从而过滤指定的消息,选择写入环形缓冲区的消息;可通过监控设备对缓存控制器的控制开关进行设置,通过控制环形缓冲区能否写入的开关,开启或关闭向环形缓冲区的写入。上述线程间消息监控方法,通过获取线程间消息,通过缓存状态器判定环形缓冲区处于空闲状态时,通过缓存控制器将线程间消息存储在环形缓冲区中,将环形缓冲区中的线程间消息发送到监控设备,以使监控设备对线程间消息进行监控。通过环形缓冲区存储线程间消息,避免了系统繁忙时由于通讯异常导致线程间消息传递延迟或者阻塞,通过将环形缓冲区中的线程间消息发送到监控设备,使得用户能实时地了解嵌入式系统内部程序的运行情况,从而便捷和高效的确定嵌入式设备的故障原因。如图4所示,在一个实施例中,提供了一种线程间消息监控方法,该方法以应用于如图1所示的嵌入式设备中进行举例说明,包括:步骤402,获取线程间消息。嵌入式设备在运行过程中,线程之间可进行线程间消息的传递,通过解析线程间消息,可了解各线程的工作情况。线程间消息包括用于记录消息的时序关系的时间戳、发送线程间消息的线程id、接收线程间消息的id、系统版本、线程间消息类型、消息长度、消息在环形缓冲区中的序号、消息发送时的系统时间、消息内容、线程的名称、线程的堆栈大小、线程的活动状态、线程的优先级、是否发生消息溢出和溢出消息的个数等。如图8所示,线程a通过allocatebuffer()函数分配内存,通过sendmsg(threadb,msga)函数发送消息a,线程b通过rcvmsg()函数接收消息a,通过deallocatebuffer()函数释放内存,在环形缓冲区空闲时,可将消息a存储在环形缓冲区中,并可通过usb、uart或网络接口将消息a发送到监控设备。进一步的,嵌入式设备包含flash存贮器,嵌入式设备在运行过程中会对自身的运行情况进行检测,若是发生错误会生成对应的错误日志,将该错误日志存储在flash存贮器中,可通过外接设备输出该错误日志,从而根据错误日志对嵌入式设备的问题进行修复。步骤404,通过缓存状态器检测环形缓冲区是否处于空闲状态。在存储器中申请一定大小的连续空间生成环形缓冲区,根据用户的设置可改变环形缓冲区的大小,环形缓冲区用于存储线程间消息和其它信息,其它信息包括溢出的线程间消息的记录信息、发生溢出的次数和表示线程间消息是否发生溢出的信息等。根据用户的指令可对环形缓冲区进行初始化处理,清空环形缓冲区中存储的信息,从而重新写入线程间消息。检测环形缓冲区是否正在读取或写入状态,若是,则等待环形缓冲区的处理,按照线程间消息的顺序暂时挂起,等环形缓冲区处于空闲状态再执行后续操作;若否,则认为环形缓冲区处于空闲状态,可将消息写入环形缓冲区或读取环形缓冲区的消息。进一步的,检测环形缓冲区是否处于被锁定状态,若是,则等待环形缓冲区的处理,按照线程间消息的顺序暂时挂起,等待环形缓冲区解除锁定再执行后续操作;若否,则认为环形缓冲区处于空闲状态,可通过缓存控制器锁定环形缓冲区。步骤406,若环形缓冲区处于空闲状态,则通过缓存控制器锁定环形缓冲区。通过缓存控制器锁定环形缓冲区,具体的,锁定环形缓冲区,是为了实现多线程消息并发写入,保护环形缓冲区的写入状态,在将线程间消息写入环形缓冲区时,顺序在后的线程间消息会暂时挂起,等顺序在前的线程间消息写入完成,并且解除锁定,才开始写入。为了提高将数据存储在环形缓冲区的效率,应当尽可能减少锁定时间,防止对系统产生影响,例如,可采用如下代码实现对环形缓冲区的锁定和解除锁定:本段代码实现了对变量的定义,并对变量进行了赋值。本段代码实现了对环形缓冲区的锁定、写入数据和解除锁定,还实现了将溢出消息放到溢出队列中的处理。对环形缓冲区的解除锁定的步骤包括:将写入指针取出(in_pos=fifo->in;),将指针更新(fifo->in+=len+head_size;),从而完成对环形缓冲区的解锁。这种设计使得在环形缓冲区写入数据时,会从最新的位置写入数据。进一步的,若在环形缓冲区处于锁定状态下发生并发写入,则后一个需要写入的线程会暂时挂起,应尽可能的使挂起时间最短。此外,在环形缓冲区空间不够时可将消息放到溢出队列中或丢弃,并将被丢弃消息的记录信息存储在环形缓冲区中。步骤408,获取用户输入的线程间消息的类型信息。用户输入的线程间消息的类型信息可为具体的类型信息,使得嵌入式设备向环形缓冲区写入或不写入这个类型的线程间消息;用户输入的线程间消息的类型信息可为具体某个线程的标识信息,使得嵌入式设备向环形缓冲区写入或不写入这个线程发出的和接收到的线程间消息。步骤410,通过缓存控制器根据线程间消息的类型信息过滤线程间消息。具体的,用户可通过监控设备向嵌入式设备输入线程间消息的类型信息,例如线程编号,嵌入式设备中的线程每次向环形缓冲区写入数据时,可先检测该线程的编号是否记录在过滤器中,若是,则不执行写入。过滤器可采用双向过滤的工作方式,既可对线程间消息的发送方线程进行过滤,也可对线程间消息的接收方线程进行过滤,发送发线程或接收方线程的编号若记录在过滤器中,则不执行线程间消息的写入。通过缓存控制器中的过滤器根据线程间消息的类型信息过滤线程间消息。举例说明:可对过滤器进行设置,对发送线程间消息的线程和接收线程间消息的线程分别使用8个32bit(位)的整形数据(integer),通过256bit的整形数据设置过滤线程间消息或写入线程间消息,每bit对应一个线程,如表一所示,irq、platf、dcc、timer、downl、ps_cdps和ps_msg为线程的名称,在过滤器中对线程对应的bit进行设置,当线程在过滤器中对应的设置为1时,表面该线程对应的线程间消息被禁止,过滤该线程间消息,当线程在过滤器中对应的设置为0时,表面该线程对应的线程间消息被被使能,写入线程间消息。表一中的irq和timer的线程间消息会被过滤器过滤,其它线程间消息会写入到环形缓冲区中。过滤器可采用正面清单策略,即只有当线程发送和接收的设置都为禁止时,才会过滤该线程对应的线程间消息,线程发送或接收的任一方设置为使能时,写入线程间消息。通过监控设备可更改过滤器的设置信息,如需要过滤dcc线程对应的线程间消息,可将dcc发送(源)和发送(目的)过滤器中对应位置设置为1,便可过滤dcc线程发送和接收到的线程间消息。其中,bit指的是数据存储的最小单位,整形数据是不包含小数部分的数值型数据。表一:步骤412,将线程间消息按照从环形缓冲区顶部到底部的顺序写入环形缓冲区,当写入到环形缓冲区底部时,返回环形缓冲区顶部写入。将经过过滤后的线程间消息存储在环形缓冲区中,采用循环写入的方式将线程间消息缓存到环形缓冲区中,即从环形缓冲区的顶部开始写入,待指针移动到底部后,回到顶部循环写入。采用循环写入的方式在回到顶部写入时会覆盖最初写入的线程间消息。如表二所示,将线程间消息存储在环形缓冲区中,具体的,线程间消息存储在缓存中分为消息头部分和消息体部分,消息头部分包括魔数或签名、系统版本号、优先级、溢出字段、发送消息的进程id、接收消息的进程id、消息长度、消息序号、发送时的系统时间。表二:具体的,消息头部分(偏移地址0x0~0x13)可为固定大小和顺序的,从0x14到消息尾部记载线程间消息的实际内容,消息长度是线程间消息实际内容的长度,不包含消息头部分的长度。优先级字段(priority)包含8个bit,从低位到高位可为:bit0~2可为优先级别(0代表普通优先级,1代表高优先级);bit3~6可为消息类型(0为最常用的类型,即在线程之间传递的消息,1为调试信息(debug),类似于格式化输出(printf),2为error,即错误输出,类似于格式化输出,不同的是输出的是错误信息;bit7可为有效荷载payload(0代表本消息是一个不含附加消息的普通消息,1代表本消息后面会跟随着一条附加消息,即payload)。进一步的,由于消息体的长度是不固定的,每条线程间消息的长度也是不一定的,将线程间消息按照时间顺序首尾相接的写入环形缓冲区中,如图9所示,将线程间消息按照从环形缓冲区顶部到底部的顺序写入环形缓冲区,由于线程间消息的长度是不一定的,可依照“消息1到消息4”的存储位置写入环形缓冲区中。当从环形缓冲区输出线程间消息时,最先输出的是最早写入的线程间消息,当环形缓冲区没有剩余空间时,返回环形缓冲区顶部写入,覆盖最早写入的线程间消息。在环形缓冲区中写入线程间消息时,若输入位置和输出位置相同,则表示环形缓冲区为空,如果输入位置减去输出位置等于环形缓冲区的大小,则认为环形缓冲区已经存满了数据。如图10所示,白色区域为环形缓冲区的空闲区域,黑色区域为已存储信息的区域,buffer为缓存位置,out为输出位置,in为输入位置,size为缓存大小位置。缓存控制器在写入信息时,从“输入位置”到“缓存大小位置”写入,写到“缓存大小位置”时循环写入;在输出信息时,从“输出位置”到“输入位置”输出。在图10-1中,空闲区域位于环形缓冲区的两端,空闲区域大小为fifo->size-fifo->in+fifo->out,即“输入位置”到“缓存大小位置”与“缓存位置”到“输出位置”的和。此时采用如下代码写入数据:/*firstputthedatastartingfromfifo->intobufferend*/(首先将数据从fifo中导入环形缓冲区)l=min(len,fifo->size-(fifo->in&(fifo->size-1)));/*thenputtherest(ifany)atthebeginningofthebuffer*/(将剩下的数据在环形缓冲区的头部开始)memcpy(fifo->buffer+(fifo->in&(fifo->size-1)),buffer,l);memcpy(fifo->buffer,buffer+l,len-l);fifo->in+=len;“size”可为2的指数,(fifo->size-1)的二进制数的每一位都为1,它与fifo->in相与的结果等同于fifo->in对“size”求余数。因此随着fifo->in的增长,(fifo->in&(fifo->size-1))的值将以size为周期变化。在读取消息时,若需要读取的消息存储在环形缓冲区的两端,则分两次读取,读取消息的代码如下:/*firstgetthedatafromfifo->outuntiltheendofthebuffer*/(先获取从fifo到环形缓冲区底部的数据)l=min(len,fifo->size-(fifo->out&(fifo->size-1)));slis_send2pc(fifo->buffer+(fifo->out&(fifo->size-1)),l);fifo->out+=len;在图10-2中,空闲区域大小为fifo->out,即“缓存位置”到“输出位置”的空间。在图10-3中,空闲区域大小为fifo->size-fifo->in,即“缓存位置”到“缓存大小位置”减去“缓存位置”到“输入位置”。步骤414,将环形缓冲区中的线程间消息发送到监控设备。可将环形缓冲区中的线程间消息通过通用串行总线或通用异步收发传输器发送到监控设备,也可通过网络将环形缓冲区中的线程间消息发送到监控设备。具体的,可选用如图11所示的通讯协议,该通讯协议主要包括上层的控制命令集hlc2s(highlayercontrol&commandsets)和下层的通信协议llcp(lowerlayercommunicationsprotocol,逻辑链路控制协议)。hlc2s为用户提供一套操作命令集,使得通讯双方可通过hlc2s以命令的方式进行交互,llcp可实现通信握手、接收应答、数据校验、广播、身份识别等功能,实现通信协议的底层协议部分。根据该通讯协议可实现与编程程序(programming)、无线电设备(tuner)、自动检测程序(autotest)的通讯。根据该通讯协议可通过usb接口、urat接口或tcp/ip(transmissioncontrolprotocol/internetprotocol,传输控制协议/因特网互联协议)等接口与其它设备进行通讯,如将线程间消息发送到监控设备。hlc2s对所有命令进行编码,对消息进行字段划分,消息格式如表三所示:表三:msghdropcodelengthpayloadchecksummsgend1byte2byte2bytenbyte2byte1byte其中,msghdr为消息的标识,一般由预设位数的数字、字母和特殊符号中的至少一种组成,通过消息的标识可查找到对应的消息;opcode为消息的操作码,length为消息的长度;payload为消息的有效荷载,记载消息体的内容;checksum可为消息的校验,例如采用加和的方式,对发送的消息和接收到的消息进行加和,验证两次加和的结果是否一致,从而判断是否存在数据丢失,若加和的结果一致,则认为没有数据丢失;msgend为消息的结束字段,通过msgend也可快速查询到对应的消息;byte(比特)是用于计量存储容量的一种计量单位,通过字段划分规定每个字段的大小。在通信时,将hlc2s数据包传给llcp,llcp添加一些传输信息,再由下层发送出去,llcp数据包包括头部和有效荷载,数据包头部包括数据包长度和checksum。llcp数据包格式如表四所示:表四:其中,head为数据包头部;version为系统版本;block为块,包含块本身的头信息数据或代码;opcode为操作码;sid为来源标识,可为发送消息的线程的id;did为目标标识,可为接收消息的线程id;pn为数据包编号;length为数据长度;checksum可用于进行数据完整性的校验。如图5所示,在一个实施例中,线程间消息监控方法还包括存储溢出的线程间消息的记录信息的步骤:步骤502,若通过缓存状态器检测到线程间消息在存储过程中发生溢出,则根据溢出的线程间消息生成溢出的线程间消息的记录信息。缓存状态器是一组数据结构,可用于指示环形缓冲区是否处于溢出状态,指示环形缓冲区是否溢出消息,以及溢出了多少条消息。当线程间消息的写入速度大于读取速度时,若环形缓冲区的存储空间不足,则会发生消息溢出,为了确定有哪些线程间消息溢出,可为溢出的线程间消息生成溢出的线程间消息的记录信息,该记录信息可为如下结构:typedefstructmissed_msg_t{unsignedintsystemtick;/*starttimeofthismissedmsg*/(此溢出消息的开始时间)taskidsourceid;/*sourceidofthesendingthread*/(发送线程的来源id)taskiddestid;/*destinationidoftherecievingthread*/(接收线程的目标id)unsignedintlen;/*lenthofthismsg*/(溢出消息的长度)}missed_msg_t;通过溢出的线程间消息的记录信息,记录溢出的线程间消息的开始时间、发送线程的来源id、接收线程的目标id和溢出消息的长度等信息。步骤504,计算发生溢出的次数,将发生溢出的次数、表示线程间消息是否发生溢出的信息和溢出的线程间消息的记录信息存储在环形缓冲区中。为每条溢出的线程间消息在环形缓冲区写入对应的记录信息,可对保存的记录信息设置上限,当记录信息超过上限时,覆盖最早写入的记录信息。此外,可通过计数器记录线程间消息溢出的总次数,即使最早写入的记录信息被覆盖,计数器记录的线程间消息溢出的总次数不会受到影响。可设置计数器的最大值为0xffffffff。可采用如下结构:例如,线程间消息可为>>>iqr->ps_msgtick:49682size:12overflow:0#24044f000000050000000000,其中overflow:0为表示线程间消息是否发生溢出的信息,此处表示未发生线程间消息溢出,若为overflow:1则表示发生线程间消息溢出。获取计数器记录的发生溢出的次数,将发生溢出的次数、表示线程间消息是否发生溢出的信息和溢出的线程间消息的记录信息存储在环形缓冲区中。如图6所示,在一个实施例中,线程间消息监控方法还包括将线程记录信息发送到监控设备的步骤:步骤602,将线程间消息、发生溢出的次数和表示线程间消息是否发生溢出的信息进行封装,生成线程记录信息。每条线程间消息存在对应的发生溢出的次数和表示线程间消息是否发生溢出的信息,在将线程间消息写入环形缓冲区时,可将线程间消息、发生溢出的次数和表示线程间消息封装生成线程记录信息,将线程记录信息写入环形缓冲区。步骤604,当环形缓冲区处于空闲状态时,通过缓存控制器锁定环形缓冲区,将线程记录信息存储在环形缓冲区中。在环形缓冲区处于空闲状态时,若环形缓冲区有足够的存储空间,则通过缓存控制器的并发控制器锁定环形缓冲区,将线程记录信息写入环形缓冲区。步骤606,将环形缓冲区中的线程记录信息发送到监控设备,以使监控设备对线程记录信息进行监控。可将环形缓冲区中的线程记录信息通过通用串行总线或通用异步收发传输器发送到监控设备,也可通过网络将环形缓冲区中的线程记录信息发送到监控设备。如图7所示,在一个实施例中,提供了一种线程间消息监控方法,该方法以应用于如图1所示的监控设备中进行举例说明,包括:步骤702,接收嵌入式设备发送的线程间消息。可通过通用串行总线或通用异步收发传输器接收嵌入式设备发送的线程间消息,也可通过网络传输接收嵌入式设备发送的线程间消息。步骤704,将线程间消息输出到显示界面。如图12所示,将线程间消息输出到显示界面,界面可包含监控设备存储线程间消息的本地路径,还可包含显示界面对应的程序名称。线程间消息可显示为:receivedopcode:0x80a2,length:0×70,time:561829937。其中receivedopcode:0x80a2表示该线程间消息的操作码为0x80a2,根据该操作码可使处理器执行对应的指令;length:0×70表示该线程间消息的长度,time:561829937表示该线程间消息的发出时间。此外,也可根据设置进一步的显示线程间消息的其它内容。步骤706,检测线程间消息是否存在异常,若是,则解析线程间消息,生成线程间消息文本信息。检测线程间消息是否存在异常可为监控设备自动进行的,也可根据用户的操作主动进行异常检测。解析线程间消息,生成线程间消息文本信息。例如,当嵌入式设备为对讲机时,该线程间消息文本信息可为>>>dcc->ps_msgtick:49683size:12overflow:0#*230400000c0018000c1cbdc0,其中“>>>”是一个引导符号,表明后面跟随的是一条消息;dcc->ps_msg表示该消息是从dcc线程发到ps_msg线程;tick:49683表示发送线程间消息时对讲机的运行时间(单位为10ms);size:12表示后面跟随的消息字节数是12个字节;overflow:0表示发送消息时没有发生过消息溢出;“#”表示后面跟随的是消息内容,后面的内容以16进制数表示,每个字节以空格隔开;“*”表示下一条线程间消息是一个payload消息。步骤708,在显示界面输出线程间消息文本信息,并输出对线程间消息存在异常的提示信息。如图13所示,可在显示界面“inputfilename:”的位置输入线程间消息的路径,显示线程间消息文本信息,其中“openfilesuccess”表示成功打开消息;“decode解码”之后的内容为线程间消息文本信息,包括线程间消息存储位置为0x8006,消息数量为909条,没有发生线程间消息溢出,没有异常消息,不存在解码失败的线程间消息。若存在异常的线程间消息,则显示“warningx”,x为异常消息的数量,可显示该条异常消息的具体内容,并输出对线程间消息存在异常的提示信息。图12为输出线程间消息的界面示意图,图13为解析线程间消息的界面示意图,本申请对应产品的实际界面图可包括图12和图13中的部分或全部内容,还可包括其它界面元素,如功能按钮等,图12和图13的界面示意图不构成对本申请实际界面图的限定。在一个实施例中,可通过设置输出调试信息、打印信息和定制信息等,需要调用消息记录函数:uint32_tputfifo(void*p_msg,taskidsourceid,taskiddestid,uint32_tlen,uint16_tpri,uint8_ttype)。可采用如下方式输出调试信息或打印信息:charc[10];//初始化为想要输出的数据或字符//第一个参数为指针,第二个参数可使用当前线程id//第三个参数可设置为0,第四个参数可设置为要输出的长度(以字节计算)//第五个参数为消息的优先级,分为0和1两个级别,可根据需要进行设置//最后一个参数为1代表输出调试信息putfifo(c,-getselftaskid(),0,10,0,1);//第五个参数为2则代表输出错误日志putfifo(c,getselftaskid(),0,10,0,1)。如图14所示,在一个实施例中,提供了一种线程间消息监控装置,该装置包括:消息获取模块1402,用于获取线程间消息。状态检测模块1404,用于通过缓存状态器检测环形缓冲区是否处于空闲状态。消息存储模块1406,用于若环形缓冲区处于空闲状态,则通过缓存控制器锁定环形缓冲区,将线程间消息存储在环形缓冲区中。消息发送模块1408,用于将环形缓冲区中的线程间消息发送到监控设备,以使监控设备对线程间消息进行监控。如图15所示,在一个实施例中,提供了一种线程间消息监控装置,该装置包括:记录信息生成模块1410,用于若通过缓存状态器检测到线程间消息在存储过程中发生溢出,则根据溢出的线程间消息生成溢出的线程间消息的记录信息。消息存储模块1406还用于计算发生溢出的次数,将发生溢出的次数、表示线程间消息是否发生溢出的信息和溢出的线程间消息的记录信息存储在环形缓冲区中。封装模块1412,用于将线程间消息、发生溢出的次数和表示线程间消息是否发生溢出的信息进行封装,生成线程记录信息。状态检测模块1404还用于当环形缓冲区处于空闲状态时,通过缓存控制器锁定环形缓冲区,将线程记录信息存储在环形缓冲区中。消息发送模块1408还用于将环形缓冲区中的线程记录信息发送到监控设备,以使监控设备对线程记录信息进行监控。消息存储模块1406还用于若环形缓冲区处于空闲状态,则通过缓存控制器锁定环形缓冲区;将线程间消息按照从环形缓冲区顶部到底部的顺序写入环形缓冲区,当写入到环形缓冲区底部时,返回环形缓冲区顶部写入消息类型信息获取模块1414,用于获取用户输入的线程间消息的类型信息。过滤模块1416,用于通过缓存控制器根据线程间消息的类型信息过滤线程间消息。如图16所示,在一个实施例中,提供了一种线程间消息监控装置,该装置包括:消息接收模块1602,用于接收嵌入式设备发送的线程间消息,线程间消息是嵌入式设备采用如权利要求1至5中任意一项的线程间消息监控方法获取到的。消息输出模块1604,用于将线程间消息输出到显示界面。消息解析模块1606,用于检测线程间消息是否存在异常,若是,则解析线程间消息,生成线程间消息文本信息。文本信息显示模块1608,用于在显示界面输出线程间消息文本信息,并输出对线程间消息存在异常的提示信息。在一个实施例中,提供了一种计算机设备,计算机设备包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:获取线程间消息;通过缓存状态器检测环形缓冲区是否处于空闲状态;若环形缓冲区处于空闲状态,则通过缓存控制器锁定环形缓冲区,将线程间消息存储在环形缓冲区中;将环形缓冲区中的线程间消息发送到监控设备,以使监控设备对线程间消息进行监控。在一个实施例中,处理器执行计算机程序时还可实现以下步骤:若通过缓存状态器检测到线程间消息在存储过程中发生溢出,则根据溢出的线程间消息生成溢出的线程间消息的记录信息;计算发生溢出的次数,将发生溢出的次数、表示线程间消息是否发生溢出的信息和溢出的线程间消息的记录信息存储在环形缓冲区中。在一个实施例中,处理器执行计算机程序时还可实现以下步骤:将线程间消息、发生溢出的次数和表示线程间消息是否发生溢出的信息进行封装,生成线程记录信息;当环形缓冲区处于空闲状态时,通过缓存控制器锁定环形缓冲区,将线程记录信息存储在环形缓冲区中;将环形缓冲区中的线程记录信息发送到监控设备,以使监控设备对线程记录信息进行监控。在一个实施例中,处理器执行计算机程序时还可实现以下步骤:若环形缓冲区处于空闲状态,则通过缓存控制器锁定环形缓冲区;将线程间消息按照从环形缓冲区顶部到底部的顺序写入环形缓冲区,当写入到环形缓冲区底部时,返回环形缓冲区顶部写入。在一个实施例中,处理器执行计算机程序时还可实现以下步骤:获取用户输入的线程间消息的类型信息;通过缓存控制器根据线程间消息的类型信息过滤线程间消息。在一个实施例中,处理器执行计算机程序时还可实现以下步骤:接收嵌入式设备发送的线程间消息;将线程间消息输出到显示界面;检测线程间消息是否存在异常,若是,则解析线程间消息,生成线程间消息文本信息;在显示界面输出线程间消息文本信息,并输出对线程间消息存在异常的提示信息。在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:获取线程间消息;通过缓存状态器检测环形缓冲区是否处于空闲状态;若环形缓冲区处于空闲状态,则通过缓存控制器锁定环形缓冲区,将线程间消息存储在环形缓冲区中;将环形缓冲区中的线程间消息发送到监控设备,以使监控设备对线程间消息进行监控。在一个实施例中,计算机程序被处理器执行时还可实现以下步骤:若通过缓存状态器检测到线程间消息在存储过程中发生溢出,则根据溢出的线程间消息生成溢出的线程间消息的记录信息;计算发生溢出的次数,将发生溢出的次数、表示线程间消息是否发生溢出的信息和溢出的线程间消息的记录信息存储在环形缓冲区中。在一个实施例中,计算机程序被处理器执行时还可实现以下步骤:将线程间消息、发生溢出的次数和表示线程间消息是否发生溢出的信息进行封装,生成线程记录信息;当环形缓冲区处于空闲状态时,通过缓存控制器锁定环形缓冲区,将线程记录信息存储在环形缓冲区中;将环形缓冲区中的线程记录信息发送到监控设备,以使监控设备对线程记录信息进行监控。在一个实施例中,计算机程序被处理器执行时还可实现以下步骤:若环形缓冲区处于空闲状态,则通过缓存控制器锁定环形缓冲区;将线程间消息按照从环形缓冲区顶部到底部的顺序写入环形缓冲区,当写入到环形缓冲区底部时,返回环形缓冲区顶部写入。在一个实施例中,计算机程序被处理器执行时还可实现以下步骤:获取用户输入的线程间消息的类型信息;通过缓存控制器根据线程间消息的类型信息过滤线程间消息。在一个实施例中,计算机程序被处理器执行时还可实现以下步骤:接收嵌入式设备发送的线程间消息;将线程间消息输出到显示界面;检测线程间消息是否存在异常,若是,则解析线程间消息,生成线程间消息文本信息;在显示界面输出线程间消息文本信息,并输出对线程间消息存在异常的提示信息。本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)或随机存储记忆体(randomaccessmemory,ram)等。以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1