信号传输连接方式介绍之菊花链模式
Contents
起因
硬件设计里"多台设备共用一条信号"是高频需求:一条中断请求线要接多块板卡、一条 SPI 总线要挂多个器件、几台交换机要堆叠成一台管理。多设备互连的接法里,菊花链(一个传给下一个)是与总线型(大家并在一起)并列的基础拓扑。这篇把菊花链的信号原理、优缺点和适用场景讲清楚。
需求
- 弄清菊花链的信号流向,以及"物理位置=优先级"这个性质的由来
- 知道它省线、无竞争的代价是什么
- 了解交换机堆叠语境下的菊花链瓶颈
技术实现原理
信号像串联电路里的电流
菊花链(daisy chain)是一种信号传输的连接形式,常用的有菊花链总线、菊花链中断等。通俗的讲,信号(总线信号或中断信号)是以串行的方式从一个设备依次传到下一个设备的,信号有点儿像串联电路中的电流:设备A→设备B→设备C→……→CPU。
关键性质是信号"路过"每个设备:每个设备都有两个选择——需要服务就截住(消费掉),不需要就原样传给下一个。于是"和CPU挨得越近,越是优先得到服务的机会":物理位置直接决定优先级,全程不需要任何仲裁器。有些异步总线,如VME总线的数据传输和中断的分配就采用这种形式(中断应答沿链传播,第一个发出中断的板卡截住应答线,把自己的中断号放上总线)。
为什么省线、又为什么没竞争
菊花链最大的好处就是可以利用有限的信号传输线连接多台设备,共享同一服务,而且不存在总线竞争和阻塞等问题。原因是仲裁问题已经被"链的顺序"这个物理事实解决了——信号到达的先后就是优先级,先到先得,天然无冲突。这也带来一个灵活点:在某设备把信号传递给下一个设备之前,可以修改这个信号;如果它也需要服务时,就截住这个信号,“私自挪用"了。
单点故障与饥饿:串行传递的代价
菊花链的最大缺点是因为是信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了;而且靠近CPU的设备由于总是享有优先服务权,有可能造成下面设备的服务迟迟得不到响应而影响自己的工作效率。
因此使用菊花链时有两条工程纪律:如果某设备不使用该服务,一定要把该信号短路掉(直通)传给下面的设备;安排好优先级的次序,并且最好设置有总线监视器,在迟迟得不到响应时报超时错,以免因为链路故障而影响整个系统的正常工作。
对照总线型:省线程度相同,代价不同
- 总线型(I2C、RS485):所有设备并联在同一对线上,谁都能听、谁都能讲。同样省线,但必须引入地址编码 + 仲裁机制,而且电气负载随设备数增长(所以总线有节点数上限);
- 菊花链:设备逐级串联,信号天然有序。不用仲裁不用地址,但链上任一环节故障会切断下游,传播延迟也逐级累积。
容易混淆的一点:RS485 布线规范里也讲"手拉手/菊花链布线”,但那指的是走线形状(避免分支桩线减少反射),电气上所有节点仍并联在同一条总线上,信号并不逐级穿器件而过——与本文的菊花链传递不是一回事。
还有一种同源的"菊花链"是 SPI 器件的链式连接:多片器件的 SO 接下一片的 SI,移位寄存器首尾相接成一条长链,一条 CS 同时选中所有器件。它利用的同样是"信号穿器件而过"的特性,N 片器件只占一条片选。
交换机堆叠里的菊花链
菊花链模式是简化的级联模式,主要的优点是提供集中管理的扩展端口,对于多交换机之间的转发效率并没有提升,主要是因为菊花链模式是采用高速端口和软件来实现的。
菊花链模式使用堆叠电缆将几台交换机以环路的方式组建成一个堆叠组。但是最后一根从上到下的堆叠电缆只是冗余备份作用,从第一台交换机到最后一台交换机数据包还是要历经中间所有交换机。其效率较低,尤其是在堆叠层数较多时,堆叠端口会成为严重的系统瓶颈,所以建议堆叠层数不要太多。
星型堆叠如何解决这个瓶颈,见姊妹篇《信号传输连接之菊花链模式和星型模式》。
踩坑记录与注意事项
- 中间设备断电/故障 = 下游全灭:链的可用性由最弱一环决定,关键链路要有旁路设计或总线监视;
- 不用服务的设备必须把信号直通:设计背板/级联接口时"不接"和"接但直通"是两回事,留了菊花链口却没短路,下游设备全部失联;
- 优先级=位置:把最需要实时响应的设备放在离 CPU 最近的链头;链尾的饥饿敏感设备要么挪位置,要么靠超时监视兜底;
- 延迟逐级累积:每级器件的传播延迟会叠加,高速总线(如 VME 中断应答)对链上设备数有明确上限;
- 堆叠层数别贪多:瓶颈在堆叠端口的共享带宽,不在单台交换容量;
- 布线形状≠信号拓扑:见上文 RS485 的例子,别把手拉手走线当成信号串联。
Author 软件开发大郭
LastMod 2022-05-29