嵌入式开发如何进行有效的嵌入式GUI开发?
在所有行业中大规模采用物联网技术的结果是对嵌入式开发技能的需求日益增加。然而,嵌入式开发在历史上一直是一个相当复杂的领域,人们不可能在一夜之间将其添加到技能中。
幸运的是,在过去的十年中,硅供应商在简化嵌入式开发方面投入了大量的精力,特别是对于在该领域经验很少甚至没有经验的人。但根据我的经验,至少有一个领域的工作仍然过于繁琐:图形用户界面( GUI )开发。许多应用程序至少需要某种图形用户界面:显示器可能很小,单色,几乎没有任何按钮供用户按下,但它仍然是一个用户界面,是吗?
在本文中,我也将分享一些技巧和一些我用来帮助保持 GUI 开发愉快的工具。
硬件集成和可移植性
大多数显示设备都带有示例代码和驱动程序,这些代码和驱动程序将使您至少能够显示某些内容。但是 GUI 不仅仅是一个屏幕,因为界面也是由输入组成的,对吗?那些按钮、触摸屏输入和系统中可能参与交互的其他传感器如何?
这看起来可能不多,但在受约束的系统上运行时,正确处理简单的硬件输入(如按下的按钮)可能需要大量工作,并且您可能很快就不得不处理复杂的定时或中断管理问题。由于这些通常涉及低级编程,它们往往非常依赖硬件,不容易移植。
很多嵌入式开发都是用 C 语言完成的,因此,除了低级的引导代码外,嵌入式代码在理论上是相当可移植的。然而,编写可移植 GUI 代码是一个完全不同的故事,除非您在现有框架(如 LVGL 或 Azure RTOS GUI )的基础上进行构建,否则需要花费大量精力来抽象所有硬件依赖项,在尝试保持最佳状态时更是如此。
当然,并非总是有必要(或可能)拥有 100% 可移植的 GUI 代码。然而,在这个全球芯片短缺的时代,它可以被证明是非常方便的,不需要对特定类型的微控制器或 LCD 显示器有严格的依赖。
内存管理
简而言之:您的图形用户界面可能会占用大量内存,您需要更加聪明,为实际应用程序留出足够的空间。例如,节省图形内存的一个快速方法是仔细检查是否可以用矢量等价物替换某些光栅图形(例如图标):当然,直接在屏幕上绘制一个简单的 32x32px 红方块需要更少的代码和 RAM ,而不是将其存储为内存中的位图。
资源管理
正确管理组成 GUI 项目的各种资源可能很棘手。更具体地说,您的 GUI 实体模型都可能由各种图像文件、图标、字体等组成。但是,在嵌入式 开发 环境中,您通常不能期望能够在代码中直接操作漂亮的透明 PNG 文件或 TrueType 字体!首先需要将其转换为允许在嵌入代码中操作的格式。
事件处理和性能
首先, C 语言仍然是最常用的嵌入式编程语言,它并不完全是面向对象的。因此,即使完全有可能以上面所示的高级 API 为目标,也很有可能在向某个 UI 元素添加 / 更新事件处理程序时使用容易出错的函数指针。
假设您确实找到了一种优雅的方式将事件处理程序与 UI 的各个部分关联起来,那么您仍然需要实现某种类型的事件循环。事实上,您必须定期处理系统中发生的事件( " 按下按钮 A" 等),并将它们发送给适当的事件处理程序。嵌入式编程中的一种常见模式是通过所谓的超级循环来实现:程序运行无限循环,无限次地调用系统需要执行的每个任务。
这种方法的一个好处是,执行流保持了相当的可读性和直观性,并且还避免了复杂的多线程或中断处理可能导致的一些潜在问题。但是,任何运行时间过长(或崩溃!)的事件处理程序都会影响主应用程序的性能和稳定性。
随着 FreeRTOS 或 Azure RTOS ThreadX 等嵌入式 开发的 实时操作系统越来越流行,一种更现代的方法是让 UI 事件循环在专用的后台任务中运行。因此,操作系统可以确保此任务(优先级较低)不会影响主应用程序的性能。
嵌入式 GUI 并不总是需要像 fast 和 responsive 那样具有良好的性能。然而,尽可能高效地使用嵌入式资源被认为是一种良好的实践。确保您的 GUI 和应用程序代码的性能尽可能合理,这可能会为您节省大量资金,因为这意味着您可以坚持使用尽可能最小的 MCU 来完成任务。
了解更多