基于小米Open-Vela开源系统的高级计算器实现 | 支持C++数学函数与 LVGL UI

本项目展示了一个基于 小米OpenVela 开源系统实现的高级计算器应用,适用于 AIoT 场景,使用LVGL图形库,以及引用了github仓库ExpressionCalc函数,使用C++来支持丰富的数学表达式解析能力。

open-vela社区是一个友善包容的开源社区,欢迎大家一起学习,共同进步。


项目地址:https://github.com/open-vela/packages_demos

  • 本项目是calculator,目前已被 Merged合并到该仓库, 其中文件夹calculator是该项目。
  • 除此之外,还有很多优秀的例程,教程文档上手,如Music Player、bandx、x_track。

欢迎大家积极参与 OpenVela 社区,勇敢迈出向开源世界投稿的第一步


📌 目录


📘 系统背景 - Open-Vela 简介

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

✅ 高度可扩展

  • openvela 的设计注重模块化与可扩展性,使其能够灵活适应多样的物联网应用场景。小到仅配备 32KB RAM 的微型 BLE 模组,大到拥有 512MB RAM 的智能有屏音箱,openvela 都能提供高度可扩展的支持。

✅ 标准兼容 + 高可移植性

  • openvela 内核基于 Apache NuttX ,这个被称为 "Tiny Linux" 的系统为 openvela 提供了高标准的 POSIX 兼容性。通过持续提升其 POSIX 兼容性,openvela 当前已达到 88% 的兼容水平。这种高标准的兼容性意味着在其他标准操作系统(例如 Linux)上开发的软件可以轻松迁移到 openvela,几乎不需要额外的工作。

✅一站式解决方案:

  • 随着时间的推移,openvela 不断沉淀了各类 AIoT 应用的共性需求,成为一个功能完备的软件平台,为各类物联网解决方案提供了全面的支持。厂商采用 openvela,可以显著降低研发成本并加速产品的上市时间。

✅成熟的异构计算支持:

  • openvela 为异构多核系统提供了强大的支持,实现了 MCU、MPU、DSP、GPU 以及 NPU 等不同处理单元间无缝的 IPC 通信机制。此外,openvela 还提供了一个高级的 RPC 框架,简化了 openvela 与 Android 和 Linux 系统的通信,使快速打造一个异构融合操作系统成为可能。

✅全面的连接套件:

  • openvela 提供了广泛的协议支持,包括蓝牙 BR/EDR/LE、LE Mesh、WiFi、Matter、LTE Cat1、以太网、CAN/LIN 等。同时,它还能与小米的 HyperConnect 协议无缝集成,提供了强大的连接能力。

✅丰富的开发者工具:

  • openvela 提供了一系列完备的开发者工具,包括系统监控、性能分析、调试器、追踪、崩溃分析和日志分析工具,为开发者提供了强大的支持。

一、calculator基本介绍

✨ 项目特色亮点

  • 🧩 模块化架构设计:功能模块清晰,便于扩展与维护;

  • 🎨 基于 LVGL 的 UI 风格设计:主打白色系风格,简洁舒适;

  • 🧠 智能输入交互体验:操作流畅,具备自动清除逻辑与输入判断;

  • 🧪 科学函数支持:涵盖常见函数如 sin、log、sqrt,提升表达能力;

  • 🛠️ C++ 支持完善:从标准库到自定义函数均已配置良好;

  • 📦 开箱即用的资源管理机制:借助 ADB 推送方式,实现模拟器字体,图片资源更新无障碍。

🧮 支持的表达式示例

  • PI / 2
  • E + 4
  • sqrt(4)
  • cos(-2)

二、实现思路

1. Token 与优先级

  • 通过 TokenLevel 来定义每个操作符的优先级。
  • 例如,+ 和 - 的优先级是 1,而 *, /, % 等优先级是 2,会优先处理。

这样就能在处理逆波兰表示法时判断操作符的优先级,确保正确的运算顺序。

2. 表达式解析

  • reversePolishNotation 方法负责将输入的中缀表达式(例如 a + b * c)转换为逆波兰表示法(如 a b c * +)。这个过程使用了栈来处理操作符和括号。

  • 当遇到数字时,直接将其添加到结果队列。

  • 当遇到操作符时,根据其优先级判断是否需要弹出栈中的操作符。

  • 遇到左括号 ( 时,压入栈中,右括号 ) 时,弹出栈中的操作符直到遇到左括号。

3. 逆波兰表示法计算

  • evalNotation 方法通过栈来计算逆波兰表示法的结果。

  • 如果遇到数字,将其压入栈中。

  • 如果遇到运算符,从栈中弹出参数并进行计算,然后将结果压回栈中。

  • 支持的运算符可以是自定义的,也可以是内置的,如 +, -, *, sin, log 等。

4. 基于 LVGL 的 UI 构建

  • 通过 create_button() 实现动态按钮创建;
  • 使用二维 btn_map 配置按键布局;
  • 使用 calculator_create() 函数构建主 UI,包括 Label、按键、事件绑定。

三、使用说明

1.安装open-vela编译环境

此为open-vela官方doc文档,按顺序使用即可安装

2. 配置模拟器(menuconfig)

安装好后,终端切换目录到/vela-opensource下,执行以下命令进入模拟器配置

bash 复制代码
./build.sh vendor/openvela/boards/vela/configs/goldfish-armeabi-v7a-ap menuconfig
⚙️ 配置项:

在模拟器配置界面,按下 / 键,可以输入关键字进行搜索,进行以下配置

  • 配置LVX_USE_DEMO_CALCULATOR 为 yes
  • LVX_CALCULATOR_DATA_ROOT的路径设置为/data (该项目Kconfig文件我已默认预设为 /data)

开启 C++ 支持:

  • 按ESC退出搜索,回到主界面,用方向键找到library Routines,按空格键进入
  • 然后向下找到Have C++ compiler按空格,让文本前面是[*]表示开启。

进行以下操作设置,以支持C++加载include头文件,例如iostream.h,cmath.h等

  • 进入C++ library设置为 Toolchain C++ support

  • 设置 C++ low level library select GNU low level libsupc++

  • 设置 (gnu++20) Language standard

在这里提一句,如果使用了错误处理机制,就需要额外开启Enable Exception Support

目前根据工程师的建议,嵌入式设备用这个不太好,所以已经不再使用 try-catch ,不用开启。

2. Makefile 编译说明

(1)编译Main函数写法
  • 在makefile文件中设置 PROGNAME = calculator
  • 在编译时会试图链接一个函数名叫:int calculator_main(int argc, char *argv[])
  • 并且还需要加上extern "C" ,所以得到主函数为extern "C" int calculator_main 才能成功检索到编译。

否则会出现以下错误:

复制代码
arm-none-eabi-ld: /home/foam/vela-opensource/nuttx/staging/libapps.a(builtin_list.c.home.foam.vela-opensource.apps.builtin_1.o):
(.rodata.g_builtins+0x7c): undefined reference to calculator_main'
(2)指定cpp文件
  • 因为使用了cpp文件,所以需要用CXXEXT以指出.cpp格式文件
bash 复制代码
CXXEXT := .cpp
  • 并且C++文件需要使用CXXSRCS标出,如
bash 复制代码
CXXSRCS = calculator_cre.cpp expression_calc.cpp 

3.资源推送更新 /res

需要在模拟器运行状况下,新开一个终端,在其中使用ADB指令更新资源推送,才能显示更换的新图片和字体。

  • 启动模拟器
bash 复制代码
./emulator.sh vela
  • ADB推送更新资源(在模拟器运行状况下,终端使用)
bash 复制代码
adb push apps/packages/demos/calculator/res /data/
  • 之后重新运行启动计算器应用即可
bash 复制代码
calculator &

4.图片读取方法

  • 参考了LVGL官方文档中,LVGL Image Decoder section部分的做法,将PNG图像缓存使用,使得背景图片的使用不卡顿。
  • 文档链接LVGL Image Decoder section

📁 原工程路径

text 复制代码
vela-opensource/apps/packages/demos/calculator/

🛠️ 常用指令

任务 命令
开始构建 ./build.sh vendor/openvela/boards/vela/configs/goldfish-armeabi-v7a-ap -j$(nproc)
配置模拟器 ./build.sh vendor/openvela/boards/vela/configs/goldfish-armeabi-v7a-ap menuconfig
启动模拟器 ./emulator.sh vela
推送资源 模拟器运行后,新开一个终端使用adb push apps/packages/demos/calculator/res /data/
清理构建产物 ./build.sh vendor/openvela/boards/vela/configs/goldfish-armeabi-v7a-ap distclean -j$(nproc)
启动应用 在模拟器运行终端使用 calculator &

作品历史

  • 这是最初制作的UI。。。
  • 期间遇到很多问题,提交后有工程师反馈修改。
  • 最后在工程师指导下提交了很多个commit,更正了许多问题,如内存泄漏、全局变量、去除try-catch、优化PNG加载等等。
  • 最终修改提交

想说的话

在春假期间,我有幸参与了由学校与 OpenVela 项目组联合举办的研学沙龙活动,对该项目有了更深入的了解和切身的实践体验。从首次向 GitHub 提交 PR 开始,经过多日反复修改和打磨,最终成功地将代码合并进主项目。这一过程中,我收获良多。感谢项目工程师们的悉心指导,他们提出了二十余条细致入微的修改建议,使我在九次 commit 的过程中不断进步,代码风格更加规范,Git 工具的使用也更加熟练。

这一个多月的经历让我真正体会到了开源协作的魅力。我亲眼见证了自己提交的代码逐步完善并被项目采纳的过程,也意识到了自己在编码习惯、逻辑严谨性等方面的许多不足与成长空间。能够在真实的项目中学习,在工程师的耐心帮助下成长,是一份难能可贵的经历。衷心感谢项目组和学校共创这一宝贵的研学机会。也祝愿 OpenVela 项目和学校的科研教学工作蒸蒸日上,发展越来越好!

在此也向大家发出诚挚的邀请:欢迎大家积极参与 OpenVela 社区,勇敢迈出向开源世界投稿的第一步。这是一个友善包容的开源社区。在这里,不仅可以学到前沿的 AIoT 知识和实际开发经验,更能与一线工程师直接交流,收获实用的建议与技术成长。社区建设离不开每一位开发者的贡献,学习的过程也是彼此启发、共同进步的过程。希望更多有热情、有想法的人加入进来,一起完善 OpenVela,一起见证属于我们自己的开源足迹!


🔗 参考资料

相关推荐
老李不敲代码13 分钟前
榕壹云外卖跑腿系统:基于Spring Boot的开源生活服务平台技术解析
spring boot·微信小程序·uni-app·开源·生活·软件需求
说私域40 分钟前
线上线下融合驱动:开源链动2+1模式与AI智能名片赋能高价值社群生态的机制研究
人工智能·小程序·开源·零售
ajassi20001 小时前
开源 Arkts 鸿蒙应用 开发(二)封装库.har制作和应用
linux·华为·开源·harmonyos
电子科技圈1 小时前
为AR眼镜等多种智能可穿戴设备添加穿戴状态检测功能
经验分享·后端·嵌入式硬件·ar·restful·智能硬件·智能手表
努力的小雨1 小时前
重要通知:spring-ai-hunyuan 已兼容 Spring AI 稳定版!
经验分享·ai智能·开源贡献
NocoBase1 小时前
NocoBase 本周更新汇总:支持扫码填充数据
低代码·开源·资讯
蓝蜂物联网3 小时前
PLC 远程运维新范式:物联网打破空间限制
运维·物联网·信息可视化·制造
GineLee3 小时前
吉林大学软件工程章节测试答案-第八章
经验分享·软件工程·运维开发·改行学it
ajassi20003 小时前
开源 Arkts 鸿蒙应用 开发(一)工程文件分析
华为·开源·harmonyos
国产化创客13 小时前
国产ARM/RISCV与OpenHarmony物联网项目(二)网关数据显示
物联网·鸿蒙系统·国产化