排查因运行实时应用程序导致的 CPU 负载过高问题
在执行实时应用程序时,某些问题会导致 CPU 过载。
问题含义
CPU 过载表明,CPU 无法在重启以处理下一个时间步之前完成当前时间步的处理。
当发生此错误时,Simulink Real-Time RTOS 会中止模型执行,而 Target 对象的属性 TargetStatus 会显示错误,例如:
mCPUOverload: Sub-rate exception: Overload limit (0) exceeded in 0.02s rate with 1 overloads
如果允许过载,建模执行将持续进行,直到达到允许的过载限制。如果模型在 CPU 过载后继续运行,则该时间步长将持续到执行完成所需的时间为止。这种行为会导致下一个时间步延迟。
建模或 Speedgoat® 占用了过多的计算机资源,导致 CPU 过载。可能的原因包括:
目标计算机运行速度太慢,或者建模采样时间过短。
该模型过于复杂(算法复杂度)。
I/O 延迟,即每个使用的 I/O 通道都会给系统引入延迟。I/O 延迟可能会导致执行时间超过建模时间步长。
要查询 Speedgoat 开发板的延迟值,请访问 www.speedgoat.com 并选择 Products & Services > Services。
尝试此解决方法
当 Simulink® Real-Time™ 实时操作系统 (RTOS) 遇到 CPU 过载时,通常会暂停模型的执行。您可以配置 Simulink Real-Time 模型,使其允许 CPU 过载。利用此功能来支持长时间的初始化操作,并用于过载诊断。您还可以通过提升应用程序性能并启用 Compile with GCC -ffast-math 选项来尝试减轻过载。
允许较长的初始化时间
对于某些实时应用程序,常规初始化过程可能会持续到第一个采样时间之后。使用 SLRT Overload Options 模块来增加启动时忽略过载的时间步数。默认情况下,只有第一个时间步会忽略重载。
注意
如果让目标计算机的 CPU 过载,可能会导致结果不正确,特别是对于多速率建模模型而言。SLRT Overload Options 模块仅用于诊断。诊断完成后,请关闭这些选项。
启用使用 GCC -ffast-math 选项进行编译
Compile with GCC -ffast-math 选项可在编译实时应用程序代码时启用 GCC 编译器的 -ffast-math 选项。此选项在 Simulink Real-Time 型号中默认处于禁用状态。
通过启用 Compile with GCC -ffast-math 选项,您将赋予编译器更大的灵活性来优化浮点运算,但代价是偏离 IEEE-754 浮点标准。
有关 -ffast-math 选项的更多信息,请参阅 GCC 中浮点运算的语义和 gcc.gnu.org/wiki/FloatingPointMath/。
强制轮询模式
Force polling mode 选项可启用轮询模式(而非中断驱动模式)来为实时应用程序提供时钟信号。在以下情况下,启用此选项有助于减轻 CPU 负载:
目标计算机至少有 4 个 CPU 内核。
CPU 过载是由零星出现的 TET 尖峰引起的。