AFDX队列管理器的设计与实现*
2018-12-19乔庐峰陈庆华吴艳华
黄 旭,乔庐峰,陈庆华,吴艳华
(陆军工程大学 通信工程学院,江苏 南京 210001)
0 引 言
机载数据总线作为航空电子综合系统的重要组成部分,用于机载设备和子系统之间的互联,承担着各模块之间信息交换的任务。随着航空电子系统的不断发展,对机载总线网络的实时性和可靠性提出了更高要求。在以太网为基础上发展起来的新型航空网络AFDX是一种确定性网络[1],可以满足当前航空电子系统数据传的容错性、实时性和可靠性要求。在AFDX中,端系统(End System)是非常重要的组成部分,在航空电子子系统和交换网络之间起到桥梁的作用。它负责将需要发送的数据流进行整形,然后按照分配好的虚拟链路(VL)发往目的终端[2]。虚拟链路作为端系统的核心,将一条物理链路分为多条VL。每条虚拟链路都有其独立的参数,通过这些参数的设置控制每条链路中数据的传输[3-4]。为了灵活、合理使用带宽和存储资源,本文设计了一种队列管理器。该队列管理器对每条虚拟链路单独管理,从而确保业务流的服务质量[5]。
1 队列管理器设计
为了对多条虚拟链路进行管理,且为了满足AFDX中各虚拟链路之间帧传输时互不干扰的需求[6-7],设计了如图1所示的队列管理器。
图1 队列管理器结构
队列管理器主要分为以下几个部分:自由指针队列、多队列管理器、缓冲区模块、接口管理电路和写预处理模块。
(1)自由指针队列。这个模块存放着缓冲区模块的地址,即自由指针。每当有一个信元写入缓冲区,需要从自由指针模块取出自由指针。每当有数据完成读操作,自由指针空闲出来,需要归还到自由指针队列。
(2)多队列管理器。该模块存放着每个队列的相关信息,包括链表、头尾指针信息、深度信息和预留门限等。
(3)缓冲区。该模块是用来存放输入端口传输进来的信元。调度器模块也是从该模块读取信元。
(4)接口管理电路。该模块在收到读写请求时,会判断缓冲区是否满足读写条件,若满足则执行操作,否则不执行。此外,该模块控制当前执行的是读或者写操作,防止发生冲突。
(5)写预处理模块。该模块从队列管理器取出空闲指针,并将信元存往缓冲区指定地址中。
2 队列管理器工作流程
2.1 数据写入流程
当新的业务流到达时,由前处理模块发出输入请求,同时告知业务流的编号。多队列控制模块会依据编号查询取队列信息,并判断是否满足继续写入数据的条件。若满足条件,则操作流程如图2所示。
图2 数据写入操作流程
以业务流编号为地址,多队列管理电路会读取该编号虚拟链路的相关信息,包括该队列的信元深度、队列预先设定的门限、头尾信息以及剩余的共享缓存深度。接口管理电路根据这些信息判断,当缓冲区中剩余的空间足够装下一个完整的数据帧时,则将输入的数据写入缓冲区。
2.2 队列控制器中链表的构建
本设计中队列控制器需要对128条业务流进行管理。为了提高队列管理器的灵活性,节约存储资源,采用基于链表的存储方式。如图3所示,链表中的信元结构:2比特的信元指示位,16比特的下一跳的地址位。此外,链表的构建需要用到队列的头尾信息,多队列管理模中有一块RAM用来存放链路的头尾指针信息。
当上一级有数据输入时,队列管理器先从自由指针队列取出一个自由指针,然后以业务流的编号ingress_qnr为地址,从多队列管理模块中查找该业务流所在队列的头尾信息。查找完成后,可以得到该队列的尾指针地址。以尾指针为地址,将取出的自由指针写入该队列的链表中,同时更新头尾指针信息和深度信息。最后,将信元写入自由指针所指向的缓冲区。
图3 链表
当某条链路需要读取数据时,先以engress_qnr为地址,从多队列管理模块中读取信息。经接口管理电路判断,若该链路的缓冲区中存有一个完整的数据帧,则以头指针作为地址位读取缓冲区中存储的数据。完成读取操作后更新链表,先从链表中读出下一跳的地址。这是该队列新的头指针,然后更新多队列管理模块。完成表更新后进行指针归还操作,即将完成读操作的头指针归还到自由指针队列。
2.3 缓冲区管理模块
缓冲区管理模块是用来存储输入信元的模块。本设计中的队列管理器需要对128条虚拟链路进行管理和调度。为了更加灵活地管理128条队列,缓冲区采用了固定分配和共享缓存兼容的缓冲方式,即缓冲区给每条虚拟链路预留部分缓冲空间,剩余的缓冲空间作为共享缓存。这种方式可以更加合理灵活地使用缓冲区,从而提高缓冲区资源利用率。
2.4 数据读出流程
当队列控制模块收到读取数据的请求时,会同时接收到业务流的编号,根据业务流编号会对该业务流对应的队列信息进行判断。队列控制器以业物流编号engress_qnr为地址,从多队列管理器中读取该队列的相关信息,如队列深度、队列头尾信息、队列预留深度等。在存有一个完整数据帧的情况下,才可以发送数据。根据读取的头尾指针信息可以得到读指针(engress_ptr),以读指针为地址从缓冲区读取信元,接口管理电路会将信元发送到调度器模块。完成读取流程后,需要更新链表和各信息模块。此外,原先的头指针在读操作完成后成为自由指针,需要归还到自由指针队列。
3 仿真结果分析
3.1 初始化配置
系统完成复位后,先要进行自由指针队列的初始化。图4是自由指针初始化过程。当信号cfg_init置1的时候开始初始化配置,即将自由指针写入相应的地址中。以自由指针0为例,初始化操作中使能信号wea置1,地址信号addra值为0,输入信号dina值为0。这表示自由指针0写入自由指针队列地址为0的位置。当全部的自由指针写入队列后,自由指针队列的初始化完成。其余的内部模块主要是将RAM内个表项清零。
图4 自由指针队列初始化仿真结果
3.2 数据流写入仿真分析
当上层数据进入队列管理器时,要先判断是否有足够的缓存空间储存新到达的数据帧。若满足写入条件,则将数据写入缓冲区;否则,丢包。如图5所示,此时ingress_ptr_req为1,表示有信元申请写入缓冲区;ingress_qnr为100,表示信元来自编号为100的业务流。先读取多队列管理模块中该队列的相关信息,然后经过接口管理模块进行判断。该通道缓冲空间为空,满足写入的条件,因此将信号ingress_ptr_ack置1,表示可以将信元写入缓冲区。此时,将得到的自由指针4095赋值给写指针ingress_ptr,然后以写指针为地址将进入队列管理器的信元写入缓冲区中对应的位置。
图5 写数据仿真结果
3.3 数据流读出流程分析
当队列管理器中有数据要被读出时,队列管理器会收到一个请求信号engress_ptr_req和业物流编号engress_qnr。此时,接口管理模块会判断该编号业务流的缓冲队列中是否存有一个完整的数据帧。若满足条件,则发送数据;若不满足,则不发送数据。如图6所示,engress_qnr为100,engress_ptr_req为1,表示编号为100的业务流有数据要读出,经缓冲区判断该业物流缓冲队列中存有一个完整的数据帧。因此,将信号engress_ack置1,表示可以从缓冲区中读取数据。指针engress_ptr的值为4095,所以从缓冲区该地址读取信元。
图6 读数据仿真结果
3.4 自由指针归还操作
每次完成一个信元的读取操作都需要归还自由指针。如图7所示,此时虚拟链路号100的虚拟链路完成了一次读操作,指针4095成为了自由指针,需要将其归还到自由指针队列。这时,将自由指针模块的写使能信号wea置1,空闲的地址位是4093,所以信号自由指针队列的地址位addra值取4093,自由指针4095作为输入信号dina。这表示将自由指针4095写入自由指针队列中地址为4093的位置。归还自由指针操作完成,将写使能信号置回0。
图7 自由指针归还仿真结果
4 结 语
本文针对AFDX这种确定型网络设计了一种适用于多条虚拟链路的队列管理器,并介绍了各部分的功能及其结构。仿真证明,该队列管理器能够对端系统中多条队列实现单独管理,并合理分配利用缓冲资源。下一步将结合调度器对该队列管理器做进一步测试,检测其时延和抖动方面的特性,以确保满足确定型网络AFDX的需求。