使用 LPC43xx / FPU 测试的 CNC 控制 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
本内容最初由 Jerry Durand 贡献给 lpcware.com 当我发现 LPC43xx 系列中的 M4 内核可以用作硬件浮点单元 (FPU),而实际代码在 M0 内核中运行时,我立即想到了一个应用程序;用于台式铣床的独立 4 轴 CNC 控制箱。目前,这些机器几乎完全由在非常旧的 PC 硬件上运行的软件控制,该硬件具有并行端口以及 MS-DOS 或 Windows XP 作为操作系统。这些铣床的控制需要完成接收 ASCII 文本中的 g 代码命令以及大量需要 FPU 的高精度浮点运算等任务。这一切都必须快速且连续地进行,因为 4 个电机中的每一个都必须每秒更新数千次。 看起来 M0 核心在基本输入/输出 (I/O) 和计时功能方面表现出色,而使用 M4 作为 FPU 可以加快浮点运算速度。 我最初希望将整个 RS274NGC 开源增强型机器控制器 (EMC) 软件移植到 LPC4350,并在启用和不启用 FPU 的情况下运行它,比较处理示例 g 代码文件的时间。尽管 NXP 在发现问题后很快就解决了问题,但开发软件和示例设置方面的问题却导致我时间不够。相反,我修改了其中一个示例程序(GPIO_LedBlinky)以便测试性能,结果发现有一些有趣的结果,否则我可能会错过。 我以八种不同的配置运行了测试代码: 1.FPU 禁用,32 位浮点乘法 2.启用 FPU,32 位浮点乘法 3.FPU禁用,64位双乘法 4.启用 FPU,64 位双乘法 5.FPU 禁用,32 位浮点除法 6.FPU 启用,32 位浮点除法 7.FPU禁用,64位双除法 8.FPU 启用,64 位双除法 所有测试均从内部 SRAM 运行,因此外部存储器访问时间不会扭曲结果。优化级别保留为默认值零(0),因为如果我尝试更高的级别,编译器就会出现省略部分代码的问题。 测试结果(每秒循环次数平均超过 10 秒): 1. 990,550 float, * 2. 2,768,000 FPU, float, * 3.284,455 双,* 4.276,796 FPU,双倍,* 5. 282,316 float, / 6. 1,894,000 FPU, float, / 7.85,762 双, / 8.85,053 FPU,双,/ 正如预期的那样,使用 FPU 后 32 位浮点运算的运行速度要快得多,乘法速度快 2.79 倍,除法速度快 6.7 倍。我原本期望性能会更好一些,但这仍然是速度上的显著提高。 64 位浮点运算则是另一回事,对于乘法和除法来说,使用 FPU 的运算速度比不使用 FPU 的运算速度慢。这表明库函数中存在错误,因为它不应该比相等更差。我对这个结果感到非常惊讶,并希望当问题解决后,64 位操作能够得到显着改善。 总之,这些部件的低成本和使用 FPU 的简单性可以提高使用 32 位浮点运算的现有产品的性能。无需漫长的开发周期或担心破坏代码中的某些内容,因为使用 FPU 的更改包括为 FPU 添加一个小的初始化例程并在编译器选项中启用它。一旦您有时间将关键代码移植到 M4 核心上直接运行,而不是仅仅将其用作 FPU,这也为您在不进行硬件更改的情况下实现更大改进留下了选择。 对于 64 位浮点运算,如果您仅将 M4 用作 FPU,这似乎不是最佳选择。直接在 M4 上运行关键代码可能会带来显著的改进,但这需要移植代码以在两个核心上运行,而这不是我测试过的。 用户内容
記事全体を表示