【问题标题】:Synchronization of execution between 2 microcontrollers in CC语言中2个微控制器之间的执行同步
【发布时间】:2013-03-14 20:54:56
【问题描述】:

我想用这个问题来讨论通过 2 个或更多微控制器的网络进行同步的算法。

我今天下午开始考虑这个问题,我会让 2 个不同的微控制器交换数据,然后同步执行以同时开始工作并在大约同一时间完成工作。这是一种确保您正在运行的代码是正确的并且内存中可能没有错误的方法(您可以想象,在两个微控制器上出现完全相同错误的可能性非常低)。

我想只发送一条带有微控制器 1 时间戳的消息,然后第二个微控制器将接收它并将其与自己的时间戳进行比较,然后将其重新发送到微控制器 1。

那时,他们都将开始执行相同的代码,并在最后进行同步,在那里他们将相互交换结果,然后他们会得出结论,如果有问题,或者一切正常.

我认为这将是实现两个微控制器之间执行同步的“体面”方式,但我无法忘记可能有更好、更智能的方式来做到这一点。

这个“可能”适用于 2 个微控制器,但是当我想使用更多微控制器时怎么办?如果我想按照我之前解释的方式实现一个 5 核系统(例如 5 个 arm9 核)怎么办。我不认为这适用于几个微控制器。即使我想实现一个所有微控制器都可以完成不同工作的 5 核系统(我认为在所有情况下同步必须是最好的......我真的不知道我从来不需要超过一个内核,但从现在开始我需要这样做)

编辑:

我想用这个问题来了解通过网络或在同一板上同步 2 个或更多微控制器的算法。

我今天下午开始考虑这个问题,我会让 2 个不同的微控制器交换数据,然后同步执行以同时开始工作并在大约同一时间完成工作。这是一种确保您正在运行的代码是正确的并且内存中可能没有错误的方法(您可以想象,在两个微控制器上出现完全相同错误的可能性非常低)。

我想只发送一条带有微控制器 1 时间戳的消息,然后第二个微控制器将接收它并将其与自己的时间戳进行比较,然后将其重新发送到微控制器 1。

那时,他们都将开始执行相同的代码,并在最后进行同步,在那里他们将相互交换结果,然后他们会得出结论,如果有问题,或者一切正常.

我认为这将是实现两个微控制器之间执行同步的“体面”方式,但我无法忘记可能有更好、更智能的方式来做到这一点。

【问题讨论】:

  • 到标题:它被称为“线”,从一个CLK 引脚连接到另一个。
  • 不太适合这个网站(请参阅stackoverflow.com/faq#dontask)尝试聊天或类似...
  • @H2CO3 我真的不认为这是个好主意。特别是如果您想通过网络进行同步。
  • @Ross 我认为它应该在这里,因为我正在谈论一种用于任何给定目的的同步算法。我并不是真的在谈论硬件以及如何连接它们,我只是举了几个如何连接它们的例子,这样人们就可以更好地理解我想说的话。我想谈谈算法,但如果我弄错了,我会把它从这里拿走。让我看看你传给我的链接
  • @Ross 是的 .. 你是对的。让我改变我的问题的范围。因为我写的是一回事,但我想要的是另一回事。感谢您的提醒

标签: c synchronization arm


【解决方案1】:

肯定有一些系统,其中两个或多个处理器执行相同的任务并比较结果。我知道自动列车控制系统有两个系统应该产生相同的结果,如果其中一个系统没有产生相同的结果,紧急制动器被“拉动”,火车停止,直到司机按下“我注意到计算机无法正常工作”按钮。这两个系统的软件由两组不同的开发人员编写,他们没有分享任何有关如何实施解决方案的信息,以避免“常见错误,因为我们都认为应该以这种方式解决”。

飞机电子通常使用奇数和“多数投票”在来自不同系统的多个答案之间进行选择 - 只是在飞机上“停下来”是个坏主意。同样,系统使用不同的软件,并且通常还使用不同的供应商,例如处理器和语言——所以一个系统是用 C 或 C++ 编写的,另一个是用 Java 编写的,第三个是用 Pascal 或 ADA 编写的(例如)——以减少机会导致系统中的每件事都“出错”的处理器、语言或编译器错误。

在之前使用 x86 的工作中,我已经为一位希望“同步运行备份处理器”的客户详细研究了这一点,他们必须使用经过修改的编译器,该编译器添加了代码中决策点的 I/O 指令 [分支、调用、返回等],然后是外部硬件,以确保处理器实际上是同步的]。因此,包括这种 ARM 在内的现代处理器有足够的“聪明的东西”,在处理器内部是相当“不可预测的”,几乎不可能让两个处理器彼此精确同步运行。当然,只要您不太精确地测量时间,您就可以获得“在相同时间内执行相同任务”的东西。

超标量执行单元、异步中断、异步(ish)内存控制器、缓存、缓存内容,所有这些都使一个处理器的运行速度比另一个处理器快一点或慢一点。

因此,使系统“同步”的精确度是有限度的。

网络时间协议 (NTP) 确实有一些非常聪明的算法来设置/同步多个系统之间的时间,这允许多个系统具有相同的“时间”概念。但请记住,“相同”是有限度的。可能是几微秒。

所以,能否“同时开始”取决于你所说的“同时”是什么意思。微秒或毫秒可以吗?如果是这样,几乎可以肯定。如果您的意思是时钟周期,那么可能不是。

【讨论】:

  • 是的......我认为会是这样,所以我正在考虑使用微秒延迟。也许是这样的......两个微处理器相互发送他们的时间戳,然后执行代码(完成的代码在产生超时之前首先等待 2us)然后我认为 os 更复杂。感谢您的帮助。
【解决方案2】:

有多种方法可以做到这一点,具体取决于您希望如何定制系统,以及您需要它运行的精确程度。

尽管来回发送时间戳,但您走在正确的轨道上。像这样进行本地同步的“标准”方式是Precision Time Protocol (PTP / IEEE 1588),它可以精确到微秒,具体取决于实现(与Network Time Protocol, NTP相反,它更适合长距离同步,通常不能比毫秒范围内更好地实现同步)。

如果您的微控制器上运行带有以太网或类似功能的 Linux 系统,您可以查看PTPD。或者,如果您想自己实现某些东西,请查看 PTP(可能还有 NTP)算法并获得启发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多