yusea君是精通CAN规范的人。
重复yusea君的实验,同样经历了一些怪异的、不能解释的现象/输出结果,但最终发现还是自己的程序问题;反复修正,使之符合规范,遂找出了对CAN规范中关于仲裁丢失规则的正确理解,及程序处理方法要点。(规范中对这些内容不会讲得很细,只限于以下文字。)
CAN仲裁规则: Bus access conflicts are resolved by bit-wise arbitration on the identifiers involved by each station observing the bus level bit for bit. This happens in accordance with the "wired and" mechanism, by which the dominant state overwrites the recessive state. The competition for bus allocation is lost by all those stations (nodes) with recessive transmission and dominant observation. All those "losers" automatically become receivers of the message with the highest priority and do not re-attempt transmission until the bus is available again. (注:所谓 the highest priority 是指当有若干个节点同时竞争总线时,仲裁结果是:所有未获得总线读取权的站都成为具有最高优先权报文的接收站,并接收其报文。) 有篇荷兰人写的**概念更清晰,他说其它loser节点将由积极发送状态转换为“Listen only” 只听状态。
losers 在听什么?它们听到了什么? (这就是CAN规范内含的精彩内容。)
我最初的疑问:一个SR=0x10的loser还能不能接受并执行“连续发送”的上层命令/程序意图? yusea君说,让701、703同时启动,两边同时“连续发送”。703已经被701阻塞挂起了,它有一个发送任务悬在那里等待运行,它还能接收新的发送任务?一个CAN通信控制器能悬挂几个任务?
规范中明确说明了,竞争失败者不会在总线再次空闲前再次发送报文。只有当最高优先权的报文节点释放总线之后,其他几个losers才再次尝试重新传输报文/竞争总线。 所以,在703号报文发送节点因仲裁失败成为loser之后,在701号报文节点发送完它的每一帧数据之前,它一直是一个接收器。在703节点内部,每发生1次仲裁丢失就应完整接收一帧。仲裁丢失数等于接收帧数。这意味703在701每发送1帧消息,(虽经仲裁失败)必然接收到701发送到总线上的报文,否则它就不是CAN控制器。/或者实验程序出了问题。
下一步的论证命题是: 1、为什么一个loser703不会再次与701积极竞争总线?(除了总线空闲之外,它还听见了什么?)———这里有概念错误!待修改。 2、为完成被挂起的发送任务,一个loser在什么状态条件下,才会再次竞争总线?(总线空闲除外。)?)———这里不严格!待修改。
3、703何时/怎样脱离/摆脱/结束自己的loser状态?(总线空闲除外。) 4、...... 5、......
所枚举的问题均归纳于:一个因仲裁退出而被挂起的任务在MAC子层上的CAN调度规则。
(规范中都提到了的。)
|