恭喜,你发布的帖子
发布于 2016-03-22 12:22:48
3楼
已经告诉你比较触点的问题,那么你就往那边去查嘛。跟其他别的有什么关系呢?。问题没有明确指向之前,就从程序开始查起。
用SM0.0,多处传送那个比较导致出错的值出来,直到发生stop一刻,那么这里传送出来的值就临死之前最后的信息了。你分析这个数据为何成为导致出错的非法值,这就有线索了,有指向了。
这事情基本上都是程序里面的一些不经意的漏洞造成的。
特别是通讯程序。通讯线路周期,通讯程序处理周期,程序扫描周期,中断周期,以上,四个周期基本不可能同步。当某个值你现在读一次,等片刻再读一次,两个值已经是不一样的了。你不留意的话,正好那个值正在被扫描改写了高位字节,低位还没来得及写,然后就被中断读去了。就这样错误的数据格式出现了。但是这个瞬间很难才撞在一起。你基本监视不到的。
所以,你必须在一个特定的时间保持一个同步。让各种使用这个地址的请求都能读到一个唯一的值。
说一个可能正是你的问题所在的假设:SLAVE指令的Done位on的时候(我忘了是on还是off),你去读取你缓冲区的数据,呵呵,人家还在工作你就把没完成的数据拿来当啥。而且还是给比较触点做比较,那么死定啦。通讯需要更新18个字节的数据,正好你的数据在第九到第十二个字节,通讯需要一个一个字的去刷新,还好你每次都碰不上那种刷新了一半的“好事”,而那么巧就有一次正刷新了第九第十个字节的时候,你读了。结果九和十是新的,十一十二是旧的,两个字组合起来的浮点数是非法的,终于让你遇上了。
请填写推广理由:
分享
只看
楼主