EmbeddedGUI简介

news2024/12/24 2:08:48

简介

文档地址:欢迎来到EmbeddedGUI的文档

本项目主要面对RAM资源有限(<8KB),ROM资源有限(<64KB,主要看所需字体和贴图资源),CPU资源还充裕(<100MHz,不支持浮点,FPS在30左右)。需要支持触控、ViewPage等主流的UI控制行为。Framebuffer采用PFB设计,用户可以根据需要选择不同尺寸的PFB大小来平衡屏幕刷新率。

本项目提供一套基于PFB设计的GUI架构。基于面向对象的编码方式,UI参考Android UI架构,用户可以轻松定义项目所需的控件。

本项目主要参考:GuiLite、Arm-2D、EasyGUI、lvgl和Android GUI框架。

本项目仓库路径:EmbeddedGUI(gitee.com),EmbeddedGUI(github.com)。

产品特点

  • 易于移植,全部由C代码编写,支持C++调用,无第三方依赖库。
  • 基于轮询结构,可以在任何MCU环境下运行,无需OS支持。
  • 支持多种显示支持,RGB8、RGB565、RGB32。
  • 基于MIT协议,随便使用。
  • 只需要不到4KB RAM(包含Framebuffer)和64KB CODE,针对PFB有特别优化,小PFB和大PFB性能差异不大。
  • UTF-8字体支持。
  • 图片透明通道支持。
  • Mask支持,可以绘制圆角图片等功能。
  • 动画支持,支持Android的全部动画效果。
  • 抗锯齿支持,基本图形,线,圆,圆环,圆角矩阵,扇形等都支持抗锯齿。
  • 脏矩阵支持,平时只绘制需要绘制的区域,不仅省功耗,同时对于特定页面,可以实现高帧率。
  • 定点支持,所有代码全部用定点运算实现,避免在没有浮点运算单元的芯片上,运行太卡。
  • PFB支持,只需要简单一点点RAM。
  • 双缓存支持,可以充分利用SPI写入屏幕时间间隙。
  • PC调试,C部署,可以在PC上运行调试,而后在嵌入式项目上运行。
  • Makefile组织编译,没有乱七八糟的配置。

例程演示

有点丑,但是核心机制已经演示出来了,剩下基于这个框架加自己东西就行。


HelloSimple

HelloViewPageAndScroll

HelloActivity

HelloTest

HelloBasic(anim)

HelloBasic(button)

HelloBasic(button_img)

HelloBasic(image)

HelloBasic(label)

HelloBasic(linearlayout)

HelloBasic(mask)

HelloBasic(scroll)

HelloBasic(switch)

HelloBasic(viewpage)

HelloBasic(progress_bar)

需求说明

作为芯片从业人员,国产芯片普遍资源有限(ROM和RAM比较少-都是成本,CPU速度比较高-100MHz),需要在512KB ROM,20KB左右RAM资源上实现手环之类的GUI操作(要有触摸),CPU可以跑96MHz。

第一次搞嵌入式GUI,问了一圈朋友,LVGL直接放弃(太绚丽了,个人觉得也不可能跑得动,而且代码应该也比较复杂,魔改会比较困难),有人建议手撸,那要死人了。

有朋友推荐了GuiLite,看了下介绍,GUI简单直接,所需的ROM和RAM也比较少,效果图里面也有很多所需的场景,持续有更新, Apache-2.0 license,比较符合我的需求。但是实际看了下,Framebuffer设计所需资源太多了,并没有PFB设计,多个Surface需要多个Framebuffer(跟着屏幕大小来的);此外自定义控件需要考虑自己清除像素,涉及到透明度和滑动等业务场景时,就非常痛苦了。当然项目也有优势,用户完全掌握UI操作代码(4000行代码,可以轻松看懂)后,基本就不会有多余的MIPS浪费了。

又有朋友推荐了Arm-2D,看了下介绍,很有吸引力,支持PFB,小资源芯片就可以跑高帧率,大公司靠谱。实际一看,各种宏定义,由于设计考虑的是卖芯片,所以基本不会去实现GUI的控件管理和触摸管理,脏矩阵还得自己去定义,不要太麻烦。里面实现了很多酷炫的效果,有很好的借鉴意义。

lvgl,很成熟的一个架构了,玩家也很多,看了下最新的代码v9.1.0,找了一会没找到底层canvas实现,看来是我能力太弱了,效果很酷炫,公司芯片基本没有能跑动的可能,想了下,还是放弃。

综上所述,还是自己写一套吧,什么都可控,酷炫的效果无法实现,那就贴图好了。

所需资源分析

资源分GUI代码和控件所需的资源以及Framebuffer。PFB用户根据需要自己定义。

GUI代码和控件所需资源

对于嵌入式环境而言,code size和ram size至关重要。所以以典型的cm0嵌入式开发环境为例,对code size和ram size进行分析。编译出来的大小见下表。

可以看到不同的例程所需资源差异巨大,这个涉及到GUI用到了哪些控件,字库,图片等。

注意:由于不同lib库对于printf、malloc等接口影响较大,库这些接口都不实现。资源紧张的场景可以按需简易实现。

注意:直接在根目录运行python .\scripts\utils_analysis_elf_size.py脚本,可以打印下面的表格保存在output\README.md

appCode(Bytes)Resource(Bytes)RAM(Bytes)PFB(Bytes)
HelloActivity20464996813841536
HelloBasic(anim)1350035006562400
HelloBasic(button)1512491326482400
HelloBasic(button_img)17852278406242400
HelloBasic(image)1774877566242400
HelloBasic(label)758457286242400
HelloBasic(linearlayout)1518891407682400
HelloBasic(mask)19460311367202400
HelloBasic(progress_bar)851234726242400
HelloBasic(scroll)1757292489362400
HelloBasic(switch)811634686322400
HelloBasic(viewpage)1770892489362400
HelloPerformace351724435446401536
HelloSimple1536066208001536
HelloTest326165622415361536
HelloViewPageAndScroll200241555217601536

可以看到,项目的Code基本上远小于Resource,变量RAM也远小于PFB所需的RAM空间。

HelloSimple为例,实现1个button+1个label只需要15360的code size和800字节的ram size,资源占用6620Bytes,PFB占用1536Bytes。

bbgq1-zg4av

Framebuffer

GUI设计之初就支持PFB(Partial Frame-buffer),唯一的要求是PFB的Width和Height是屏幕尺寸的整数倍。如屏幕尺寸是240*320,那PFB尺寸为24*32,RGB565的屏幕,所需的RAM为:1536Bytes,可以说很小了。

代码架构

没什么东西,也就是源代码,例程和编译配置。

  • example:各种GUI例程。
  • porting:程序的主入口,根据平台不同,有一些不同实现。pc支持windows、linux和macos。嵌入式支持stm32g0。
  • src:EmbeddedGUI代码实现部分。
  • build.mk和Makefile:Makefile文件。
EmbeddedGUI
 ├── build.mk
 ├── Makefile
 ├── example
 │   ...
 ├── porting
 │   ...
 └── src
     ...

使用说明

环境搭建-Windows

Windows编译,最终生成exe,可以直接在PC上跑。

目前需要安装如下环境:

  • GCC环境,笔者用的msys64+mingw,用于编译生成exe,参考这个文章安装即可。Win7下msys64安装mingw工具链 - Milton - 博客园 (cnblogs.com)。

环境搭建-Linux/Mac

参考ARM-software/Arm-2D: 2D Graphic Library optimized for Cortex-M processors (github.com)搭建MAC环境。

编译说明

本项目都是由makefile组织编译的,编译整个项目只需要执行make all即可,调用make run可以运行。

根据具体需要可以调整一些参数,目前Makefile支持如下参数配置。

  • APP:选择example中的例程,默认选择为HelloSimple
  • PORT:选择porting中的环境,也就是当前平台,默认选择为windows,stm32g0需要专门的开发板环境,平时可以用于评估code size和ram size。

也就是可以通过如下指令来编译工程:

make all APP=HelloSimple

执行make run后,在windows环境就会弹出一个窗口,演示GUI效果了。

社区交流

欢迎大家入群交流讨论。

23901725079354_.pic

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2092024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PDF Guru Anki - 支持 PDF 处理和 Anki 制卡的多功能工具箱

DF Guru Anki&#xff0c;这是一款能够大幅提升学习和办公效率的工具。 不仅能够帮助我们快速处理 PDF 文件&#xff0c;还能够高效管理各种学习资料&#xff0c;轻松制作 Anki 卡片。 PDF Guru Anki 支持 PDF 合并、拆分、旋转、加密等基本操作&#xff0c;还能够处理水印、书…

企业资产管理是什么?如何做好?权威指南

企业资产管理&#xff08;Enterprise Asset Management, 简称EAM&#xff09;已成为企业提升运营效率、降低维护成本、增强市场竞争力的重要手段。 本文将从企业资产管理的定义、重要性、实施方法及优化策略等方面&#xff0c;提供一份权威的指南&#xff0c;帮助企业更好地理解…

视频结构化从入门到精通——行为分析类应用

行为分析类应用 1. 认识行为分析 监控/判断视频画面中目标的运动过程、携带属性等。从数据中自动识别、跟踪和理解人类或物体行为。 1. 车的行为分析应用 车辆行为分析主要用于监控和管理车辆的动态行为&#xff0c;广泛应用于智能交通、城市管理和安全监控。关键应用包括&…

信息安全--(四)网络安全体系与安全模型(二)

其他安全模型 ■纵深防御模型&#xff1a;①安全保护②安全监测③实时响应④恢复 ■分层防护模型&#xff1a;参考OSI模型&#xff0c;对保护对象进行层次化保护。 ■等级保护模型&#xff1a;将信息系统划分成不同安全保护等级&#xff0c;采取相 应的保护措施。 ■网络生…

使用numpy快速实现统计分析的常用代码实现

文末赠免费精品编程资料~~ NumPy 是 Python 编程语言中用于数值计算的核心库之一&#xff0c;在统计分析方面&#xff0c;它也提供了各种各样的函数来实现统计分析。 NumPy统计分析功能概览 基本统计量&#xff1a;计算平均值、中位数、众数、标准差、方差等。 排序和搜索&a…

8款对比分析:哪款协同办公软件最适合您的团队?

文章介绍了以下几个工具&#xff1a;1. Worktile&#xff1b;2. PingCode&#xff1b;3. 钉钉&#xff1b;4. 有道云协作&#xff1b;5. 云之家&#xff1b;6. 飞书&#xff1b;7. 语雀&#xff1b;8. Airtable。 在当今快节奏的工作环境中&#xff0c;找到一款能够无缝同步文件…

全网最全软件测试面试题(含答案解析+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计&#xff0c;到…

SPI通信(一)

1 硬件多&#xff0c;导致资源浪费&#xff08;速度快&#xff09; 1 就是分别用于发送和接收的两条线路 MOSI和MISO 2 全双工&#xff1a;MOSI(主机发送&#xff0c;从机接收) MISO(从机发送&#xff0c;主机接收) 3 支持总线挂载多设备&#xff08;一主多从&#xff09; …

初试构建工具Webpack

文章目录 一、Webpack概述二、安装Webpack三、Webpack打包实战1、创建index.js2、创建index.html3、运行webpack4、浏览index.html5、添加第二个脚本&#xff08;1&#xff09;创建index2.js&#xff08;2&#xff09;修改index.js&#xff08;3&#xff09;重新运行 webpack&a…

乱弹篇(44)涨洪水了

今&#xff08;2024年8月31日&#xff09;晨&#xff0c;笔者一如既往地骑上小型电三轮车&#xff0c;去到了寄居养老已逾六年的崇州市街子古镇味江河边遛弯健身。放眼远眺&#xff0c;啊&#xff01;涨洪水了。 照片&#xff1a;笔者手机自拍 看那刚刚修建好的&#xff0c;沿…

【C++】1326. 需要安排几位师傅加工零件

问题&#xff1a;1326. 需要安排几位师傅加工零件 类型&#xff1a;贪心 题目描述&#xff1a; 某工厂有 n 个零件加工的师傅&#xff0c;每位师傅每天能够加工出不同数量的零件。 现有 m 个零件要求一天加工完&#xff0c;请问该工厂最少需要派几个师傅来完成这次零件加工任…

兴业证券基于Apache DolphinScheduler的应用实践

文 / 兴业证券股份有限公司 刘洋 石良生 柳君 李致琪 本文来源于网络&#xff0c;如有侵权&#xff0c;请联系删除 任务调度平台&#xff0c;扮演着自动执行预设任务的重要角色&#xff0c;是业务开展过程中不可或缺的一环。随着业务规模的不断扩展&#xff0c;兴业证券每日…

物联网之硬件元器件基础知识介绍、集成电路、电阻器、电容器、电感器、二极管、三极管、晶体管、连接器、传感器、开关、电源

MENU 前言电子元件采购网址三极管持续更新中 前言 序言 硬件元器件是电子设备和系统的基本构成部分&#xff0c;它们在电子产品的设计、制造和功能实现中起着至关重要的作用。 电阻器(Resistor) 功能&#xff1a;电阻器用于限制电流流过电路的流动&#xff0c;并分配电压。它们…

【复旦微FM33 MCU 外设开发指南】外设篇3——SPI

前言 本系列基于复旦微FM33系列单片机的DataSheet编写&#xff0c;旨在提供一些开发指南。 本文章及本系列其他文章将持续更新&#xff0c;本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期&#xff1a;2024/08/31 文章目录 前言GPIO配置SPI配…

钓鱼特辑(四)安全较量,摆脱“麻瓜”标签

时至今日&#xff0c;尽管员工们对网络安全有所了解&#xff0c;却往往因缺乏足够的安全意识而对攻防没有直观感知。在红队看来&#xff0c;普通员工可能犹如“麻瓜”&#xff0c;防御薄弱&#xff0c;易于突破。 现在红队以求职者或合作方等“人畜无害”的身份在日常沟通中发动…

2024年【广东省安全员C证第四批(专职安全生产管理人员)】新版试题及广东省安全员C证第四批(专职安全生产管理人员)考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;新版试题是安全生产模拟考试一点通生成的&#xff0c;广东省安全员C证第四批&#xff08;专职安全生产管理人员&#xff09;证模拟考试题库是根据…

adb大全指令(持续更新)

连接adb adb connect 192.168.1.133(局域网ip)连接调试命令 adb shell打开日志工具 logcat

Shopify接口开发工具shopify-sdk踩坑

背景&#xff1a;   先介绍一下shopify-sdk&#xff0c;它使用java语言开发&#xff0c;是用来做shopify接口二次开发的。做过Shopify独立站的都知道&#xff0c;shopify店铺有管理后台去给管理员增删改查商品和订单等数据&#xff0c;这些数据其实都是可以通过shopify提供的…

uniapp__微信小程序如何对比时间组件框选中框之后的时间大小

1、时间组件框选择时间 2、做判断 if (new Date(selectedDate) < new Date(this.startDate)) {uni.showToast({title: 结束时间不能早于起始时间,icon: none,duration: 2000});return;}console.log(new Date(selectedDate),new Date(this.endDate)); 3、打印出来的时间对比…

C#设计模式

前言 大家熟知的GOF23种设计模式&#xff0c;源自《Design Patterns: Elements of Reusable Object-Oriented Software》一书&#xff0c;由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著&#xff0c;四人组Gang of Four简称GOF&#xff01;总结了在面 向…