README {#mainpage}
概述
Arm-2D是一个面向Cortex-M处理器的2.5D图像处理开源项目。
- 目标市场: IoT终端设备、白色家电、手持设备和可穿戴设备,尤其是对资源受限和低功耗有要求的设备。
- 主要关注点: 图形用户界面
Arm-2D包含:
- 用于图形处理的通用软件像素管线基础设施
- 用于添加新算法和颜色格式的一组规则
- 默认软件实现和当Helium技术可用时的SIMD加速。
- 以"不依赖功能"的方式支持添加第三方硬件加速器。
- 便于使用的CMSIS-Pack
- 示例和文档
在生态系统中的定位:
- 专注于底层并作为硬件抽象层用于2.5D图像处理
- Arm-2D不是GUI
- 没有内容创作、复杂图形绘制或可缩放矢量图形(SVG)支持
- 为Arm生态合作伙伴提供便利来创造差异化
- 提供常用2.5D操作的默认实现,并使第三方能够加速应用程序特定的算法
当前重点和目标:
- 帮助产业合作伙伴采用技术
- 集成Arm-2D到图形堆栈的指导
- 针对超小内存占用进行优化
- 使现有的Cortex-M处理器能够使用现代化的GUI而无需或几乎不需要成本增加。
- 帮助客户降低成本
给你的关键信息
- Arm-2D始终保持轻量级
- Arm-2D保持超低的内存占用,包括ROM和RAM
- Arm-2D使用通常可用的链接器功能尽可能删除未使用的功能和数据
- 只有实际使用的函数才会占用内存
- 请尽可能使用特定功能的API
- 例如,如果您想将rgb565图像复制到带有源掩码的目标块而没有任何镜像,请调用
arm_2dp_rgb565_copy_with_src_mask_only()
而不是通用的arm_2dp_rgb565_copy_with_src_mask()
,后者将镜像模式作为参数并保留所有可能的镜像模式的低级实现。
- 例如,如果您想将rgb565图像复制到带有源掩码的目标块而没有任何镜像,请调用
- Arm-2D始终保持扁平和简单的框架,即API包装器、前端和后端。
- API包装器接受用户输入并为后续阶段生成任务描述符。
- 前端负责常用和必要的服务,
- 例如,区域计算、区域裁剪、预镜像等。因此后端将接收简单、验证和详细的任务,这对硬件加速器更友好。
- 前端很小。
- 后端是特定2D处理算法的低级实现之地。
- 如果将它们从arm-2d中取出,这些算法通常是不可用的,因为数据在前端得到验证,任务也在前端简化。
- 链接器将删除未使用的低级实现。
- Arm-2D始终保持向后兼容性
- 即使较旧的API被标记为废弃,它们在较新版本中仍可使用
- Arm-2D适用于所有Cortex-M处理器
如何开始
Arm-2D的潜在用户可能有不同的背景和目的。无论您是来自硅片供应商的应用程序工程师、GUI堆栈的系统工程师,还是应用程序开发人员,根据使用Arm-2D的目的,有两种方法可以开始:
-
在某些资源受限的系统中,Flash(ROM)和SRAM有限(例如64K Flash,12K SRAM),或者留给GUI应用程序的内存空间有限,因此这样的系统无法承担一个体面的GUI堆栈的成本。 同时,这种低成本的系统通常不会有复杂的图形用户界面,因此应用程序开发人员可以直接使用arm-2d API来绘制面板和场景。
-
来自硅片供应商的应用程序工程师经常需要为专有的硬件加速器编写驱动程序。来自GUI软件供应商的系统工程师可能希望使用Arm-2D提供的API来加速底层操作。专注于嵌入式视频处理的工程师可能会尝试使用Arm-2D API来处理从摄像头捕获的帧缓冲区。来自开源社区的人可能会发现一些有趣的东西去贡献。 上述所有开发人员都被视为专业用户。
目录
功能
本版本(ver1.1.6)
Arm-2D库主要提供用于深度嵌入式显示系统的低级2D图像处理服务。支持的功能包括但不限于:
-
提供CMSIS-Pack。
-
Alpha混合 / 蒙版
- 带或不带颜色键
- 使用蒙版和可选的不透明度进行填充颜色
- 用于以指定颜色绘制抗锯齿图标/文本
- 支持A2、A4和A8蒙版
- [新增] 支持水平和垂直线蒙版
-
图像复制(平铺)
- 带或不带颜色键
- 支持四种镜像模式:无镜像、X镜像、Y镜像和XY镜像
- 支持在源端和/或目标端使用蒙版
- [新增] 提供接受不透明度作为参数的API变体。
- [新增] 支持ARGB8888(ccca8888)的隐式颜色转换
-
支持的颜色格式
- GRAY8(8位灰度)、RGB565和RGB888
- 通用C8BIT(8位色)、RGB16和RGB32
- 在GRAY8、RGB565和RGB888之间进行颜色格式转换
- [新增] 支持ARGB8888(ccca8888)的隐式颜色转换
- 为单色LCD(1位色)和电子墨水显示器(2位和4位色格式)做好准备
- 使用Gray8作为内部处理格式,并在显示适配器内部(如
Disp0_DrawBitmap
)转换为目标色彩格式
- 使用Gray8作为内部处理格式,并在显示适配器内部(如
-
用于连接LCD的显示适配器服务
-
通用部分帧缓冲区(PFB)
- 易于使用:对应用程序透明
- 屏幕分辨率无限制 (见注1)
- PFB大小和形状灵活(可以是一行或任意大小的矩形) (见注2)
- 支持宽度和高度的PFB对齐。
注:
-
只要大小小于32767 * 32767。
-
只要总像素数小于16M个。
-
支持脏区域以仅刷新指定区域
- 提供用于脏区域的调试模式
- 提供脏区域优化,以减少刷新重叠区域的机会。
- [新增] 提供脏区域辅助服务以便于使用。
-
支持交换RGB16像素的高低字节
-
提供一个场景播放器,具有各种场景切换模式(渐入渐出、滑动、擦除等)
-
支持具有内置帧缓冲区池的各种缓冲区模式。
- 单缓冲/双缓冲
- 提供直接模式的辅助服务
- 提供异步刷新(即DMA + ISR)的辅助服务
-
-
变换(即旋转和缩放)
- 带/不带色键
- 支持可选的不透明度比例
- 支持抗锯齿。
- 您可以通过在编译时将宏
__ARM_2D_HAS_ANTI_ALIAS_TRANSFORM__
定义为1
来启用它。
- 您可以通过在编译时将宏
- 支持源掩码
-
统一和用户友好的程序员模型
- API可以以同步方式( 经典阻塞代码 )和/或异步方式( 事件驱动 )使用
- 支持裸机和RTOS环境
- 超小内存占用
-
辅助服务、工具和其他
-
定时器服务
- 超时:
arm_2d_helper_is_time_out
- 基于时间的函数:
- 线性:
arm_2d_helper_time_liner_slider
- 余弦:
arm_2d_helper_time_cos_slider
- S曲线:
arm_2d_helper_time_half_cos_slider
- 线性:
- 超时:
-
虚拟资源
- 支持从外部内存(未映射到Cortex-M内存空间)按需加载资源。
-
布局助手
-
对齐,如
arm_2d_align_centre
、arm_2d_align_bottom_right
等。 -
停靠,如
arm_2d_dock_top
、arm_2d_dock_right
、arm_2d_dock_vertical
、__item_line_dock_horizontal
等。 -
行布局,如
__item_line_horizontal
和__item_line_vertical
-
流布局(带换行),如
__item_horizontal
和__item_vertical
这是一个从英语翻译到中文的文本:
-
-
-
[new] 专用的布局调试模式
-
CMSIS-RTOS2和RT-Thread的RTOS辅助服务
-
模板
- 为用户控件和场景提供模板。
- 仪表、手表和健身追踪器的场景模板
- 提供添加新RTOS支持的模板。
-
其他辅助服务
- 专用的变换操作辅助服务
- 提供动态脏区域跟踪
- 双缓冲角度和比例更新
- 专用的变换操作辅助服务
-
工具
- 一个
img2c.py
从用户指定的图像生成arm-2d资源 - 一个
ttf2c.py
从用户指定的TrueType字体生成用户自定义的A1、A2、A4和A8字体 - [new] 一个
jinja2c.py
用于代码生成。
- 一个
-
演示
- 各种场景的演示
- [new] 一个专门用于Helium-ACI加速的演示。
-
准备和欢迎第三方采用
- 成功案例: 当Helium就绪时加速LVGL作为软GPU
实验性特性
- [new] 通用抗锯齿
- [new] 快速IIR模糊
未来计划的新特性
- 拉伸和透视变换
- 支持DMAC-350
1 简介
1.1 背景
随着更多智能物联网边缘设备进入我们的日常生活,习惯了智能手机般图形用户界面(GUI)的人们希望在使用基于微控制器的产品时也能有类似的现代用户体验。这一趋势已经被Arm的生态伙伴们长期观察和理解。
因此,许多芯片供应商在他们的微控制器产品中引入了专门的硬件加速器来帮助2D图像处理。与此同时,GUI服务提供商也更新了他们的产品线,以针对基于微控制器的GUI应用程序。许多开源嵌入式GUI栈在GitHub上很火爆,如LVGL。
事实上,使用微控制器的GUI并不是什么新鲜事。不过,直到物联网和AI最近的兴起,人们发现简单单调的GUI确实让人难以忍受。追求与智能手机相似的用户体验已经成为产品的基本要求。
另一方面,看似复杂的GUI通常只需要简单的2D图像复制和拼贴就可以实现。即使是半透明效果对于那些通常以数十或数百兆赫的频率运行的微控制器来说也并非难事。
2D图形技术早在8位游戏机时代就已经很成熟了。既然8位6502处理器就能实现花哨的图形效果,那为什么当今最先进的Cortex-M处理器就不能做到呢?
1.2 当前解决方案的问题
如图1-2所示,基于Linux的系统拥有完整的生态系统,提供GPU驱动和GUI软件服务。相比之下,资源受限的嵌入式系统并没有这样的奢侈。为了增强MCU生态系统,引入了Arm-2D。
图1-2 富裕嵌入式系统和受限嵌入式系统在GUI方面的生态系统对比
当我们观察传统嵌入式GUI架构(如图1-3所示)时,可以看到四个层次:1)应用程序和设计师层,2)GUI软件服务层,3)渲染层,和4)硬件驱动层。
Arm-2D专注于加速低层次的2D图像处理,不会触及GUI软件栈的上层,因此避免了与同一生态系统中的GUI服务提供商竞争。事实上,由于Arm提出了一个低层次2D图像处理的抽象层,一个全新的生态合作层级可以快速建立,芯片制造商提供硬件加速器,软件提供商提供GUI服务。每个人都可以集中精力发挥自己的价值。例如,通过为他们的专有2D加速器添加arm-2d适配器驱动,芯片厂商可以获得GUI提供商构建/移植其GUI栈在Arm-2D API之上的广泛支持。
图1-3 典型嵌入式GUI系统的层次结构
2 平台和依赖
2.1 处理器和硬件
该库针对所有带有/不带各种2D图像加速器的Cortex-M处理器:
- Armv6-M处理器: Cortex-M0/M0+/M1/SC000
- Armv7-M处理器: Cortex-M3/M4/M7/SC300
- Armv8-M处理器: Cortex-M23/M33/Star-MC1/M35P
- Armv8.1-M处理器: Cortex-M55/M85
**该库是以ACI (Arm Custom Instructions)为设计目标的。**使用用户定义指令实现的加速可以轻松集成到库中,而无需修改现有的Arm-2D库或上层软件。
**该库是以2D图像加速器为设计目标的,遵循功能无关的原则。**可以轻松添加对加速器的支持,而无需修改现有的Arm-2D库或上层软件。
该库是以资源受限为设计目标的。对于SRAM只有8K~32K的Cortex-M处理器无法容纳完整的帧缓冲区,Arm-2D引入了一种称为通用部分帧缓冲区的功能,使这些现有的MCU也能以不错的帧率运行GUI应用程序。
2.2 依赖
- 该库依赖于CMSIS 5.7.0及以上版本(如果您想将Arm-2D与Cortex-M55一起使用,需要CMSIS 5.8.0)。
- 该库使用C11标准开发,并依赖于一些广泛采用的GCC扩展。
- 详见第3.2节。
- 该库支持Arm Compiler 6、GCC、LLVM和IAR
- 详见第5节。
3 示例、基准测试和模板
3.1 总结
项目 | 描述 | 文件夹 | 备注 |
---|---|---|---|
[template][bare-metal] | 裸机环境的项目模板。 | examples/[template][bare-metal] | |
[template][cmsis-rtos2] | RTOS环境的项目模板,以CMSIS-RTOS2为例展示Arm-2D如何与RTOS协作。 | examples/[template][cmsis-rtos2] | |
[template][pc][vscode] | 使用VS Code + SDL2的PC (即MacOS、Windows和Linux)项目模板 | examples/[template][pc][vscode] | |
[template][csolution] | csolution项目模板。 | examples/[template][csolution] |
3.2 基准测试
目前没有针对微控制器的公开2D图像处理基准测试。为了促进库的开发和优化,我们采用了以下方法:
- 选择嵌入式GUI中广泛使用的算法作为基准测试的主体
- Alpha-混合
- 色键
- 位图拷贝
- 平铺
- 变换
- 镜像
- 遮罩
- 模拟一个具有足够复杂度的典型应用场景
- 带有纹理平铺的背景(每4秒切换一次镜像模式)
- 前景图片
- 两个用于alpha-混合和带有色键的平铺的构造图层
- 移动图标
- 旋转忙碌指示器
- 选择一个典型的低成本LCD分辨率320*240, RGB565
- 让这些图层以不同的角度和速度浮动,覆盖足够多的条件。
- 记录合成一帧所使用的周期数,并运行1000次迭代(帧)。
图1-4 在仿真中运行通用基准测试的快照
-
使用1000次迭代的平均周期数作为基准测试分数。
- 基于此,对于典型的嵌入式应用程序需求,我们导出了一个更有意义的指标,称为30帧所需的最小频率(MHz),如图1-5所示。
图1-5 几种Cortex-M处理器性能对比
4 局限性
4.1 通用局限性
- 该库重点针对Cortex-M处理器。
- 该库支持以下编译器:
- Arm Compiler 5 (已弃用)
- Arm Compiler 6
- GCC
- LLVM
- IAR
- 该库专注于加速低层次像素处理
- 原则上,该库不会提供内容创作API,如绘制形状、文本显示等,只提供简单的点绘制和填充API。
- 原则上,该库不会提供构建GUI所需的数据结构或算法,如元素树、GUI消息处理和树遍历算法。
4.2 临时局限性
- 该库目前只提供默认的C语言软件算法和一个**Helium基础加速库。**
- 提供的示例项目仅在MPS2、MPS3、FVP和一些第三方开发平台(如STM32F746G-Discovery)上运行。
- 欢迎您在自己的设备上尝试使用该库。该库不依赖于任何特定外围设备。
- 大多数示例项目是在MDK中创建的。
5 文件夹层次结构
文件夹和文件 | 类型 | 描述 |
---|---|---|
Library | 文件夹 | 此文件夹包含库的源文件和头文件。 |
Helper | 文件夹 | 此文件夹包含辅助函数/服务的源文件和头文件。 |
Acceleration | 文件夹 | 此文件夹包含特定于硬件的加速, 例如 Helium-ACI 示例在 FVP 中。 |
documentation | 文件夹 | 此文件夹包含所有文档。 |
examples | 文件夹 | 此文件夹包含所有示例、控件和模板等。 |
README | .md | 您当前正在阅读的 README.md。 |
LICENSE | 许可证 | Apache 2.0 许可证 |
tools | 文件夹 | 此文件夹包含用于使用库的有用实用程序。例如, img2c.py 是一个 Python 脚本,它将指定的图片转换为 arm2-d 平铺数据结构。 |
6 文档
名称 | 描述 | 位置 |
---|---|---|
API Manual | 由 Doxygen 生成的 API 手册 | * : 最新正式版本的文档 * 最新开发版本的文档 |
README.md | 您正在阅读的文档。它提供了关于 arm-2d 库的基本信息和指导。 | (根目录) |
getting_started_as_an_application_designer.md | 针对 GUI 应用程序设计师的指南。 | documentation |
getting_started_as_a_professional_user | 针对专业用户的指南。 | documentation |
how_to_deploy_the_arm_2d_library.md | 一步一步的指南,帮助您将库部署到现有或新的项目中。 | documentation |
introduction.md | 对该库的较为详细的介绍,包括基本概念、程序员模式等。 | documentation |
how_to_use_layout_assistant.md | 详细介绍布局助手辅助服务的文档。 | documentation |
how_to_use_tile_operations.md | 详细介绍 arm-2d 库中专门用于基本平铺操作的 API 的文档。 | documentation |
how_to_accelerate_arm_2d.md | 详细介绍可用于加速 Arm-2D 库的方法的文档。 | documentation |
how_to_use_alpha_blending_operations.md | 详细介绍 arm-2d 库提供的基于 alpha 混合服务的 API 的文档。 | documentation |
how_to_use_conversion_operations.md | 详细介绍 arm-2d 库提供的颜色空间转换服务的 API 的文档。 | documentation |
how_to_use_drawing_operations.md | 详细介绍 arm-2d 库中提供的基本点绘制和颜色填充服务的 API 的文档。 | documentation |
how_to_contribute | 贡献指南。 | documentation |
7 反馈
如前所述,本项目旨在探索和演示在低成本和资源受限的微控制器上提供现代 GUI 的可能性。我们希望 arm-2d 能够启发更多类似的计划和工程实践。因此,您的反馈和想法对我们来说都非常宝贵。
如果您能抽出一些时间尝试该库,请随意留下您的想法。涵盖以下几个方面会很好:
-
您希望在哪些工业领域引入使用 Cortex-M 处理器的 GUI
-
您的平台资源,如 RAM、ROM 大小、系统频率、平均功耗等
-
LCD 分辨率和目标帧率 (FPS)
-
您认为最有用但目前缺失的算法
-
关于设备
- 它是否包含针对 2D 图像处理的硬件加速器?
- 这个 2D 加速器的功能集是什么?
- 它是否包含该库目前缺少的功能?
-
任何其他想法或建议?
感谢您的宝贵时间。
Arm-2D 开发团队
2024年5月23日