本发明涉及总线技术,特别涉及总线模块中的消息收发技术。
背景技术:
航空电子领域中的总线网络gjb289a(mil-std-1553b)总线已在航空电子领域被广泛应用多年,但是,在机载航电网络以及航电综合实验室中,现有的gjb289a总线模块中消息收发没有优先级区分,影响了消息的收发效果。
技术实现要素:
本发明所要解决的技术问题是,提供一种能支持gjb289a总线模块中区分消息优先级进行接收与发送的方法。
本发明为解决上述技术问题所采用的技术方案是,支持优先级的gjb289a总线模块中的消息收发方法:
1)发送步骤:总线接口模块mbi将待发送消息对应放入三种类型的发送缓存中进行存储,三种类型的发送缓存为:紧急消息缓存,异步消息缓存和普通消息缓存;
紧急消息缓存存放紧急消息,优先级最高,当紧急消息缓存非空时,总线接口模块优先发送紧急消息缓存中的消息内容到gjb289a总线;
异步消息缓存存放异步消息,优先级高于普通消息低于紧急消息,总线接口模块根据异步消息本身的固定的异步周期发送异步消息到gjb289a总线;
普通消息缓存存放普通消息,普通消息为一般优先级的总线消息,采用双数据缓存形式,优先选择空闲缓存存放消息,当紧急消息缓存和异步消息缓存均没有消息需要进行发送时,总线接口模块采取乒乓切换方式将双缓存中的数据发送到gjb289a总线;
2)接收步骤:总线接口模块的接收管理采用二级缓存形式;第一级缓存按接收时序存放消息,第二级缓存仅存放消息指针,根据消息的优先级分为紧急消息指针队列和非紧急消息指针队列组;非紧急消息指针队列组包含有2个以上的非紧急消息指针队列,非紧急消息指针队列按照不同msgid进行区分;紧急消息的指针按照接收时序保存在紧急消息指针队列中,非紧急消息的指针按照其msgid存入相应的非紧急消息指针队列中;紧急消息采用中断接收方式,非紧急消息采用查询接收方式;所述非紧急消息包括异步消息与普通消息。
本发明提出一套gjb289a总线模块中的消息收发方法,当总线接口模块充当bc时,总线接口模块独立为高优先级消息开辟缓存,保证高优先级消息优先发送。接收采用二级缓存形式,一级缓存采用接收大队列形式,保证了消息接收的时序。二级缓存采用指针的方式,既保证了消息按照不同优先级进行了分类,又保证了消息缓存不占用过多的内存空间;同时不同优先级消息采取不同的接收方式,高优先级的紧急消息采用中断接收方式,普通优先级的周期消息采用查询机制接收。当用户需要按接收消息时序提取消息时,可以选择从一级缓存提取消息。当用户需要按照消息优先级提取消息时,可以选择从二级缓存提取消息。这样根据用户的不同需求进行有区别的消息提取,既可以保证消息的接收时序,又能满足用户优先提取高优先级消息的需求。
本发明的有益效果是,保证高优先级消息优先发送与接收。
附图说明
图1为发送消息队列示意图;
图2为接收消息队列示意图;
图3为作为bc的mbi发送数据的处理示意图;
图4为作为rt的mbi的接收与发送示意图;
图5为作为bm的mbi的接收示意图;
图6为作为bc的mbi的控制流程图;
图7为作为rt的mbi的控制流程图;
图8为作为bm的mbi的控制流程图。
具体实施方式
为了方便描述对文中出现的英文简写进行说明:
msgid:消息标识;
icd:接口控制文件;
mbi:总线接口模块;
rt:远程终端;
bc:总线控制器;
bm:总线监视器。
一种支持优先级的gjb289a总线模块由消息发送和消息接收两部分组成。
1根据消息优先级不同区分发送缓存管理
如图1所示,当mbi作为bc时,mbi根据消息发送优先级不同,分别申请三种类型缓存,紧急消息缓存,异步消息缓存,普通消息缓存。
紧急消息缓存存放紧急消息,应用软件发送紧急消息时,消息存放入紧急消息缓存,紧急消息优先级最高,当紧急消息缓存非空时,优先发送紧急消息缓存中的消息内容;异步消息缓存存放异步消息,每一条异步消息根据消息本身的固定的异步周期发送异步消息;普通消息缓存存放普通消息,普通消息为一般优先级的总线消息,采用双数据缓存方式。
三种消息缓存设置在mbi的fpga固件程序中,fpga固件程序根据高速时钟周期轮询三种缓存的空满状态,紧急消息优先级最高,当紧急消息缓存非空时,第一时刻把紧急消息队列中的消息发送给收发器模块,收发器模块将消息发到gjb289a总线上。异步消息优先级其次,当同时存在异步消息和普通消息时,优先发送异步消息。普通消息缓存采用双缓存管理,当应用发送普通消息时,固件程序优先选择空闲缓存存放消息,当紧急消息缓存和异步消息缓存均没有消息需要进行发送时,普通消息双缓存采取乒乓切换方式将数据通过收发器发送到gjb289a总线上去。
2根据接收消息要求,接收分二级缓存进行接收队列管理。
如图2所示,接收队列采用二级缓存管理消息,用户可选择从第一级或者第二级缓存提取消息。当用户需要按接收消息时序提取消息时,可以选择从第一级缓存提取消息。当用户需要按照消息优先级提取消息时,可以选择从第二级缓存提取消息。第一级缓存完全保证按照消息接收时序进行存储,从第一级缓存直接提取消息,可以保证消息的接收时序。比如作为bm时,用户关心的是接收消息的时序,所以作为bm模式时,可以从第一级缓存直接提取消息。
第二级缓存根据消息的优先级不同分为紧急消息队列和非紧急消息队列组。两种队列中只存放真实数据所在的地址信息。不占用太多内存。
紧急消息队列不需要按照msgid分队列,所有紧急消息按照接收时序保存在紧急消息队列中,非紧急消息按照不同msgid分队列管理。非紧急消息包括异步消息与一般优先级的总线消息。
紧急消息的接收采用中断方式,保证收到紧急消息后应用软件能够第一时间接收紧急消息,对于非紧急消息,由应用软件主动查询并做相应的接收操作。
接收缓存的消息存放、提取模式如下:
第一级缓存每条消息的存放空间采用固定长度,每个消息缓存的空间可以看做是一个“单元”,每个“单元”设有一个标记量表示其处于“空”或者“满”状态。当mbi收到总线消息后,对一级“单元”缓存进行循环查找,当找到第一个处于“空”状态的“单元”缓存时,则将消息存放入该“单元”缓存,然后该“单元”缓存置为“满”状态,再根据该消息的优先级建立二级缓存队列,如果该消息为紧急消息,则将该消息的指针存入二级缓存的紧急消息指针队列中,同时,置一个中断信号,上层应用收到中断信号后,开始提取紧急消息。如果该消息为非紧急消息,则根据该消息的msgid将它的指针存入相应的非紧急消息msgid指针队列中。如此反复进行循环存放。
应用软件收到紧急消息提取中断信号后,直接从二级缓存的紧急消息指针队列中找到紧急消息指针,通过指针找到第一级缓存中紧急消息的实际存放位置,从第一级缓存中该条消息的“单元”缓存提取该条消息,然后将该“单元”缓存的状态置为“空”状态。如此反复进行紧急消息的提取。
应用软件周期性查询二级缓存非紧急消息的msgid指针队列,当发现某个msgid指针队列非空时,则调用相应的消息提取接口,从该msgid指针队列中找到消息的指针,通过指针找到第一级缓存中该条消息的实际存放位置,从一级缓存中该条消息的“单元”缓存提取该条消息,然后将该“单元”缓存状态置为“空”状态。如此反复进行非紧急消息的提取。
由于第二级缓存时按照优先级对接收消息的又一次排序,为了降低内存消耗,所以第二级缓存队列采用指针队列的形式,消息的实际存放空间仍在第一级缓存中。因此,第一级缓存中的消息变成了离散式的缓存,所以第一级缓存采用“单元”式的管理方式,实时更新“空”“满”状态对“单元”缓存循环利用。
按照gjb289a协议要求,命令字中除了“数据字计数”5位以外还剩11位描述一条消息,最多有2^11(2048)条消息,所以最多有2048个消息id。所以给常规消息建立2048个消息队列组。
对于紧急消息的接收可以采用中断方式,软件收到中断信号后开始进行消息提取操作,对于非紧急消息,对于非紧急消息,由应用软件主动查询并做相应的接收操作。。
作为bc的mbi发送消息正常工作需要有五个配置表配合使用,分别为:消息名与msgid映射表;msgid与命令字(cmd)映射表;子地址与矢量字位映射表;接口控制参数定义表;总线表。
消息名与msgid映射表:用于描述icd的消息名和msgid的对应关系。包含消息总个数n;紧急消息个数n;n条紧急消息的消息名描述和msgid描述;n-n条消息的消息名描述和msgid描述。
msgid与cmd映射表:用于描述msgid与消息命令字的对应关系。包含消息总个数n;紧急消息个数n;n条紧急消息的msgid描述和cmd描述;n-n条非紧急消息的msgid描述和cmd描述。
子地址与矢量字位映射表:用于描述每个终端对应的各位子地址对应的矢量字位数。包含终端个数n;n个终端的矢量字使用方式描述。
接口控制参数定义表:用于存放总线消息的配置信息。包括rt设备号;消息发送间隔;状态字响应时间间隔;状态字响应超时门限;dt(devicetimer)时钟基值;wdt1(watchdogtimer)的时钟加载值;wdt2的远程加载值;终端参数定义(包括有效终端号,终端属性);消息名与msgid映射表版本号;msgid与命令字映射表版本号;子地址与矢量字位映射表版本号;子地址与矢量字位映射表版本号;接口控制参数定义表版本号;
总线表:用于描述紧急消息表、周期消息表、异步消息表。包括紧急消息个数;紧急消息内容;周期消息个数;小周期值;小周期个数;周期消息内容;异步消息数目,异步消息内容;
1)bc的数据发送如图3所示,作为bc的mbi上电时,fpga固件程序从flashmem模块中读取配置文件,将消息名与msgid映射表上传给应用软件;将紧急消息表、异步消息表、非紧急消息表根据msgid与命令字映射表的映射关系存入消息缓存模块;读取子地址与矢量字对应关系映射表的内容存入消息刷新模块;
应用软件有消息刷新时,通过消息名与msgid匹配模块,由消息名与msgid映射表的对应关系找到消息名对应的msgid,软件根据msgid向msgid与命令字匹配模块下发消息。
msgid与命令字匹配模块收到msgid后,识别消息的优先级,并将消息送入消息缓存模块。消息缓存模块根据msgid与命令字映射表对应关系,找到msgid对应的命令字,如果是紧急消息或异步消息,则直接将消息发送给收发器模块,如果是非紧急消息,则将消息送入消息刷新模块判断消息的刷新状态。
消息刷新模块收到消息后首先判断消息类型,如果是bc到rt的消息,则检测消息刷新标记,如果消息刷新标记置一则将消息送给收发器模块,如果是rt到bc的消息,则检查矢量字标记,如果对应的矢量字位被置为1,则将该消息发送给收发器模块。
收发器模块收到消息后直接将消息送往gjb289a总线。
bc的接收流程与rt相同。
2)作为rt的mbi的接收及其发送处理如图4所示。上电初始化时,驱动程序从flashmem模块中提取msgid与命令字对应关系映射表文件,并保存到相应的数据结构中,矢量字更新模块读取子地址与矢量字对应关系映射表内容,同时时钟管理模块读取“接口参数定义”文件,进行初始化时钟等操作。
接收时,收发器模块按照总线消息接收时序,将所有消息保存至本地的接收队列中,同时置驱动中断开始接收数据。驱动程序按照接收时序将所有消息保存至接收队列一级缓存中,同时根据初始化时取的msgid与命令字对应关系映射表内容对消息进行分类,紧急消息和非紧急消息用不同的队列保存在接收二级缓存中。
接收队列二级缓存中的消息通过msgid与消息名匹配模块交给应用层进行数据提取。
rt作为发送端时,应用软件根据“消息名与msgid映射表”找到消息名对应的msgid之间的对应关系。通过msgid与消息名匹配模块将消息发送给msgid与命令字匹配模块,该模块根据msgid与命令字映射表按照命令字中对rt地址和子地址的约束将该条消息的数据字内容发送给数据字存储模块。此时矢量字更新模块根据数据字存储模块数据更新的信息,结合上电初始化时读取的子地址与矢量字对应关系文件内容,更新矢量字。
3)作为bm的mbi,仅需接收消息,如图5所示,上传消息为按照接收消息时序排列的第一级缓存的消息。bm消息在上传应用进行消息显示、处理的同时,进行写文件存储,以方便进行数据回放。
以下分别为作为bc、rt、bm的mbi的消息收发流程描述:
1)作为bc的mbi:
如图6所示,发送消息缓存控制器模块与pc接口相连,接收应用刷新的消息写入消息缓存,发送消息缓存控制器连接的是消息发送调度控制器模块,该模块控制器消息发送的调度。总线表控制器模块以及异步表控制器模块都与消息发送调度控制器相连,调度器模块在总线表控制器和异步表控制器的配合下读取消息发送缓存的消息送入消息收/发控制器,消息收发控制器在发送消息时将消息送入编解码器模块,生成消息编码数据发送的总线上,当编解码器从总线上接收到消息后,由消息发送/接收控制器送往接收消息缓存控制器,接收消息缓存控制器查找msgid与cmd映射表,将消息保存到接收消息大队列。应用读取消息时,接收消息缓存控制器从接收消息大队列读取消息送到pc端接口。
2)作为rt的mbi:
如图7所示,pc端应用通过接口将数据字刷新到数据字缓存管理模块,数据字缓存管理模块将刷新的消息暂存入数据字缓存中。与数据字缓存管理模块相连的消息收发处理控制器模块读取数据字时,数据字缓存管理模块将数据字缓存中的消息读出送到消息收发处理器,消息收发处理器将要发送消息送入编解码器,生成编码数据送到总线上。当编解码器接收到总线上的消息并送入消息收发控制器,根据接收处理规则将对应的消息送入rt接收缓存控制器,接收缓存控制器将消息依次放到消息接收缓存中。应用需要读取消息时,通过pc与设备接口从消息接收缓存提取消息数据。接收到的消息在消息收发控制器中经过消息内容提取后,送入wdt控制器模块控制设备的硬件看门狗,并向应用提供中断信号。
3)作为bm的mbi:
如图8所示,bm总线监视器模块主要是对总线信息进行监听的终端,编解码器从总线上解码消息后送入bm消息接收处理控制器,该控制器根据消息类型将消息和消息属性送入到消息接收缓存控制器,消息接收缓存控制器将消息暂存入消息接收缓存。应用通过pc接收提取消息是,消息接收缓存控制器读取消息接收缓存将数据送到设备与pc的接口,实现消息是提取。