- 仲裁——如何解决设备争用问题
同一时刻只能有一个设备而控制总线传输操作,可以有一个或者多个设备从总线接收数据
将总线上各个设备按照对总线有误控制功能可以分为:
主设备:获得总线控制权的设备
从设备:被主设备访问的设备,只能响应从主设备发来的各种总线命令
集中式仲裁方式
1.主设备发送请求信号
2.若多个主设备同时要求总线,有总线控制器(在CPU或者是桥接器中)进行判优,仲裁逻辑按照一定的优先等级顺序确定哪个设备能获得使用总线的权利
3.获得总线使用权的主设备开始传输数据
三根每次只能传输一个信号的控制总线
BG总线允许
BR总线请求
BS总线忙
链式查询方式:
设备请求使用总线时,向BR发送信号(可以不止一个设备发送)
总线控制部件接受到BR的信号后,发送BG信号给设备,依次经过各个设备接口,如果该设备没有请求使用总线,则跳过该设备继续寻找,直到找到一个申请使用总线的设备为止
设备收到BG信号之后,发送BS信号后,开始使用总线
总线收到BS信号后停止发送BG信号,等待BS信号消失了,继续发送BG信号,以此类推
(BS信号的建立者,是获得总线控制权的设备)
优先级:离总线近的部件,优先级越高
优点:优先级固定,只用很少几根线就能实现按一定优先级的总线仲裁,链式结构容易扩充设备
缺点:对查询链的电路故障很敏感,如果第i个设备接口中有关链的电路出现故障,则该设备后的设备都不能工作
查询链的优先级固定不变的。优先级高的设备出现繁忙的总线请求,则优先级低的设备可能长期得不到总线的使用权(会产生饥饿)
计数器定时查询方式
用一个计数器来控制总线的使用权
相对于上一种,多了一组设备地址线,少了一根总线响应线BG
仍然共用一根总线请求先
当总线控制器接收到BR,且判断此时没有BS时,计数器开始工作
通过设备地址线将计数器的值发给各个部件
当地址线上的计数值与请求使用总线的设备的地址一致时,该设备活动总线的控制权
同时终止计数器的计数和查询
优点:
计数器的初始值可以改变优先的次序:(计数器的初值可以由程序设置)
如果每次从零开始,则跟链式查询一样
如果每次从上一次的终点开始,每个设备使用总线的优先级相等
没有链式敏感(前一个坏了后面还能用)
缺点:
增加了控制线数
相对于链式查询,较为复杂
独立请求方式
现代总线标准普遍采用独立请求方式
每个设备均有一对总线请求线BR和总线允许线BG
当总线上的设备需要使用总线时,经过各自的总线请求线发送总线请求信号,在总线控制器中排队
总线控制器可以根据一定的优先次序品准部件的请求,批准后给该部件发送总线响应的信号
优点:
响应速度快,对优先级的控制非常灵活
总线控制器可以根据一定的仲裁算法给各请求线以固定的优先级
可以通过编程设置动态优先级
可以用屏蔽(禁止)某个请求线的办法,不响应无效设备的请求
缺点:
控制线数量多
设备有n个,则需要2n+1(一根BS)控制线
用于向总线反映是否正在使用总线
总线的控制逻辑更加复杂
链式查询方式 | 计数器定时查询 | 独立请求方式 | |
控制线 | BS、BR、BG 共3根 | BS、BR、log2n 共 2+log2n | n组(BR、BG) 共2n根 |
响应速度 | 慢 | 慢 | 快 |
优先级 | 优先级固定 | 可作适当变化 | 可作灵活的变化 |
故障敏感度 | 非常敏感 | 不敏感 | 不敏感 |
扩展方式 | 容易 | 难 | 容易 |
分布式仲裁方式
不需要中央仲裁器,每个潜在的主模块都有自己的仲裁器和仲裁号,多个仲裁器竞争使用总线
当设备有总线请求时,把各自唯一的仲裁号发送到共享的仲裁总线中
每个仲裁器都会将自己的仲裁号与总线上的相比较
如果总线上的优先级更高,则该仲裁号被撤销
最后优先级最高的仲裁号会保留在总线上