您听说过 Cortex-M52、M55 和 M85 微控制器中的 Helium 指令集吗?Helium 是一种 SIMD(单指令多数据)指令集,允许在单个时钟周期内对多个数据点执行相同的指令。这对于 UI 相关任务特别有利,可以高效地填充或混合数千个像素。让我们探索不同编译器如何利用这个强大的指令集!
术语表#
让我们从一个术语表开始,以澄清一些关键术语:
- Arm:MCU(Cortex-M)和 CPU(Cortex-R 和 A)核心 IP 的提供商。Arm 不制造芯片,而是向芯片供应商出售其核心的蓝图。
- SIMD:代表单指令多数据。它是一种指令级并行形式,其中相同的指令同时在数据数组(向量)上执行。
- Helium:Arm 为配备 Cortex-M52、Cortex-M55 和 Cortex-M85 核心的微控制器设计的 SIMD 指令集。
- Arm2D:一个由 Arm 维护的库,可充分利用 Helium 指令集进行 2D 渲染。LVGL 内置了对它的支持。更多详细信息可以在这里找到。
- GCC:一个免费且成熟的 C 编译器。
- LLVM:一个灵活且现代的编译器基础设施,可以适应许多语言。
- Ac6:Arm 的专有编译器,基于 LLVM。
测试配置#
硬件#
我们在 Renesas EK-RA8D1 开发板上测试了 Helium 指令集,该开发板具有以下特性:
软件#
在基准测试期间,我们在各种配置下测试了 GCC、LLVM 和 Ac6 编译器。可以在以下链接找到用于 Renesas EK-RA8D1 的每个编译器的即用型 LVGL 项目:
LVGL 配置#
为了获得最大速度,LVGL 被配置为部分渲染模式,使用放置在 TCM 中的 64 kB 缓冲区。其他内存选项速度较慢,无法充分利用 Helium 的性能。
LV_USE_OS 被设置为 LV_OS_NONE,以消除 LVGL 渲染管道中来自 FreeRTOS 的任何开销。
我们使用 lv_demo_benchmark 来测量性能。
LVGL 进行了轻微修改,以 0.1 毫秒精度而不是 1 毫秒精度测量渲染时间。
结果#
下图显示了使用 LVGL 基准测试演示的平均渲染时间差异:

那么,结果告诉我们什么?
- GCC 不支持 Helium,因此它作为我们的基线参考。
- LLVM 17 和 LLVM 18 都支持 Helium。结果比 GCC 略快,尽管 LLVM 18 比 LLVM 17 稍慢。
- 启用 Arm2D 提供了大约 20% 的性能提升。在这种情况下,LLVM 18 比 LLVM 17 略快。
- Ac6 在禁用 Helium 支持的情况下(类似于 GCC)比 GCC 略快。
- 启用 Helium 支持的 Ac6 但没有 Arm2D 比 LLVM 17 或 18 更好地利用了 Helium。
- 结合 Arm2D 的 Ac6 实现了 26% 的性能提升。
结论#
在 480x854 屏幕上,所有配置的渲染时间约为 10 毫秒。这表明,即使没有 GPU,该微控制器上的软件渲染对于大多数用例来说也足够快。
这表明微控制器,即使是为非 UI 应用程序(例如电机控制)设计的,也可以有效地驱动具有更高分辨率和丰富图形的屏幕。要最大化微控制器的性能,您可以切换到 LLVM 并添加 Arm2D,这些都是免费提供的。对于需要更高性能的用户,Arm 的商业 Ac6 编译器是一个极好的选择。(评估版本可用。)
