在 Windows 上对嵌入式软件进行原型设计和仿真

2023-11-25

我正在寻找用于原型设计(虚拟原型设计)、模拟和测试桌面 Windows 上深度嵌入式 C 代码的工具和技术,包括构建由按钮、LED 和 LCD 显示器(分段和图形)组成的真实嵌入式前面板。

我对可能的低级方法特别感兴趣,使用纯 C 代码和原始 Win32 API,而不是 MFC、.NET/C#、vxWidgets 或 Qt。我还想使用免费的开发工具,例如带有 Platform SDK 的 Visual C++ Express 和用于编辑资源的 ResEdit。

我正在寻找代码示例来渲染图形 LCD(从单色到 24 位颜色),具有高效的像素级接口、多段 LCD 以及响应“按下”和“释放”事件的自绘按钮。


我很惊讶我原来的问题引发了如此多的误解和负面评论。在一台机器(例如 PC)上开发深度嵌入式 C 代码并在另一台机器(嵌入式微控制器)上运行的策略称为“双重目标”,并且确实很常见。例如,在 PC 上开发和测试深度嵌入式代码是 James Grenning 最近出版的《嵌入式 C 测试驱动开发》一书的基石。

通过双重定位避免目标硬件瓶颈

请注意,双重定位并不意味着嵌入式设备与 PC 没有任何关系。这也不意味着嵌入式目标 CPU 的仿真必须是周期精确的。

双重目标只是意味着从第一天起,您的嵌入式代码(通常采用 C 语言)就设计为至少在两个平台上运行:最终目标硬件和您的 PC。为此,您真正需要的是两个 C 编译器:一个用于 PC,另一个用于嵌入式设备。

然而,双目标策略确实需要一种特定的嵌入式软件设计方法,以便通过定义明确的接口(通常称为板支持包 (BSP))来处理任何目标硬件依赖性。该接口至少有两种实现:一种用于实际目标,另一种用于 PC,例如运行 Windows。有了这样的接口,大部分嵌入式代码就可以完全不知道它链接到哪个 BSP 实现,因此可以在 PC 上快速开发,但也可以在目标硬件上运行没有任何改变.

虽然一些嵌入式程序员可能将双重目标视为自己造成的负担,但更有经验的开发人员普遍认为,关注软件和硬件之间的界限实际上是有益的,因为它会导致软件更加模块化、更可移植和更易于维护。使用寿命更长。对双重目标的投资还可以在大大加速的编译-运行-调试周期中立即得到回报,与速度慢得多、资源受限的深度嵌入式目标(对运行代码的可见性有限)相比,在功能强大的 PC 上速度更快、效率更高。

前面板 Win32 GUI 工具包

在为具有重要用户界面的设备开发嵌入式代码时,经常会遇到将嵌入式前面板表示为 PC 上的 GUI 元素的问题。这个问题是如此普遍,以至于我真的很惊讶这里没有人可以推荐现有的库或开源项目,这些库或开源项目将为基本元素(例如 LCD、按钮和 LED)提供简单的仅 C 接口。这其实并没有那么复杂,但似乎每个嵌入式开发人员都必须一遍又一遍地重新发明这个轮子。

因此,为了帮助对 Windows 上的嵌入式设备进行原型设计感兴趣的嵌入式开发人员,我创建了一个“前面板 Win32 GUI 工具包”,并根据 GPL 开源许可证将其发布到网上(请参阅http://www.state-machine.com/win32)。该工具包仅依赖于 C 语言的原始 Win32 API,目前提供以下元素:

  1. 点阵显示器,用于高效、像素可寻址的显示器,例如图形 LCD、OLED 等,颜色高达 24 位

  2. 分段显示器用于分段显示器,例如分段 LCD 和分段 LED,以及分段的通用自定义位图。

  3. 具有自定义“按下”和“释放”位图的所有者绘制的按钮,并且能够在按下和释放时生成单独的事件。

该工具包附带一个示例和一个应用说明(请参阅http://www.state-machine.com/win32/AN_Win32-GUI.pdf),展示如何处理来自自绘制按钮、常规按钮、键盘和鼠标的输入。您还可以在以下位置观看动画演示:http://www.state-machine.com/win32/front_panel.html.

考虑到“前面板 Win32 GUI 工具包”的大小和复杂性,上述 GUI 元素的实现只需要大约 250 行 C 语言。包含所有输入源和大量注释的示例总计大约 300 行 C 语言。该工具包已使用免费的 Visual C++ Express 2010(带有 Express Edition Platform SDK)和免费的 ResEdit 资源编辑器进行了测试。

Enjoy!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows 上对嵌入式软件进行原型设计和仿真 的相关文章

随机推荐

  • 无法在 Django 中导入 GeoIP 模块

    我正在使用 Django 1 5 5 设置 py GEOIP PATH os path join PROJECT DIR geoIP INSTALLED APPS django contrib gis 视图 py from django c
  • 在一行中编写 F# 对象表达式

    当我准备为 F 编写一个代码生成器时 我想知道是否可以通过仅生成单行值来避免陷入缩进混乱 作为这项工作的一部分 我正在考虑如何在一行中表达对象表达式 但没有成功 除非在详细模式下 let Expr let ToString ToString
  • Python 和 Selenium xpath 用于选择多个条件

    我在 selenium 中有以下代码 但仍然出现语法错误 我正在尝试根据多个条件选择一个元素 choices driver find elements by xpath div contains 5 and contains class o
  • 为什么 Python 集合不保留插入顺序?

    我最近惊讶地发现 虽然在 Python 3 7 中字典可以保证保留插入顺序 但集合却不能 gt gt gt d a 1 b 2 c 3 gt gt gt d a 1 b 2 c 3 gt gt gt d d 4 gt gt gt d a 1
  • 为什么 C# 中的数组参数要使用 ref ?

    我读了该页使用 ref 和 out 传递数组 C 编程指南 并想知道为什么当数组参数已经是引用类型时我们需要将其定义为 ref 参数 被调用函数中的更改不会反映在调用函数中吗 被调用函数中的更改不会反映在调用函数中吗 更改为contents
  • JavaScript 事件序列

    JavaScript 中的某些事件先于其他事件触发 例如 对于输入元素 首先触发 keydown 和 keypress 事件 然后 如果这些返回值不为 false 则更新 input value 然后 将触发 keyup 事件 是否有一个网
  • 如何在Android上的WebView中读取Blob中的数据? [复制]

    这个问题在这里已经有答案了 我有一个在浏览器上创建对象 blob 的服务器 我想在 Android 应用程序的 WebView 中下载它 我尝试将请求重定向到浏览器实例以及使用下载管理器来执行此操作 但它们似乎都不起作用 即使我在 Chro
  • 警告 C4146 无符号类型上的减号运算符

    我有来自我想使用的库的代码 编译时 我收到以下警告 警告 C4146 一元减运算符应用于无符号类型 结果仍然无符号 inline int lastbit uint32 t v int r static const int MultiplyD
  • java.lang.NoClassDefFoundError: javax/json/Json

    我有一个简单的 Java 项目 我想在其中构建 Json 字符串 为此 我使用 javax json import javax json Json import javax json JsonObjectBuilder public cla
  • Google 电子表格,过滤器不允许使用通配符?如何计算带有通配符的多列?

    当我做 B C 223 herp 223 herp 3 herp 223 derp 223 herp derp countif C C herp 我正确地得到了4 当我做 count filter B B B B 223 C C herp
  • 在 java 中使用 Jackson 自定义 JSON Field 反序列化?

    给定一个像这样的简单实体类 public class User JsonProperty public Calendar createdOn JsonProperty public String name 有没有办法让我连接到 Jackso
  • 用于查找和替换具有特定扩展名的所有文件的 PowerShell 脚本

    我有几个像这样嵌套的配置文件 C Projects Project 1 project1 config C Projects Project 2 project2 config 在我的配置中 我需要像这样进行字符串替换
  • 故事板中新视图控制器的类

    在我的故事板中 我拖动了一个新的视图控制器 我的故事板现在有两个视图控制器 一个是我创建文件时出现的主视图控制器 另一个是拖动的视图控制器 当我进入 助理编辑器 并选择主视图控制器时 我得到了 ViewController h 类 但是当我
  • 不使用 string.Split 分割字符串

    我正在做一个家庭作业问题来分割字符串而不使用框架方法 以下是我想出的工作代码 我想知道如何将运行时间提高到O n 也欢迎任何改进建议 public static string split string txt char delim char
  • 在 Mac OS X 上加载 JNI 库?

    背景 所以我尝试加载 jnilib 特别是JOGL 在运行时转换为 Mac OS X 上的 Java 我一直在关注相关的 Stack Overflow 问题 Maven 和 JOGL 库 在 Java 中加载 DLL Eclipse JNI
  • 使用 Tesseract 进行页面布局分析?

    超立方体3能够执行页面布局分析 但是 我找不到任何有关如何使用该库实现此类目的的示例代码或文档 我希望这里有人可以解释如何对图像执行布局分析以及如何解析结果数据 Tesseract 可以被赋予一个页面模式参数 psm 可以具有以下值 0 仅
  • Azure 数据库连接错误。 [复制]

    这个问题在这里已经有答案了 大家好 我是 Azure 新手 并且仍在学习所有内在的东西 我正在尝试连接数据库并遇到异常 任何指点都会非常感激吗 不知道大家有没有遇到过这种情况或者是什么原因呢 连接到数据库 System Data SqlCl
  • 自定义验证独特属性 - 泛型类

    我正在尝试进行自定义验证 IsUnique 检查属性值是否唯一并返回正确的消息 这是我的代码 但这仅适用于指定的类 是否可以执行通过元数据获取正确的类的方法 public class ArticleMetaData Required All
  • IntelliJ 无法显示大文件?

    我的文本文件是 1 58G 我的 IntelliJ 自定义 VM 选项设置为 Xmx4G 为什么显示 The file is too large 1 58G Showing a read only of the first 2 56M id
  • 在 Windows 上对嵌入式软件进行原型设计和仿真

    我正在寻找用于原型设计 虚拟原型设计 模拟和测试桌面 Windows 上深度嵌入式 C 代码的工具和技术 包括构建由按钮 LED 和 LCD 显示器 分段和图形 组成的真实嵌入式前面板 我对可能的低级方法特别感兴趣 使用纯 C 代码和原始