本篇文章,属于学习性质,一边学习,一边记录所得。主要参考arm-2d的github官方仓库:ARM-software/Arm-2D: 2D Graphic Library optimized for Cortex-M processors (github.com)
分支 | 描述 | 注意 |
---|---|---|
main | 主仓库,包含arm-2d库,示例,模板和一个helper库 | |
developing | 开发分支 | 将合入main仓库 |
Arm-2D 库提供主要用于深度嵌入式显示系统的低级2D 图像处理服务。支持的功能包括但不限于:
支持加速LVGL8.3及以上
需要CMSIS-Pack的支持
支持Alpha-Blending / Alpha-Masking
支持图形复制拼接
支持各种色彩格式
支持区域窗口裁剪
支持部分帧缓冲PFB,这对上层GUI软件是透明的,且对目标屏幕分辨率没有限制,对PFB的大小和形状没有限制(可以是直线或者长方形),支持脏区域dirty regions,支持RGB16像素交换高低字节,支持内置的框架缓冲池各种缓冲模式
支持变形,旋转缩放,支持不透明度
随着越来越多的智能物联网边缘设备被引入到我们的日常生活中,那些习惯了智能手机一样的图形用户界面(GUI)的人们想要拥有类似的现代化用户体验,即使是在使用基于微控制器的产品时也是如此。Arm 的生态合作伙伴长期以来一直观察和理解这一趋势。
因此,许多硬件厂商将专用的硬件加速器引入到他们的微控制器产品中,以帮助进行2D 图像处理。与此同时,GUI 服务提供商还更新了他们的产品线,以针对基于微控制器的 GUI 应用程序。许多开源嵌入式 GUI 栈在 GitHub 上很流行,例如 LVGL。
事实上,在微控制器中使用 GUI 并不是什么新鲜事。然而,直到最近物联网和人工智能的兴起,人们才发现简单单调的图形用户界面真的让人无法忍受。追求类似于智能手机的用户体验已经成为产品的基本要求。
另一方面,看似复杂的 GUI 通常是通过简单的2D 图像复制和平铺来实现的。即使是半透明效果对于运行频率通常在几十或几百 MHz 的微控制器来说也并非负担不起。
用于2D 图形的技术早在8位游戏控制台时代就已经成熟。既然8位6502可以实现奇特的图形效果,为什么当今最先进的 Cortex-M 处理器不能呢?
如图2-1所示,基于 Linux 的系统有一个完整的生态系统,提供 GPU 驱动程序和 GUI 软件服务。相比之下,资源受限的嵌入式系统就没有这样的奢侈品了。为了增强单片机生态系统,引入了 ARM-2D。
图GUI 中富嵌入式系统与约束嵌入式系统的生态系统比较
当我们看传统的嵌入式 GUI 架构(如图2-2所示) ,有四个层:
应用程序和设计器层
GUI 软件服务层
渲染层
硬件驱动层
Arm-2D 侧重于加速低级别的2D 图像处理,并且不会触及 GUI 软件栈的上层,因此避免在同一个生态系统中与 GUI 服务提供商竞争。
事实上,由于 ARM 已经提出了一个低水平二维图像处理的抽象层,提供硬件加速器的芯片制造商和提供图形用户界面服务的软件供应商之间可以迅速建立一个完整的生态级别的合作。
每个人都可以专注于扩大自己的价值观。例如,通过为其专有的2D 加速器添加 arm-2D 适配器驱动程序,硅厂商可以获得来自 GUI 供应商的广泛支持,这些供应商在 ARM-2D API 上构建/移植他们的 GUI 堆栈。
这个库的目标客户是所有的 Cortex-M 处理器,不管有或没有各种硬件2D 图像加速器。
库的设计考虑到了 ACI (arm自定义指令)。用户自定义指令实现的加速可以很容易地集成到库中,而无需修改现有的 Arm-2D 库或上层软件。
该库的设计考虑到了二维图像加速器,并遵循特征不可知原则。支持加速器可以很容易地添加,而不需要修改现有的 Arm-2D 库或上层软件。
库的设计考虑到了资源的限制。对于使用4K ~ 32K SRAM 的 Cortex-M 处理器来说,它不能支持全帧缓冲,Arm-2D 引入了一个称为通用部分帧缓冲的功能,使得现有的 MCU 能够通过实践时空交换方案来运行 GUI 应用,同时仍然享受不错的帧速率。
arm-2d依赖CMSIS5.7.0以及上版本,如果您想使用ARM-2D&&Cotex-M55,那么CMSIS5.8.0则是必需的。
arm-2d开发遵循C11标准,并且一年GCC扩展
arm-2d支持Arm Compiler 5, Arm Compiler 6
projects | 描述 | 文件夹 | 注意 |
---|---|---|---|
benchmark | 这个例子演示了 Arm-2D 提供的几乎所有特性。通过设置不同的 PFB 尺寸,您可以评估目标系统的二维图像处理能力 | examples/benchmark | 可以作为跑分示例 |
watch_panel 手表面板 | 这是一个专门的,智能手表般的面板例子。一个指针和两个齿轮以不同的角速度在半透明的手表面板上旋转,背景是动态的 | examples/watch_panel | |
[template][bare-metal][pfb] | 一个裸机项目模板 | 项目模板 | |
[template][cmsis-rtos2][pfb] | 它是 RTOS 环境的一个项目模板,以 CMSIS-RTO2为例说明了 Arm-2D 如何与 RTOS 一起工作 | 项目模板 |
微控制器没有可用的公共2D 图像处理跑分程序。为了促进arm-2d的发展和优化,我们通过以下方法克服了这个问题:
选择嵌入式 GUI 中广泛使用的算法作为跑分测试的主体:Alpha-blending、Colour-Keying、Blit、Tiling、Rotation、Mirroring、Masking
模拟具有足够复杂性的典型应用程序场景
选择一个在 RGB565上典型的低成本液晶分辨率320 * 240
让这些层以不同的角度和速度浮动,以覆盖足够多的条件
记录用于混合一帧的循环计数并运行1000次迭代(帧)
图2-5某些 Cortex-M 处理器的性能比较
文件夹和文件 | 类型 | 描述 |
---|---|---|
Library | 文件夹 | 此文件夹包含arm-2d库的源文件和头文件 |
Helper | 文件夹 | 此文件夹包含 helper 函数/服务的源文件和头文件 |
documentation | 文件夹 | 此文件夹包含所有文档 |
examples | 文件夹 | 此文件夹包含所有示例代码/项目 |
README | md文档 | 说明文档 |
how_to_deploy_the_arm_2d_library | md文档 | 一步一步的指导,帮助您将 Arm-2D 库部署到项目中 |
LICENSE | 许可证 | Apache 2.0许可证 |
tools | 文件夹 | 此文件夹包含一些使用库的有用实用程序。例如img2c.py是一个python脚本,用于将指定图片转换为平铺数据结构。 |
我是arm-2d的使用者,我只关心如何使用arm-2d
对于arm-2d的使用者,有用的信息,例如:类型定义、宏、函数的原型等,存储在头文件中。我们将这些头文件称为公共头文件。请使用在公共头文件中定义的 API、宏和类型。
任何符号,例如文件名、函数名、宏名、类型名等,如果有一个双下横线作为前缀,都被认为是库的 PRIVATE。你应该省点时间不要碰它们。
该库的设计理念是,用户可以自由地使用公共头文件中的任何内容,不应触及任何隐式或显式标记为私有的内容。
不管您使用哪种处理器,在编译期间,所有 C 源文件都可以安全地添加到编译中(为了简单起见,我们强烈建议您这样做)。例如,当你使用 Cortex-M4,它不支持 Helium 扩展(由 Armv8.1-M 架构引入,由 Cortex-M55处理器首先实现) ,在编译过程中包含 arm _ 2d _ Helium.c 是可以的,因为 C 源文件是在预处理阶段通过环境检测构建的。
在您的应用程序中,include arm_2d.h
就足以为您准备好所有的服务和 API。在使用任何服务之前,请确保通过调用 arm_2d_init ()
初始化该库。
我对arm-2d仓库代码感兴趣,想成为arm-2d开发者
我们很抱歉,在目前阶段(正如你所看到的,这是早期阶段) ,没有足够的指导或文件来说明:
arm-2d是如何实现的
如何贡献代码
如何添加新特性
代码背后的设计原则是什么
详细的设计结构是什么
一些设计方面的考虑:
arm-2d支持ac5/6,gcc,llvm编译器
arm-2d支持所有的Cortex-M处理器,Cortex-M0/M0+/M1/M3/M4/M7/M23/M33/Star-MC1/M35P/M55/M85。
arm-2d设计了一些OOPC,采用 ANSI-C 面向对象程序设计方法,底线是,在这个库中采用的任何方法和技巧都应该没有或只有很少的成本。
arm-2d使用了扩展替换修改原则,关键字 __WEAK
和 __OVERRIDE_WEAK
是为缺省函数和扩展引入的; 它类似于 C # 中的“虚函数”和“覆盖函数”的概念。
arm_2d_async.c
支持异步模式。arm_2d_helium.c
用于覆盖某些默认的软件算法实现。将来将以同样的方式添加对硬件加速器的支持。覆写在arm_2d_op_table.c
中定义的def_low_lv_io()
宏定义的目标低级IO,以添加自己版本的算法和硬件加速。例如,如果你想使用2D硬件加速器为RGB565添加alpha混合支持,应该执行以下步骤:
在源代码中,覆写__ARM_2D_IO_ALPHA_BLENDING_RGB565
的定义。
//! PLEASE add following three lines in your hardware adapter source code
#define __ARM_2D_IMPL__
#include "arm_2d.h"
#include "__arm_2d_impl.h"
...
__OVERRIDE_WEAK
def_low_lv_io(__ARM_2D_IO_ALPHA_BLENDING_RGB565,
__arm_2d_rgb565_sw_alpha_blending,
__arm_2d_rgb565_my_hw_alpha_blending);
将__arm_2d_rgb565_sw_alpha_blending()
的函数体复制到源代码中,作为硬件适配器的模板,并将其重命名为__arm_2d_rgb565_my_hw_alpha_blending()
。
修改__arm_2d_rgb565_my_hw_alpha_blending()
以使用自己的硬件加速器。
根据传递给2D加速器的函数和性能的参数,你可以:
返回ARM_2D_ERR_NOT_SUPPORT
,如果硬件无法完成所要求
返回arm_fsm_rt_cpl
,如果任务立即完成,不需要等待
返回arm_fsm_rt_async
,如果任务是异步完成,然后通过调用函数向arm-2D报告__arm_2d_notify_sub_task_cpl()
注意:ARM-2D流水线将不断向你的硬件适配器发出任务(一个__arm_2d_sub_task_t
对象),请快速检查硬件能否能够完成这项工作,然后以先入先出的方式将需要保留的任务添加到列表中,之后,硬件加速器可以获取一个接一个的任务。
接口注意:
typedef struct __arm_2d_sub_task_t __arm_2d_sub_task_t;
typedef arm_fsm_rt_t __arm_2d_io_func_t(__arm_2d_sub_task_t *ptTask);
typedef struct __arm_2d_low_level_io_t {
__arm_2d_io_func_t *SW;
__arm_2d_io_func_t *HW;
} __arm_2d_low_level_io_t;
...
/*----------------------------------------------------------------------------*
* Low Level IO Interfaces *
*----------------------------------------------------------------------------*/
__WEAK
def_low_lv_io(__ARM_2D_IO_COPY_RGB16, __arm_2d_rgb16_sw_tile_copy);
__WEAK
def_low_lv_io(__ARM_2D_IO_COPY_RGB32, __arm_2d_rgb32_sw_tile_copy);
__WEAK
def_low_lv_io(__ARM_2D_IO_FILL_RGB16, __arm_2d_rgb16_sw_tile_fill);
__WEAK
def_low_lv_io(__ARM_2D_IO_FILL_RGB32, __arm_2d_rgb32_sw_tile_fill);
...
文件名 | 文件描述 | 位置 |
---|---|---|
README.md | 正是本文档,它提供了arm-2d库基本的信息和指导 | |
how_to_deploy_the_arm_2d_library.md | 帮助你将arm-2d库部署到现有项目或者新项目的指南 | |
introduction.md | 对arm-2d库进行了比较详细的介绍,包括基本概念、编程模式等 | |
how_to_use_tile_operations.md | 详细地讲述了arm-2d库中提供的专门用于基本贴图操作的APIs | |
how_to_use_alpha_blending_operations.md | 详细地阐述了arm-2d库提供的专门用于alpha混合服务的APIs | |
how_to_use_conversion_operations.md | 详细地阐述了arm-2d库提供的专门用于色彩空间转换的APIs | |
how_to_use_drawing_operations.md | 详细地阐述了arm-2d库提供的基本画点和填色服务的APIs |
arm-2d原则上专注于Cortex-M处理器
arm-2d支持以下编译器:ac5/6、gcc、llvm、iar
arm-2d聚焦于低等级像素处理加速,原则上该库不会提供内容创建相关APIs,例如:绘图形状、文本显示等,但是提供简单的点绘图和彩色填充APIs
arm-2d原则上不提供创建GUI所必需的数据结构或相关算法,例如:元素树、GUI消息处理和树遍历算法
GCC 对 Cortex-M55(helium加速)的支持已经中断(等待工具链更新)
通用的抗混叠算法尚未引入,但是支持变换中的抗混叠(即旋转和缩放)
该库目前只提供默认的软件算法和helium加速库
虽然已经计划,但目前还没有实现加速器支持;ACI(arm自定义指令)加速解决方案现在还不是开源的,详情请联系当地的 FAE
提供的示例项目仅运行在MPS2,MPS3,FVP和一些第三方发展平台,例如STM32F746G-Discovery和Raspberry Pi Pico
示例项目基于 MDK (Cortex-M 处理器最流行的开发环境之一)
正如一开始提到的,本项目的目的是探索和演示使用低成本和资源有限的微控制器提供类似智能手机的现代 GUI 的可能性。我们希望 arm-2d 能够激发更多类似的举措和工程实践。因此,您的反馈和想法对我们来说是宝贵的。
如果你可以花一些时间去体验arm-2d,请随意留下你的想法。最好包含以下信息:
您希望引入使用 Cortex-M 处理器的 GUI 的目标应用程序和/或行业部分
平台的资源,如 RAM 的大小、 ROM、系统频率、平均功耗等
液晶显示器的分辨率和目标帧速率(FPS)
你认为最有用但缺失的算法
是否包含用于2D 图像处理的 HW 加速器?2D加速器的特点是什么?