在Windows上原型制作和模拟嵌入式软件

9

我正在寻找关于虚拟原型、模拟和测试嵌入式C代码的工具和技术,可以在桌面Windows环境下进行。这些工具需要能够构建逼真的前置面板,包括按钮、LED和LCD显示器(分段和图形)。

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

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


1
投票关闭,因为这不是一个真正的问题。这个问题无法回答,因为它要求对人们实际询问的内容进行猜测。也许可以模拟一些硬件并将其连接到Arduino?也许是其他什么?谁知道呢。 - Warren P
大量的嵌入式系统,例如:家用电器、温控器、打印机、遥控器、医疗设备、测试设备、工业控制器等都配备了复杂的用户界面,包括液晶显示屏(分段和越来越多的图形化显示)、LED 灯、旋钮、按钮等。为了在桌面上开发这类设备的软件,需要使用 GUI 模拟 UI 组件。我正在寻找用纯 Win32 API 和 C 编写的 GUI 组件,以便与嵌入式代码轻松集成,并在桌面 Windows 上进行开发和测试。 - Miro Samek
使用您的Web浏览器作为原型设计平台如何?HTML5 +快速的JScript... - Alexey Frunze
4个回答

8
我很惊讶我的原始问题引发了这么多误解和负面评论。在一台机器上(例如个人电脑)开发和运行嵌入式C代码的策略被称为“双重定位”,这是非常普遍的。例如,在James Grenning的最新书籍“Test-Driven Development for Embedded C”中,通过在个人电脑上开发和测试深度嵌入式代码是基石。
通过双重定位避免目标硬件瓶颈
请注意,双重定位并不意味着嵌入式设备与个人电脑有任何关系。也不意味着模拟必须与嵌入式目标CPU精确匹配。
双重定位只是意味着从一开始,您的嵌入式代码(通常为C语言)被设计为在至少两个平台上运行:最终目标硬件和您的个人电脑。您真正需要的只是两个C编译器:一个用于个人电脑,另一个用于嵌入式设备。
但是,双重定位策略确实需要以特定方式设计嵌入式软件,以便通过称为板支持包(BSP)的定义良好的接口处理任何目标硬件依赖项。该接口至少有两个实现:一个用于实际目标,另一个用于运行Windows的个人电脑。有了这样的接口,嵌入式代码的大部分可以完全不知道它链接到哪个BSP实现,因此可以在个人电脑上快速开发,但也可以在目标硬件上运行而无需进行任何更改
虽然一些嵌入式程序员可能认为双重定位是一种自我施加的负担,但更有经验的开发人员通常认为关注软件和硬件之间的边界实际上是有益的,因为它会导致更模块化、更可移植和更易于维护的软件,并且具有更长的有用寿命。双重定位的投资在编译-运行-调试周期方面也会立即得到回报,与资源受限、可见性有限的深度嵌入式目标相比,强大的个人电脑速度更快、更高效。
前面板Win32 GUI工具包
当为具有非平凡用户界面的设备开发嵌入式代码时,人们经常遇到将嵌入式前面板表示为个人电脑上的GUI元素的问题。这个问题如此普遍,以至于我真的很惊讶这里没有人能推荐一个现有的库或开源项目,它将提供一个简单的C-only接口到基本元素,如液晶显示器、按钮和LED。这真的不那么复杂,但似乎每个嵌入式开发人员都必须一遍又一遍地重新发明这个轮子。
因此,为了帮助对在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上查看动画演示。

就“Front Panel Win32 GUI Toolkit”的大小和复杂性而言,上述GUI元素的实现仅需约250行C代码。包含所有输入源和大量注释的示例共计约300行C代码。该工具包经过了免费的Visual C++ Express 2010(与Express Edition Platform SDK)和ResEdit资源编辑器的测试。

祝使用愉快!


这个回答比原问题好多了!如果你能像这样清晰地表达你的问题,你可能会得到更令你满意的答案。在你的原问题中,你从未提到“双重定位”或“通过接口抽象出硬件依赖性”。 - BenSwayne
我偶尔使用的一种变体是用C语言编写嵌入式代码,但以这样的方式编写,使其也可以在PC上编译为C++,其中I/O寄存器被定义为类对象。某些类型的I/O被封装在方法中,在PC和嵌入式硬件上不同,但其他类型的I/O则通过让嵌入式系统代码直接编写它认为是真实I/O地址来处理。 - supercat

1
在您对问题的评论澄清中提到的设备将永远不会使用Windows PC,因此在这种情况下,低级Windows编程不是必需的。事实上,我会说这是不可取的。原型制作是关于速度的。它关乎您能够多快地组装出一些东西来展示给潜在投资者、高层管理人员或其他决策者。在项目需求足够明确之前,您不希望花费额外的时间进行低级C和Win32 API开发,直到您知道这是最终项目交付成果的绝对要求(也许是服务器/PC监控工具?)。在那之前,您需要快速开发。幸运的是,该行业有用于快速原型制作和硬件开发的工具,就像您所描述的那样。

我在嵌入式开发中的原型制作偏好

至于我作为开发人员的意见,我喜欢.NET微框架(.NETMF),仅仅因为我已经是Microsoft .Net开发人员,并且可以转移很多我现有的技能。因此,我使用Visual C# Express 2010(免费,正如您所要求的)在FEZ微控制器上使用C#进行原型制作。它快速、简单,您可以在几分钟内就开始着手核心项目。

如果您作为开发人员的经验不同,您可以寻找使用BASIC、Java或其他语言编程的微控制器,通过重复使用您的核心技能来帮助加快开发速度。

回答您的问题赏金评论

令人惊讶的是,嵌入式软件的相当大部分可以在桌面计算机上开发,而不是在深度嵌入式目标上开发。如果做得好,这种避免“目标系统瓶颈”的方法可能会将生产力提高一个数量级。然而,要在桌面上开发嵌入式软件,就需要模拟UI组件,例如显示器(包括分段和越来越多的图形显示器)、LED、旋钮和按钮。我正在寻找用纯Win32 API和C编写的这些UI组件,以便轻松地与嵌入式代码集成,并在桌面Windows上进行开发和测试。

我专业从事嵌入式开发工作超过4年,同时还有多年的兼职经验。虽然你上面说的有一定道理,但这并不能为你节省时间或金钱,这也是为什么大家对这种策略感到困惑的原因。我们花了多年时间为这家公司的硬件设备开发Windows模拟器,理论上可以节省原型制作的时间。但实际上,我们花费了更多的时间来模拟体验,比起直接从UI设计规格草图转向真正的开发,我们要花费更多的时间和精力。模拟器总是落后于硬件开发,并且通常需要6个月甚至更长时间才能支持最新的功能。这只是为了很少的价值而做了很多额外的工作。
你将会花费更多的时间来开发不可重用的win32平台代码和硬件仿真组件,而不是为核心项目本身编写代码。这只对提供此仿真器作为“增值”工具给潜在的第三方开发人员的硬件供应商有意义,但对于原型设计新硬件来说并没有意义。
现代开发环境如Visual C# Express 2010与FEZ微控制器可以编译、推送项目输出到微控制器,然后开始调试,速度比你在C语言仿真LCD或LED或开关的低级Windows应用程序中编译和运行快得多,甚至更快。因此,你的评论“将生产力提高一个数量级”在现代工具下已经不再适用(或许在过去的10年左右可能适用)。

如果你真的只是想在PC上直观地模拟嵌入式硬件,那么可以使用类似Adobe Flash的东西来模拟用户界面。但当你最终原型设备不会运行Windows时(也许会,但你没有说),不要通过为Windows编码来复制代码。使用当前最快、最可靠的原型设计工具,而那显然不是低级C语言和Win32 API!

也许可以考虑使用Electronics StackExchange? 因为这是一个面向开发的网站,讨论特定嵌入式硬件的优点并不是很相关。如果您决定重新聚焦于使用微控制器电子原型制作(如ArduinoFEZPropellerBasic StampPololu等),您可以在电子堆栈交换上寻求电子硬件建议。我会说,大多数这些平台都是为了方便像您所概述的LCD、LED、按钮和接口的原型制作而设计的。您通常可以在几分钟内组装几个预先构建的模块,并准备开始编写项目代码。这里可以节省大量时间。

1
这个回答完全误解了我的问题。请看下面的答案,了解在桌面上开发嵌入式代码的双重定位策略的解释。目标不是模拟硬件。目标是开发设备的基本逻辑和处理用户界面。在深度嵌入式微控制器(MSP430、AVR、Cortex-M0/M3)的背景下,.NET 和 C# 是无关紧要的。关于在桌面上使用 GHz 时钟速度和 GB 内存进行较慢的开发与嵌入式 MCUs 相比是荒谬的,并表明在桌面上采用了错误的方法。 - Miro Samek
@Miro,你应该在你的悬赏还有效的时候早点发表评论。顺便说一下,我有几年的双重定位和嵌入式开发经验。如果微控制器制造商没有提供预先存在的工具,那么你将需要做大量额外的开发和调试来支持你的双重定位方法。你会花费更多的时间/金钱,而不是更少。这不是由于“时钟速度”或“内存大小”,而是由于工作重复和花费时间编写/调试“工具”,而不是你的实际项目。这是我多年的经验,不是“荒谬的”。 - BenSwayne

0

0

这个回答误解了我的问题。我从未要求完整嵌入式系统(包括CPU和外设)的循环精确模拟。我所要求的只是在PC上运行嵌入式C代码,并将嵌入式用户界面表示为Windows上的GUI元素的能力。 - Miro Samek
Proteus还可以除了能够调试您的代码和电路设计之外。 - Mahmoud Fayez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接