多核
任务和 CPU 内核的分配显示在 任务配置 上的对象 选项卡:任务组 选项卡。
当今越来越多的控制器采用具有多个 CPU 内核的处理器。
如果 CODESYS 不使用多核功能的情况下在多核控制器上执行,然后任务的分配由操作系统的调度程序处理。只要一个应用程序是通过多个任务执行的,就会出现这种情况。在这种情况下,你对任务的分配没有直接影响。根据负载平衡的不同,任务还可以在不同的 CPU 内核上运行。
随着 CODESYS 多核功能,IEC 任务本身可以分配给专用 CPU 内核,同时考虑到已获得的 CPU 内核数量。这可以提高性能。为此,IEC 程序应分为多个任务。
有两种基本的不同策略 CODESYS 用于在 CPU 内核上分发 IEC 任务:
链接并固定到 CPU 内核的 IEC 任务:
任务总是在这个特定的 CPU 内核上执行。通过分组,可以将多个任务链接到一个 CPU 内核。例如,如果 IEC 程序尚无法同时在多个 CPU 内核上运行,这很有用。
IEC 任务在所有 CPU 内核上执行:
操作系统负责在 CPU 核心上分配一组中的一个或多个任务。
重要
当 IEC 任务分布在 CPU 内核上时,某些变化会导致 IEC 程序中的行为,必须予以考虑。
按优先级处理 IEC 任务已不再是既定的。只有当任务捆绑到一个 CPU 内核时,它们才会按优先级处理
IEC 任务中优先级最高的数据的周期一致性已不再是既定的。因此,如果在周期中值不发生变化,则必须在 IEC 任务周期开始时在本地复制数据。
对于所有任务,都有一个共享的进程映像来运行任务。这个
ReadInputs()
在每个任务开始时调用函数,WriteOutputs()
函数在最后被调用。因此,首次公开募股模式分别适用于每项任务。这些函数读取和写入共享进程映像。进程映像也是物理写入的,只有在调用总线周期任务时才传输数据包。但是,总线循环任务会等待每次调用WriteOutputs
和ReadInputs
的任务。这确保了总线周期任务中的数据一致性。只能将输出分配给一项任务。
可以将输入分配给多个任务,但应避免直接访问。必须通过原子操作将输入写入任务的局部变量。
第二项任务,使用以下内容更新流程映像
ReadInputs()
在执行第一个任务的同时,还会在第一个任务运行时更新其输入。因此,只有在优先级最高的任务的单核上才能确保任务的数据一致性。
有关更多信息,请参阅: 总线循环任务
对于一致的计数器(增量器、减量器),原子外部库函数
SysCpuAtomicAdd()
应始终使用(有关更多详细信息,请参阅SysCpuHandling.library
)。
重要
数据一致性
位访问(数据类型)
BIT
)在 IEC 程序中的多核 CPU 上不能一致(原子)处理。为此,我们建议您使用外部库函数SysCpuTestAndSetBit()
。(有关详细信息,请参阅:SysCpuHandling.library
)宽度不超过 32 位的简单数据类型 (
BOOL
,BYTE
,WORD
/INT
,DWORD
/DINT
等)在多核 CPU 上的 IEC 程序中也是一致地(以原子方式)进行处理。64 位数据类型 (
LINT, LWORD, LREAL)
仅在 64 位系统和多核系统上的 IEC 程序中一致(原子地)处理。为此,您无需采取任何预防措施。要访问复杂的数据类型 (
STRING
,FB
,STRUCT
,以及ARRAY
),你需要自己为同步/一致性做好安排。在任务配置中,在 变量用法 选项卡,您可以定义 IEC 任务中的变量是否具有读取或写入权限。
在多核系统上,可能会发生“内存重新排序效应”。有关更多信息,请参阅:IEC 操作员:
__MemoryBarrier()
。
在多个处理器内核上分配任务
要求:您的应用程序中至少定义了两个任务,例如 MainTask
(IEC-Task)和 LowTask
(IEC-任务)。
打开 任务配置 编辑器中的对象。
切换到选项卡 任务组.
概述显示了默认值 IEC 任务 任务组。
点击 添加群组 添加新任务组。
这个
NewGroup
群组已添加。双击群组名称
NewGroup
并将其更改为LowGroup
。在 核心,选择一项任务(示例 1)。
打开任务
LowTask
(IEC-Task)在编辑器中。在 任务组,选择新组
LowGroup
。这个
LowTask
任务现在由处理器核心 1 处理,因为它的组成员是LowGroup
。
在跟踪中显示每个处理器内核的处理器负载
在 CODESYS,你可以在可视化中显示处理器负载情况 设备跟踪 对象。
有关如何在项目中显示设备跟踪的更多信息,请参阅: 访问控制器的所有痕迹