新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 查询主从机中断同步的方法

查询主从机中断同步的方法

作者:时间:2012-08-25来源:网络收藏

while(!flag)若中断标志flag不为1,意味着还没有响应中断,于是一直不停查询
响应中断之后,flag会变为1,退出循环
然后立即将flag清0,接着马上跳转到goto语句指定的地方,用这个来同步。
即:在约定的时间内进行不断查询,查询的单位时间很短,放弃了一个短时间的效果显示来实现长时间的

过程描述如下:
上电后,主机,从机各自跑相同的效果,由于晶振的原因,会导致执行速度不同。在短时间内这样的速度差异难以被人察觉,但是这样的差异性是一个累加的过程,在运行了很久之后,各个不同的机器之间的差异就很明显了。

因此我们要在差异累加到不能忽略之前,对每个机器进行同步化处理。现在只是一条连线,从主机的IO口到各个从机的外中断口。
即:我们只能用外部中断来实现同步调整。

根据我在另一篇文章http://www.51hei.com/mcu/1168.html中的介绍可知外中断信号是在每一个机器周期都会由硬件自动查询的,所以,一旦有“同时的”中断信号传到各个不同速度的从机的中断口的时候,各个机子都会在第一时间内响应这个中断,,此时各个机器之间的绝对时间差异就只有一个机器周期的差异,设为Td。

假设机器1的晶振实际工作频率为16.001MHz
机器周期为T1=12/(16.001*E6)

机器2的晶振实际工作频率为16.0009MHz
机器周期为T2=12/(16.0009*E6)

他们之间的差异Td=T2-T1=(12/16000900)-(12/16001000)=7.488531279295044*(e-7)=1.1046869434089*(e-9)S

理论上我们能够用视觉发现有不同步的差异时间为10毫秒级别,即
1*(e-2)
所以在这个不可避免的差异累计到我们能够用眼睛觉得到时,需要累加
n=1*(e-2)/1.1046869434089*(e-9)=9052338次
而我们进行同步的时间间隔是1分钟,那么我们依*视觉发现机子不同步的时候,同步系统已经运行了150872.3小时,约等于6286天,大概为17年!

因此只使用一条数据线来实现同步是可行的。我们需要这样的主机:

循环运行6个效果函数,每个效果函数运行10次。最后一个效果函数例外,它要为同步服务,因此它的单次循环时间应当比较短暂,为了可以看到明显效果可以多循环几次,例如循环20次。
在运行最后一个效果函数的第20次的中间发送一次信号,发送同步信号之后延时一定时间进入事先约定的同步效果。这个一定时间是指信号传输时间,被从机识别、响应的时间总和。可以用试验方法测试取得。
方法如下:主机与从机器使用前一段相同的程序,运行完相同程序后,主机在发送中断信号,而从机开始用计数器计数(建议计数器初值为00,这样好算一些),响应中断后停止计数器。读取当时的计数器值,就可以得到稍微准确的中断响应时间。Ti=(12/f)*n,f为晶振频率,n为所读取的计数器值。获得这个时间之后就可以使用汇编语言来进行主机的延时,这样的效果应该是最好了。

因此我们需要这样的从机:
无论是较主机快的从机,还是较主机慢的从机,都必须在主机发送中断信号之前进入循环查询状态,这样才能一起进入同步效果。因此,从机不运行最后一个效果的第20次,而在运行完第19次之后都进入循环查询状态,这样虽然会有暂时的不同步现象,但是我们可以把最后一个效果的单词循环做得很短暂,这样就可以用短暂的不同步换取长时间的同步。

因此我们需要这样的--最后一个效果函数:
单次循环时间尽量短,但是最好要大于2倍的Ti,与其他效果函数不一样,应当循环多次,如20次



评论


技术专区

关闭