1、简介
ARM-2D 是 Arm 公司推出的一款专为嵌入式系统优化的 2D 图形加速库,旨在提高微控制器(MCU)和嵌入式处理器的 2D 图形处理性能。它提供了一套轻量级、高效的 API,可用于 UI 渲染、图像操作和动画加速,特别适用于资源受限的嵌入式设备,如智能手表、工业显示屏和车载仪表盘等。
ARM-2D 主要特点高效的 2D 渲染:
提供硬件加速的 2D 图形操作,如填充、旋转、缩放和混合等。
支持 Alpha 混合(透明度)、颜色转换、像素格式转换等。
轻量级 & 低资源占用:
代码体积小,适用于 RAM/ROM 资源受限的设备。
可与裸机(bare-metal)系统或 RTOS(如 FreeRTOS)配合使用。
硬件无关:
适用于各种 Cortex-M 处理器,如 Cortex-M0、M3、M4、M7、M33、M55 等。
即使没有专用 GPU,也可以利用 ARM CPU 的 SIMD 指令(如 MVE、Helium)进行加速。
易于集成:
提供标准化 API,兼容不同的嵌入式 GUI 框架(如 LVGL)。
支持 DMA、缓存优化等特性,提升图形处理效率。
可见,ARM-2D基本支持在所有的Cortex-M处理器上运行,即便是最入门级的M0处理器。ARM-2D是图形加速渲染库,不是一个专门用于GUI设计的,但它仍然提供有基本的GUI设计选项(对用户是真爱啊,点赞o( ̄▽ ̄))。它的巨大作用在于将能够统一LCD屏幕的驱动接口,为不同类型的处理器之间移植GUI应用提供便捷。同时提供软硬件渲染加速,在没有图形硬件加速外设的情况下,依旧能够提供优异的软件加速效果。
2、ARM-2D移植
以开发板STM32H7S78-DK为例,IDE工具为MDK Keil,介绍ARM-2D的移植过程。
STM32H7S78-DK板载的屏幕接口为RGB并口,内部不含GRAM,因此需要使用到外部RAM。这篇文章介绍了这款屏幕的驱动过程,完成LTDC驱动后,就能够直接向屏幕写入图像数据了
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕-电子产品世界论坛
将LTDC驱动色彩模式为RGB565
定义显存地址,屏幕尺寸为800*480
#define GLCD_WIDTH 800 #define GLCD_HEIGHT 480 #define LCD_DB_ADDR 0x90000000 #define LCD_DB_PTR ((volatile uint16_t *)LCD_DB_ADDR)
打开Keil的RTE配置窗口,勾选以下的ARM-2D库相关选项
如果提示缺少其他组件,则勾选左下角的Resolve,自动完成缺少组件的勾选
展开Acceleration,滑动至底部找到以下两个配置文件
arm_2d_cfg.h文件参数设置,支持由代码编辑转为面板编辑模式
arm_2d屏幕适配器文件设置,如果仅做简单移植只需关注方框内的参数设置即可,屏幕宽度、高度设置,PFB是屏幕缓存块大小设置,缓存块越大意味着屏幕刷新率会有所提升,但RAM占有量会提高,如果编译提示内存不足可以尝试减小PFB大小。
main.c文件添加头文件
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "string.h" #include "arm_2d_helper.h" /* USER CODE END Includes */
此时编译工程,会报错缺少Disp0_DrawBitmap函数的定义,这个函数声明来自arm-2d库,需要用户手动实现它的定义
int32_t Disp0_DrawBitmap (uint32_t x, uint32_t y, uint32_t width, uint32_t height, const uint8_t *bitmap) { volatile uint16_t *phwDes = LCD_DB_PTR + y * GLCD_WIDTH + x;//RGB屏幕显存基地址+坐标偏移 const uint16_t *phwSrc = (const uint16_t *)bitmap; for (int_fast16_t i = 0; i < height; i++) { memcpy ((uint16_t *)phwDes, phwSrc, width * 2); //逐行显示 phwSrc += width; phwDes += GLCD_WIDTH; } return 0; }
LTDC初始化、运行arm-2d自带Demo
/* USER CODE BEGIN 2 */ HAL_LTDC_SetAddress(&hltdc,(uint32_t)LCD_DB_ADDR,0);//将LCD显存地址更改为LCD_DB_ADDR HAL_LTDC_Reload(&hltdc,LTDC_RELOAD_IMMEDIATE); //重新加载LCD数据 arm_irq_safe { arm_2d_init(); //初始化arm-2d(安全模式) } disp_adapter0_init(); //初始化屏幕适配器 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ disp_adapter0_task(); //运行arm_2d显示应用 } /* USER CODE END 3 */
3、实验结果
默认的Demo如下图所示,同时显示当前帧率、Cpu占用、lcd刷新
这款开发板主控支持I/D Cache加速,在程序中开启
/* USER CODE BEGIN 1 */ SCB_EnableICache(); //Enable ICache SCB_EnableDCache(); //Enable DCache /* USER CODE END 1 */
刷新速率改善显著,尝试增大PFB大小
更改PFB大小,高度PFB由48改为240
帧率大幅提高,并且cpu占有率由50%降至37%
4、arm-2d性能评测应用
arm-2d内置了两个性能评测应用,用于评估当前主控芯片的GUI渲染性能,勾选第一个评测应用
main.c文件修改,导入评测应用头文件
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "string.h" #include "arm_2d_helper.h" #include "arm_2d_disp_adapters.h" #include "arm_2d_scenes.h" #include "arm_2d_benchmark.h" /* USER CODE END Includes */
运行性能评测应用
/* USER CODE BEGIN 2 */ HAL_LTDC_SetAddress(&hltdc,(uint32_t)LCD_DB_ADDR,0);//将LCD显存地址更改为LCD_DB_ADDR HAL_LTDC_Reload(&hltdc,LTDC_RELOAD_IMMEDIATE); //重新加载LCD数据 arm_irq_safe { arm_2d_init(); //初始化arm-2d(安全模式) } disp_adapter0_init(); //初始化屏幕适配器 arm_2d_run_benchmark(); //开启性能评测 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ disp_adapter0_task(); //运行arm_2d显示应用 } /* USER CODE END 3 */
实验效果,当前动画demo的刷新率为42fps