本文介绍了一种使用CAV-1553B板卡实现硬件自动发送1553B总线非周期消息的方法。该方法通过使用条件Block来实现,当用户设置的条件(如状态字、数据字匹配或匹配的次数)满足时,CAV-1553B板卡上的固件将自动启动非周期消息的发送。使用该方法,无需软件介入,可实时实现非周期消息的发送,为用户实现发送矢量字的模式字提供了一种方便的方法。
1553B总线数据传输控制
1553B总线通常按固定的数据传输时间表工作,即周期性的安排数据传输。需要根据数据通信任务的最大和最小发送周期以及允许的传输延迟来确定时间表的安排。大多数在总线上传输的消息是按一定更新频率发送的周期性消息,周期消息中更新最慢的消息的周期被定为大周期(也被称为“主帧”),如下图所示。在一个大周期内,所有周期性的传输至少发生一次。典型的大周期是几百毫秒,一些重复频率极低的消息,如几秒钟一次的周期性自检测及其相关数据传输,则按非周期消息处理。
图1 大周期和小周期
消息中刷新频率最快的通信任务对应小周期(也被称为“子帧”),为了设计的方便,取大周期为小周期的整数倍,并且该整数位2的整数次幂。如果消息的最大允许传输延迟小于其更新的时间间隔,则以消息的最大允许传输延迟作为其安排时间表周期的依据。假设一个总线系统需要传输若干个周期消息,其中更新最慢的消息为400ms一次;更新最快的消息为每20ms一次,这种消息最大允许的传输延迟时间是15ms。那么,我们可以把大周期定为400ms,小周期定为12.5ms,即一个大周期被分为32个小周期。
一个小周期内包括小周期同步消息、周期消息和非周期消息。小周期同步消息一般是同步方式指令或具有同步功能的数据消息,用来表示小周期的开始。小周期同步消息不是必须的,实际上,在相当多的应用中都没有使用这种消息。周期消息具有特定的更新速率,可以通过在特定的小周期安排周期消息来实现消息的更新速率。非周期消息通常是由某些事件触发的,并且会引发其他条件事件。在每一个小周期中,非周期消息一般插在周期消息之后传输。
消息在小周期中的分布,要考虑消息的更新速率、允许的传输延迟时间和总线负载均衡等因素。在前面的例子中,如果某个消息的最大允许延迟时间是15ms,那么这个消息在每个小周期中都要安排传输一次,以保证一旦这个消息产生新数据,可以在最大允许延迟时间之内传到目的终端。假如某个消息的更新周期和最大允许延迟时间都是25ms,那么可以在每两个小周期中安排一次传输,也就是每间隔一个小周期安排一次。考虑到总线负载的均匀分布,每个小周期安排的总的消息传输量应该是相当的。
由于消息间隔、RT响应时间、总线上偶发的重试等因素的影响,一个消息在每个小周期内的传输时间不完全一样。因此不同的小周期,或者相同的小周期不同次的传输,消息占用的时间都是不一样的。小周期可以依据系统时钟定时传输,即每个小周期都占用分配给它的固定时间,在上例中是12.5ms,那么消息传输完后常常会有空闲时间。也可以充分利用总线提供的带宽,一个小周期的消息传输完之后,即刻启动下一个小周期的消息传输,此时小周期的传输实际上不是以固定频率启动的,因此称为异步传输。
硬件自动非周期消息发送控制方法
条件Block介绍
在CAV-1553B产品中,子帧中的每条消息在BC数据结构中都是由Message Block定义的,每个Mssage Block都对应一个Message buffer,用来存放发送或接收到的数据。Mssage Block中包含一个控制字(BC_control_word)用来指示Block的类型,如消息Block、条件Block等。
其中条件Block是一种特殊的Block,它不是1553B消息Block,因此没有Message buffer。用户可通过条件Block来设置一定的条件,硬件自动检测条件。当条件不满足时,发送指定的周期消息;当条件满足时,发送用户指定消息。例如:当检测到某条消息中RT状态字的服务请求位置’1’时,发送用户指定的非周期消息。
条件Block中需要设置的项及含义如表1所示。
设置项
|
含义
|
Next_message_ num
|
指定条件不满足时,执行的消息
|
Branch_message_num
|
指定条件满足时,执行的消息
|
BC_control_word
|
指定Block的类型
|
Test_word_address
|
给出一个判断对象的地址,这个判断对象可以是命令字、状态字、数据字。
|
Data_mask
|
Test_word的位有效指示字
|
Data_pattern
|
判断结果
|
Cond_count_value
|
条件满足次数
|
表1 Block的设置项
条件Block的设置
(1) 设置当前Block的类型为条件Block。将Block的BC_control_word设为CONDITION_BLOCK。(2) 设置条件满足/不满足时执行的消息。指定条件满足时执行的Branch_message_num和条件不满足时执行的Next_message_ num。(3) 设置条件。首先,可在设置好的消息链表中指定一个字(Test_word)作为判断的对象,这个字可以为命令字、状态字或数据字,给出该字的地址Test_word_address。其次,给出Test_word的位有效指示字Data_mask和需要作比较的字Data_pattern。将Test_word和Data_mask相与的结果与Data_pattern作比较,若等于则条件满足,否则条件不满足。(4) 设置次数。设置次数Cond_count_value,范围从0到65535。当条件满足并且次数也满足时,执行Branch_message_num,否则执行Next_message_num。
使用条件Block发送非周期消息示例
(1) 消息的设置
在主帧中设置一个子帧,子帧周期为4ms,子帧中包含以下四条消息:
Ø Block [0]: BCRT消息,RT地址1,子地址1,32个数据字。
Ø Block [1]: BCRT消息,RT地址1,子地址2,32个数据字。
Ø Block [2]: 条件Block。
Ø Block [3]: RTBC消息,RT地址1,子地址1,32个数据字。非周期消息。
设置子帧中BC消息的链表顺序为:
图2 消息发送顺序
(2) 条件Block的设置
条件为判断消息1中RT回的状态字中的SERVICE_REQUEST被置位,匹配次数为2次。条件满足时发送消息3,条件不满足时发送发送周期消息。
条件Block的具体设置如下:
Ø 指定Branch_message_num = 3,Next_message_num = 0。
Ø Test_word_address为消息1中状态字的地址。
Ø Data_mask = 0xF900;Data_pattern = 0x0900。
Ø 次数Cond_count_value = 2。
(3) 消息的传输
子帧周期为4ms,子帧中消息的发送方式:当条件不满足时,发送周期消息,如图3所示;条件满足时,消息的发送顺序如图4所示,此时非周期消息3被发送一次。之后仍按照图3的顺序发送,直到再次条件满足时才发送非周期消息3。
图3 条件不满足时消息发送顺序
图4 条件满足时消息发送顺序
BC Block设置示例代码见附件example_core_pass4.cpp。
硬件自动发送非周期消息的方法 请点击此处下载全文 (预了解更多内容,请联系作者本人)