一种基于分片的监控协议

监控方案的选择

此监控方式主要是在FPGA上单独开辟两片共64个字节的空间用作监控。

分片传监控帧

监控帧的传送采用分片的方法,基本上是“本端分片 – 组通道帧 – 发送通道帧 – 对端接收通道帧 – 恢复还原监控帧 – 处理”的过程,对端的应答流程类似。

E1监控协议

FPGA提供给我们的只有一个32字节的空间(虽然是2片共64字节,但在此我们只讨论一片即可),没有通常的控制比特,比如中断接收、发送数目控制、接收数目信息等等,因此除了可以轮询去查看到当前通道里的内容之外,我们没有别的选择。然后,剩下的就是监控协议的工作了。想象一下,我们如何知道收到新的数据了?当然,数据改变了就是有新的了,但是如果我们连续收到两片相同的数据怎么办呢,由此,我们当然不能让实际载荷占满整个通道,必须留下数个字节用来区别开每次到来的数据。

通道帧格式

[0x8F 0x C2]为所有监控通道帧帧头标志;

[ACK]为应答序号,用来接收时告知对端“我已经成功接收了第ACK片”;

[TRA]为发送序号,用来发送时告知对端“这是我发送给你的第TRA片”;

[DATA]是发送的实际数据载荷。


在不断的发送和接收帧的过程中,我们需要将这些帧区分开来,即我们要知道什么时候开始和结束一个帧的接收/发送。因此,对于[DATA]部分,需要定义一个特殊的[DATA]来标示一个帧的开始,对于结束,我们可以通过此特殊[DATA]传送一个接收数信息,从而可以使得对方正确的结束一次接收,如上图所示[AA 55 … 55 AA]。其中len_h/l分别为载荷总数目的高低字节,seg_h/l为段总数的高低字节。

交互流程


如图所示为传送一个总长度为36(0x24)的msdh的收发交互过程,首先是由发方发送一个起始帧,其中包括总长度信息[00 24]和分段个数信息[00 02]。收方会轮询通道内容,发现为AA 55 … AA 55则开始一次接收过程,然后回送ack = 01通知发方“我已经收到你的开始帧了”即已经准备好接收实际数据段,发方收到ack = 01后更新TRA为02并发送seg-1,然后收方接收并回送ack = 02,以此类推直到收方接收完最后一段,回送最后一个ack,发方收到此ack后完成本次发送。

关键问题

交互流程看起来还是比较简单的,但实现的时候有些我们需要考虑的更仔细一些。

如何维持和更新ACK/TRA

我们在本地设置两个变量m_rx_tabs和m_tx_tabs分别保存我们待要填入通道帧的ACK和TRA,它们的初始值分别为0xFF和0x00。

当我们要发送一个通道帧前,我们需要将m_tx_tabs++以标示我们发送序号的递增。

当我们接收完一个通道帧后,显然我们需要将m_rx_tabs更新为从接收的通道帧中读出的TRA值,这么做的含义为“你当前发给我的帧我已经收到了,那么我应该将我本地表示我收到的最后一帧序号的变量更新为本次收帧的发送序号”。

如何获知新片的到来


有了ACK和TRA,我们就可以在发方和收方之间建立一个获知新片到来的机制,方式就是“比较不同”,若本地的m_rx_tabs与接收到的TRA不同,则表示为新到来的一片,用此TRA更新本地m_rx_tabs并作为ACK回送对方,且处理片内数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值