监控方案的选择
此监控方式主要是在FPGA上单独开辟两片共64个字节的空间用作监控。
分片传监控帧
监控帧的传送采用分片的方法,基本上是“本端分片 – 组通道帧 – 发送通道帧 – 对端接收通道帧 – 恢复还原监控帧 – 处理”的过程,对端的应答流程类似。
E1监控协议
FPGA提供给我们的只有一个32字节的空间(虽然是2片共64字节,但在此我们只讨论一片即可),没有通常的控制比特,比如中断接收、发送数目控制、接收数目信息等等,因此除了可以轮询去查看到当前通道里的内容之外,我们没有别的选择。然后,剩下的就是监控协议的工作了。想象一下,我们如何知道收到新的数据了?当然,数据改变了就是有新的了,但是如果我们连续收到两片相同的数据怎么办呢,由此,我们当然不能让实际载荷占满整个通道,必须留下数个字节用来区别开每次到来的数据。
通道帧格式
[0x8F 0x C2]为所有监控通道帧帧头标志;
[ACK]为应答序号,用来接收时告知对端“我已经成功接收了第ACK片”;
[TRA]为发送序号,用来发送时告知对端“这是我发送给你的第TRA片”;
[DATA]是发送的实际数据载荷。
交互流程
如图所示为传送一个总长度为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值,这么做的含义为“你当前发给我的帧我已经收到了,那么我应该将我本地表示我收到的最后一帧序号的变量更新为本次收帧的发送序号”。如何获知新片的到来