我想用这个问题作为讨论2个或更多微控制器网络同步算法的方法。
我今天下午开始考虑这个问题,我有两个不同的微控制器交换数据,然后同步执行,同时开始完成工作,几乎同时完成。这是一种保证您运行的代码是正确的,并且可能内存中没有错误的方法(两个微控制器上出现完全相同的错误的可能性非常低,如您所想)。
我想过只发送带有微控制器1的时间戳的消息,然后第二个微控制器将接收它并将其与自己的时间戳进行比较,然后将其重新发送到微控制器1。
此时他们都会开始执行相同的代码并且他们会在最后同步,他们会互相交换结果然后如果出现问题他们会得出结论,或者一切正常。
我认为这将是实现两个微控制器之间执行同步的“体面”方式,但我无法理解可能有更好,更智能的方法。
这个“可能”可以用2个微控制器工作,但是当我想用更多的微控制器做什么呢?如果我想以我之前解释过的方式实现5核心系统(例如5个arm9核心),该怎么办?我不认为这适用于几个微控制器。即使我想要实现一个5核系统,其中所有微控制器都会做不同的工作(我认为在所有情况下同步必须是最好的......我真的不知道我从来不需要多个核心,但我现在需要这样做)
修改
我想用这个问题来理解两个或更多微控制器在网络或同一板上进行同步的算法。
我今天下午开始考虑这个问题,我有两个不同的微控制器交换数据,然后同步执行,同时开始完成工作,几乎同时完成。这是一种保证您运行的代码是正确的,并且可能内存中没有错误的方法(两个微控制器上出现完全相同的错误的可能性非常低,如您所想)。
我想过只发送带有微控制器1的时间戳的消息,然后第二个微控制器将接收它并将其与自己的时间戳进行比较,然后将其重新发送到微控制器1。
此时他们都会开始执行相同的代码并且他们会在最后同步,他们会互相交换结果然后如果出现问题他们会得出结论,或者一切正常。
我认为这将是实现两个微控制器之间执行同步的“体面”方式,但我无法理解可能有更好,更智能的方法。
答案 0 :(得分:2)
当然有两个或更多处理器执行相同任务并且比较结果的系统。我知道有两个系统应该产生相同结果的自动列车控制系统,如果其中一个系统没有产生相同的结果,则紧急制动器被“拉动”并且列车停止直到驾驶员推动“我注意到电脑无法正常工作“按钮。这两个系统的软件由两组不同的开发人员编写,他们没有共享任何有关如何实施解决方案的信息,以避免“常见错误,因为我们都认为应该以这种方式解决”。
飞机电子通常使用不均匀的数字和“多数投票”来选择来自不同系统的多个答案 - 在ariplane中“停止”是一个坏主意。同样,系统使用不同的软件,并且通常也使用不同的供应商,例如处理器和语言 - 因此一个系统用C或C ++编写,另一个用Java编写,第三个用Pascal或ADA编写[作为示例] - 以减少机会处理器,语言或编译器错误导致系统中的每件事都变得“错误”。
从以前使用x86的工作开始,我已经详细研究了一个想要让“备份处理器以锁定步骤运行”的客户,并且他们必须使用添加的修改后的编译器代码[分支,调用,返回等]中的决策点的I / O指令,然后是外部硬件,以确保处理器实际上处于同步状态。因此,现代处理器,包括这样的ARM,在处理器内部有足够的“聪明的东西”相当“不可预测”,几乎不可能使两个处理器彼此精确锁定。当然,只要你没有准确地测量时间,你就可以获得“在相同的时间内执行相同任务”的东西。
超标量执行单元,异步中断,异步(ish)内存控制器,高速缓存,高速缓存内容,所有这些都使得一个处理器的运行速度比另一个稍快或慢一些。
因此,您可以精确地使系统“同步”。
网络时间协议(NTP)确实有一些非常聪明的算法,用于设置/同步多个系统之间的时间,这允许多个系统具有相同的“时间”概念。但请记住,再次,“同一性”是有限度的。这可能是几微秒。
所以,你是否可以“同时开始”取决于你所说的“同一时间”。是微秒还是毫秒好吗?如果是这样,几乎可以肯定。如果你的意思是时钟周期,那么可能不是。
答案 1 :(得分:2)
有很多方法可以做到这一点,具体取决于您想要制作系统的自定义方式,以及运行所需的精确程度。
你在正确的轨道上,时间戳是来回发送的。像这样进行本地同步的“标准”方式是Precision Time Protocol (PTP / IEEE 1588),它的工作精度可达微秒级,具体取决于实现方式(与Network Time Protocol, NTP相反,后者更适合远程同步,并且通常不能比在毫秒范围内更好地实现同步。
如果您的微控制器上运行了带有以太网或类似功能的Linux系统,那么您可以查看PTPD。或者,如果您想自己实现某些功能,请查看PTP(可能还有NTP)算法并获得灵感。