在 Windows 上对嵌入式软件进行原型设计和仿真
Posted
技术标签:
【中文标题】在 Windows 上对嵌入式软件进行原型设计和仿真【英文标题】:Prototyping and simulating embedded software on Windows 【发布时间】:2012-07-26 23:20:12 【问题描述】:我正在寻找用于在桌面 Windows 上进行深度嵌入式 C 代码的原型设计(虚拟原型设计)、模拟和测试的工具和技术,包括构建由按钮、LED 和 LCD 显示器(分段式和图形式)组成的逼真的嵌入式前面板)。
我对可能使用纯 C 代码和原始 Win32 API 而不是 MFC、.NET/C#、vxWidgets 或 Qt 的可能低级方法特别感兴趣。我还想使用免费的开发工具,例如带有 Platform SDK 和 ResEdit 的 Visual C++ Express 来编辑资源。
我正在寻找代码示例来渲染图形 LCD(从单色到 24 位颜色),具有高效的像素级界面、多段 LCD 以及对“按下”和“释放”都做出响应的自绘按钮“事件。
【问题讨论】:
投票结束,因为这不是一个真正的问题。这个问题是无法回答的,因为它需要猜测这个人实际上在问什么。也许模拟 Arduinos 和一些您可能连接到 arduino 的硬件?也许还有别的?谁能说。 大量嵌入式系统,例如:家用电器、恒温器、打印机、遥控器、医疗设备、测试设备、工业控制器等,都带有由 LCD 组成的非平凡用户界面(两者分段且越来越图形化)、LED、旋钮、按钮。要在桌面上为此类设备开发软件,需要使用 GUI 模拟 UI 组件。我正在寻找用 C 语言用普通 Win32 API 编写的 GUI 组件,以便与要在桌面 Windows 上开发和测试的嵌入式代码轻松集成。 使用您的网络浏览器作为原型设计平台怎么样? html5 + 快速 JScript... 【参考方案1】:我很惊讶我最初的问题引发了如此多的误解和不利的cmet。在一台机器(例如 PC)上开发深度嵌入的 C 代码并在另一台机器(嵌入式微控制器)上运行它的策略称为“双重目标”,并且非常普遍。例如,在 PC 上开发和测试深度嵌入的代码是 James Grenning 最近出版的《嵌入式 C 的测试驱动开发》一书的基石。
通过双目标避免目标硬件瓶颈
请注意,双重定位并不意味着嵌入式设备与 PC 有任何关系。这也不意味着模拟必须与嵌入式目标 CPU 的周期精确。
双重目标仅仅意味着从第一天开始,您的嵌入式代码(通常使用 C 语言)设计为至少在两个平台上运行:最终目标硬件和您的 PC。为此,您真正需要的是两个 C 编译器:一个用于 PC,另一个用于嵌入式设备。
但是,双重目标策略确实需要一种特定的嵌入式软件设计方式,以便通过定义明确的接口处理任何目标硬件依赖关系,该接口通常称为板支持包 (BSP)。该接口至少有两种实现方式:一种用于实际目标,另一种用于 PC,例如运行 Windows。有了这样的接口,大部分嵌入式代码可以完全不知道它链接到哪个 BSP 实现,因此可以在 PC 上快速开发,但也可以在目标硬件上运行无需任何更改 em>。
虽然一些嵌入式程序员可能会将双重目标视为自己造成的负担,但更有经验的开发人员普遍认为,关注软件和硬件之间的界限实际上是有益的,因为它会带来更多模块化、更便携等具有更长使用寿命的可维护软件。对双重目标的投资还可以在大大加快的编译-运行-调试周期中立即获得回报,与运行代码的可见性有限且速度较慢、资源受限的深度嵌入式目标相比,在功能强大的 PC 上更快、效率更高.
前面板 Win32 GUI 工具包
在为具有非平凡用户界面的设备开发嵌入式代码时,经常会遇到将嵌入式前面板表示为 PC 上的 GUI 元素的问题。这个问题非常普遍,我很惊讶这里没有人会推荐一个现有的库或开源项目,它会为基本元素(如 LCD、按钮和 LED)提供一个简单的 C 语言接口。这真的没有那么复杂,但似乎每个嵌入式开发人员都必须一遍又一遍地重新发明这个***。
因此,为了帮助有兴趣在 Windows 上制作嵌入式设备原型的嵌入式开发人员,我创建了一个“前面板 Win32 GUI 工具包”,并根据 GPL 开源许可将其发布到网上(请参阅http://www.state-machine.com/win32)。该工具包仅依赖于 C 语言中的原始 Win32 API,目前提供以下元素:
用于高效、像素可寻址显示器的点阵显示器,例如图形 LCD、OLED 等,颜色高达 24 位
用于分段显示的分段显示器,例如分段 LCD,以及带有用于分段的通用自定义位图的分段 LED。
具有自定义“按下”和“释放”位图的所有者绘制按钮,并且能够在按下和释放时生成单独的事件。
该工具包附带一个示例和一个应用说明(请参阅http://www.state-machine.com/win32/AN_Win32-GUI.pdf),展示了如何处理来自所有者绘制的按钮、常规按钮、键盘和鼠标的输入。您也可以在http://www.state-machine.com/win32/front_panel.html 观看动画演示。
关于“前面板 Win32 GUI 工具包”的大小和复杂性,上述 GUI 元素的实现只需要大约 250 行 C 代码。所有输入源和大量 cmets 的示例总计约 300 行的 C。该工具包已使用免费的 Visual C++ Express 2010(带有 Express Edition Platform SDK)和免费的 ResEdit 资源编辑器进行了测试。
享受吧!
【讨论】:
这是一个比原来的问题更好的答案!如果你把你的问题表达到这个级别,你可能会收到更让你满意的答案。您在最初的问题中从未提到“双重目标”或“通过接口抽象出硬件依赖关系”。 我偶尔使用的这种方法的一种变体是用 C 编写嵌入式代码,但它也可以在 PC 上的 C++ 下编译,I/O 寄存器定义为类对象。某些类型的 I/O 封装在 PC 上与嵌入式硬件不同的方法中,但其他类型的 I/O 是通过让嵌入式系统代码直接编写它认为是真实的 I/O 地址来处理的。【参考方案2】:您在对问题的评论澄清中提到的设备永远不会使用 Windows PC,因此在这种情况下不需要低级 Windows 编程。事实上,我会说它不受欢迎。原型设计与速度有关。这是关于你能以多快的速度把一些东西放在一起向潜在的投资者或高层管理人员或其他决策者展示。
您不希望在低级 C 和 Win32 api 上花费额外的时间,直到项目需求被清除到足以让您知道这是最终项目可交付成果的绝对要求(可能是服务器/PC监控工具?)。在此之前,您需要开发速度。幸运的是,该行业拥有如您所描述的用于快速原型设计和硬件开发的工具。
我对嵌入式开发原型的偏好
就我作为开发人员的看法而言,我喜欢 .net 微框架 (.netmf) 仅仅是因为我已经是 Microsoft .Net 开发人员并且可以转移我现有的很多技能。因此,我在 Visual C# Express 2010 下使用 C# 使用 FEZ 微控制器进行原型制作(根据需要免费)。它快速、简单,您可以在几分钟内完成项目的核心。
如果您作为开发人员的经验不同,您可以寻找使用 BASIC、Java 或其他语言编程的微控制器,以通过重用您的核心技能集来帮助加快开发速度。
解决您的问题赏金评论
可以开发出惊人的大部分嵌入式软件 在台式计算机上,而不是在深度嵌入式目标上。这 避免“目标系统瓶颈”可能会提高 如果做得好,生产力将提高一个数量级。然而,为了 在桌面上开发嵌入式软件,需要模拟UI 组件,例如显示器(分段和越来越多的 图形)、LED、旋钮和按钮。我正在寻找这样的用户界面 用 C 语言用普通 Win32 API 编写的组件,以便于与 在桌面 Windows 上开发和测试的嵌入式代码。
我从事嵌入式开发的专业工作已经超过 4 年,并且在兼职期间也有很多年。虽然您上面所说的有些正确,但它不会为您节省时间或金钱,这就是为什么每个人都对这种策略的动机感到困惑的原因。我们花了数年时间试图为这家公司的硬件设备推出一个 Windows 模拟器,理论上这可以节省原型设计的时间。这总是很痛苦,我们花了更多的时间来模拟这种体验,而不是直接从草绘的 UI 绘图规范到真正的开发。该模拟器落后于硬件开发,并且通常要到硬件发布后 6 个月或更长时间才能支持最新功能。这是很多额外的工作,但价值很小。
与实际为核心项目本身编写代码相比,您将花费更多时间来开发不可重用的 win32 平台代码和硬件仿真组件。这仅对将这个模拟器作为“增值”工具提供给潜在的第 3 方开发人员的硬件供应商才有意义,但对于新硬件设计的原型设计没有意义。
现代开发环境(如带有 FEZ 微控制器的 Visual C# Express 2010)可以编译、将项目输出推送到微控制器,然后开始调试的速度与编译和运行速度一样快或更快 C 中的级别 windows 应用程序模拟 LCD 或 LED 或开关等...因此,您的评论“将生产力提高一个数量级”对于现代工具来说不再适用。 (可能是在过去 10 年左右之前。)
如果您真的真的只是想在 PC 上直观地模拟嵌入式硬件,请使用 adobe flash 之类的东西来模拟 UI。但是,当您制作原型的最终设备不会运行 windows 时,不要通过为 windows 编码来复制代码(也许会运行 windows,但您没有这么说)。使用当今最快、最可靠的原型设计工具,绝对不是低级 C 和 win32 api!
也许使用电子产品的 StackExchange?
因为这是一个面向开发的网站,所以讨论特定嵌入式硬件的优点并不重要。如果您决定重新专注于使用微控制器电子设备进行原型设计(Arduino、FEZ、Propeller、Basic Stamp、Pololu 等),您可以在stackexchange for electronics 上寻求电子硬件建议。我会说,这些平台中的大多数旨在促进 LCD、LED、按钮和界面的原型设计,正如您所概述的那样。您通常可以在几分钟内组装一些预先构建的模块,并准备好开始对您的项目进行编码。在这里可以节省大量时间。
【讨论】:
这个答案完全是对我的问题的误解。有关在桌面上开发嵌入式代码的双重定位策略的说明,请参阅下面的答案。目标是不模拟硬件。目标是开发设备的基本逻辑和处理用户界面。 .NET 和 C# 与深度嵌入式微控制器(MSP430、AVR、Cortex-M0/M3)无关。与嵌入式 MCU 相比,在具有 GHz 时钟速度和 GB 内存的桌面上开发速度较慢的评论是荒谬的,表明桌面上的方法是错误的。 @Miro 你应该在你的赏金活动仍然活跃的时候发表评论。仅供参考,我有几年的双目标和嵌入式开发经验。如果微控制器制造商没有预先存在这些工具,您将进行大量额外的开发和调试以支持您的双目标方法。您将花费更多的时间/金钱,而不是更少。这次不是由于“时钟速度”或“内存大小”,而是由于重复工作和花费时间编写/调试“工具”而不是您的实际项目。这是我多年的经验,并不“荒谬”。【参考方案3】:你要求的太多了,你需要看看@proteus。 http://www.labcenter.com/products/vsm_overview.cfm
【讨论】:
这个答案是对我的问题的误解。我从来没有要求对带有 CPU 和外围设备的完整嵌入式系统进行周期精确模拟。我所要求的只是能够在 PC 上运行嵌入式 C 代码并将嵌入式用户界面表示为 Windows 上的 GUI 元素。 Proteus 除了能够调试您的代码和电路设计之外,还会这样做。【参考方案4】:正如 Mahmoud 所说,您可以在 proteus professional 中找到带有原型设计示例的代码解决方案。它是用于原型设计、仿真和编码的流行软件之一,您可以免费download proteus professional 并查看他们的手册。
祝你好运
【讨论】:
以上是关于在 Windows 上对嵌入式软件进行原型设计和仿真的主要内容,如果未能解决你的问题,请参考以下文章