本篇文章,属于学习性质,一边学习,一边记录所得。主要参考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加速器的特点是什么?
从MB升级到新的MBP后,Apple的迁移助手没有移动我的gem。我这次是通过macports安装rubygems,希望在下次升级时避免这种情况。有什么我应该注意的陷阱吗? 最佳答案 如果你想把你的gems安装在你的主目录中(在传输过程中应该复制过来,作为一个附带的好处,会让你以你自己的身份运行geminstall,而不是root),将gemhome:键设置为您在~/.gemrc中的主目录中的路径. 关于通过MacPorts的RubyGems是个好主意吗?,我们在StackOverf
西安华为OD面试体验开始投简历技术面试进展工作进展开始投简历去年一整年一直在考研和工作之间纠结,感觉自己的状态好像当时的疫情一样差劲。之前刚毕业的时候投了个大厂的简历,结果一面写算法的时候太拉跨了,虽然知道时dfs但是代码熟练度不够,放在平时给足时间自己可以调试通过,但是熟练度不够那面试当时就写不出来被刷了。说真的算法学到后期我感觉最重要的是熟练度和背板子(对于我这种普通玩家来说),面试题如果一上来短时间内想不出思路就完蛋了。然后由于当时找的工作不是很理想就又想考研了。但是考研是有风险的,我自我感觉自己可能冲不上那个学校,而找工作一个没成可以继续找嘛。本着抱着试试看的态度在boss上投了简历,
我选择的语言是Ruby,但因为Twitter,我知道Ruby不能处理很多请求。将它用于套接字开发是个好主意吗?或者我应该像Twitter开发人员那样使用像erlang或haskell或scala这样的函数式语言吗? 最佳答案 我工作的公司使用Ruby作为我们的网站。到目前为止,我们已经处理了超过34,000,000,000次点击。我们每天处理大约10,000,000次点击没有问题。每天的点击量峰值已超过40,000,000次。可扩展性取决于很多因素。例如,与读取相比,我们的数据库执行的写入比例高得不成比例。虽然大多数网站执行大约90
♥️作者:白日参商🤵♂️个人主页:白日参商主页♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!!🎈🎈加油!加油!加油!加油🎈欢迎评论💬点赞👍🏻收藏📂加关注+!「想体验ChatGPT中文聊天?」那快进来,你用不上算我输项目场景:项目条件一、那就开始吧1、安装ChatGPT-Desktop2、OpenAPI设置二、使用实例恭喜你!!!配置成功了!!!API和URL都是博主免费提供给大家的!!!恭喜你!!!配置成功了!!!API和URL都是博主免费提供给大家的!!!🎈🎈加油!加油!加油!加油🎈欢迎评论💬点赞👍🏻收藏📂加关注+!项目场景:近几个月可以说ChatGPT是火得一
RTS在阿里云视频直播的基础上进行底层技术优化,通过集成阿里云播放器SDK,支持在千万级并发场景下节点间毫秒级延时直播的能力,弥补了传统直播存在3~6秒延时的问题,确保了超低延时、低卡顿、秒开流畅的直播观看体验。本文介绍了基于RTS超低延迟直播优化强互动场景体验的最佳实践方案,并以阿里云播放器Aliplayer为例,详细介绍RTS超低延迟拉流接入、自动降级、排障信息获取等逻辑的实现,助力企业打造互动直播行业的产品竞争力。适用场景该方案适用于对超低延迟直播有诉求的客户,尤其是业务中存在强互动场景直播的场景。强互动场景直播主要是指对主播和观众存在互动,或观众存在更高实时性观看、画面互动需求的情况,
我有一个正在编写的应用程序,我允许管理员为页面、类别等添加别名,我想根据别名使用不同的Controller/操作(不重定向,我'我发现render实际上并没有调用该方法。我只是渲染了模板)。我已经尝试了捕获所有路由,但我并不热衷于引发和捕获每次都会抛出的DoubleRender异常。我想出的解决方案是在服务器启动时动态生成路由,并在创建/更新/销毁别名时使用别名模型的回调重新加载路由。这是我的routes.rb中的代码:Alias.find(:all).eachdo|alias_to_add|map.connectalias_to_add.name,:controller=>alias
我正在为我的工作用Ruby编写一个作业调度应用程序(主要是为了以给定的频率使用各种协议(protocol)移动文件)我的主循环是这样的:whiletruedo#somecodetolaunchtheproperjobsleepCONFIG["interval"]end它的工作就像一个魅力,但我不确定它是否足够安全,因为该应用程序可能在运行cpu密集型软件的服务器上运行。是否有另一种方法可以做同样的事情,或者sleep()对我来说是否足够安全? 最佳答案 每当我觉得需要阻塞时,我都会使用事件循环;通常是libev。这是一个Ruby绑定
应该很简单。我想,从阅读thisblogpost我可以在我的next命令之后立即返回一些东西:如果axis_range=="test",下一个“新值”我真正想做的是在同一行记录下一个原因:next@logger.info('跳过这个项目是为了好玩')unless(elephants.size>0)我在rubydoc上找不到任何关于next用法的讨论。.该代码肯定有效。我意识到我可以用unlessblock来做到这一点,但是那行代码太简洁了。两个问题:有更好的文档吗?next的这种用法是不是有点奇怪而不是“ruby-ish”? 最佳答案
GPT-4是OpenAI发布的最新一代语言模型,于2023年3月14日正式发布,并通过API和ChatGPTPlus平台向用户开放。微软也证实,在GPT-4正式发布之前,就已经在部分版本的Bing中使用GPT-4技术。本文旨在对使用GPT-4技术的NewBing进行中立、专业的使用评测,探讨其使用体验的变化。界面与限额早于2月26日小编获得Newbing试用资格,届时Newbing初体验并不理想,限制多,例如对话只能持续5条自动终止,对话字符受限,生成效果不尽如人意。然而今日对接GPT-4全新bing额度扩充至15条,且对话字数扩容至2000字。Newbing提供了三种模式选项,即创造力、平衡
前阵InfoQ社区看到腾讯云腾讯云区块链服务平台(TBaaS)长安链体验活动,一顿操作猛如虎报了个名,体验完用一个字概括:强。非要再加几个字的话,总体感受下来装配模式灵活高效,配套工具完整辩解。话不多说开始主题本文目录结构分为区块链分类和TBaaS平台介绍、TBaaS平台上链教程三个部分一、区块链分类:大体上来说,区块链可分为公链,联盟链,私有链三种:公有链(PublicBlockchain)公有链是指任何人都能参与的区块链。公有链是去中心化程度最高的区块链,不受机构控制,整个账本对所有人公开透明。任何人都能在公有链上查询交易、发送交易、参与记账。加入公有链不需要任何人授权,可以自由加入或者离