整个思路似乎还在传统的串行通信那里啊!
任何时候,总线上最多只能有一家处于发送状态.发送最大的一帧(8个字节数据)本身要占用一百多个"位时间",具体需要的时间还要看是用的基本格式,还是扩展格式.总之是一百多个位时间.在发送过程中还要做总线竞争,仲裁失败了,就得等待下一次竞争机会,竞争总线也需要一些时间,这样算起来,如果使用扩展帧格式,发送8个字节平均大约需要160个"位时间"吧.
在LZ的网络里,使用320Kbps的速率, 位时间就是1/320毫秒, 发送一个最大的扩展数据帧(8个数据字节)大约需要160*1/320毫秒,相当于16个字节/毫秒. 用500Kbps的速率的话, 就是(500/320)*16 = 25字节/毫秒. 如果只是一家发,没有总线竞争,而且使用基本帧格式,每个帧大约花费120个左右的位时间,依然还是500Kbps的速率, 160/120*25=32字节/毫秒
现在是两个接点的网络,很都事就出来了! 首先假定两家优先级相同,那就竞争吧,仲裁花费的时间就多了!大量的时间花费在仲裁上,速度肯定就上不去了,两家的传输速度都高不了.
如果两家的优先级不同,那么优先级高的接点抢到总线的机会就多一些.极端情况下(比如永远不停地有数据要发送),优先级低的接点大多数时候只能干瞪眼了!这是由CAN协议本身的约定限制死了的:我的优先级高,我刚刚发完一帧,我又发现还有数据要发送,我就赶快检测总线,发现它是空闲的,你的优先级低,也几乎同时发现总线是空闲的,那么好了,咱俩通过往总线上发送ID做仲裁!没的说,我的ID小,我仲裁胜出了,你就呆一边去吧,这一帧发完了,后面咱俩继续,还是我赢!所以你就只能一直干瞪眼了!
注意上面一句话:我又发现还有数据要发送,我就赶快检测总线.....
我"发现...."是要花费时间的,在这段时间之中,总线很可能就变空闲了,你前面一直赢不了我,所以,你有时间早早的"发现......",当我现在正在"发现...."的时候,你就开始使用总线了,当我终于"发现了....",再来看总线,总线已经不空闲了,于是,你终于也能赢得总线了!而我,虽然优先级比你高,可我来晚了,只好等了.
有一些CAN器件采用所谓"硬件发送缓冲区",当缓冲区中有多帧数据需要发送时,一旦当前一帧发送完毕,几乎不需要时间判断发送缓冲区是否为空,就可以立即竞争总线,相对来说就很容易出现高优先级的接点过分多的占用总线的情况了.
|