在方针硬件完结之前完结对人机界面的仿真,需求规划工程师在PC机上用软件构建人机界面原型。本文针对构建人机界面原型时所选用的东西言语和代码编写风格,以及不同言语编写的文件之间的接口问题进行了剖析,对仿真规划人员有较好的指导作用。
构建一个人机界面原型能够协助规划工程师在规划前期了解接口对规划的要求和接口的可用性。下面将评论一种当方针硬件还远未完结时,在PC机上构建人机界面原型的办法。构建这类原型的首要意图有二。
1. 使同一个规划组中的其他成员能够看到该设备的作业进程。当咱们在纸上规划一台交互式设备时,要判别规划中所描绘的交互性能否实践完结,需求很大的幻想力。而假如构建一个作业原型,就会使状况明晰许多,并且答应更多的旁观者来谈论正在方案中的接口规划得怎样。许多时分,用接口原型进行实验,还能协助规划工程师决议实在规划出的硬件需求多少按钮、多少|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||0″>||||||||||||||||||||||||||||||||||||||||0″>|||||||||||||||||||||||0″>||||0″>|||0″>||||0″>LED、多少数字显现器或文本显现器。
2. 当硬件没有作业时,使用接口原型来为人机界面编写软件。为到达这一意图,出现在PC显现器上的接口原型有必要选用C、C++或许其它适用于嵌入式开发的言语来操控。关于其它部分,则能够假定C是用于终究方针硬件的言语。
然后大约考虑一下需求仿真的是哪部分软件。在最简略的状况下,软件可用来翻开或封闭一个LED,或许向一个小型字符显现器输出一个字符串。操控人机界面上的物理元件仅仅一项很一般的功用,所以能够在PC机上编写这种软件的长处是微乎其微的。由于开关一个LED或许只需求一行代码,在一个LCD文本显现器上显现一个文本字符串也只需求调用一个10行或20行的函数。
实在困难的是怎么编写软件来决议终究是翻开LED仍是封闭LED,以及决议显现什么字符串。例如,当一个被测传感器的值继续超越戒备线一段时间,而一组使戒备有用的条件也满意了之后,软件或许应挑选翻开LED。再如,当用户按下一个按钮来挑选菜单中的下一项时,软件或许应查阅一个描绘该菜单的字符串表和操作表,以决议下一个显现的应该是哪一项。这种操控菜单之类的软件,其代码长度就会超越底层软件。
在本例中,咱们的意图是编写一个文本显现和LED操控的仿真软件,以表明PC机屏幕的改动。咱们能够编写戒备查看代码和菜单操控代码,使其既能运转在PC机上,又能运转在方针设备上。
这种仿真的办法并不新颖。但在为比如PDA和游戏机之类并没有自己的开发环境的方针设备上编写软件时,一般需求用到这种办法。
编写仿真软件所需的东西
用Visual Basic在PC机上显现几个按钮和两行文本并不困难,但当将该原型与C代码接口时,就会显得十分费事。
现在有许多针对嵌入式开发的原型编写东西,用这些东西往往会迫使规划工程师依靠于它们的事情模型,然后导致规划过多地依靠这些东西。假如规划工程师遵照它们的接口规划风格,那么这些东西的确能够产生代码,但它们并不是对一切渠道都具有满足的灵敏度,并且它们产生的代码或许并不合适小型的微操控器。
我所选用的东西是Borland C++(后边将简写为CPB)。Borland C++并不是专门合作嵌入式体系的软件编写东西,但我发现它十分合适规划的需求,并且选用Borland C++不会将规划捆绑在任何一个处理器或许任何一种软件结构上。
CPB中有一组预界说的图形组件,其间大多数并非针对嵌入式项目,而是针对桌面使用(相似下拉菜单)。但仍是有一个小的子组件可用于咱们本文所述的意图。象LED这样的UI元素就能够用图画来仿真。
CPB有三种版别:标准版、专业版和企业版。关于咱们即将评论的接口而言,标准版现已满足。
按钮、滑动块、标签和其它UI元素均可经过drag-and-drop环境刺进一个表格(一个简略的对话窗口)中去。产生一个这样的表格就会生成一个C++类的结构。例如,每逢用户点击一个图画或移动一个滑动块时,都会产生一组事情,而该表格中的每个元素都有这样一组事情与其对应。终究需求对哪些事情作出反映则由程序员来挑选。这些呼应就被写成该表格所产生的类的成员函数。
假如前面板是由一个工业规划小组规划的,那么就会有整个显现图画可供使用。或许假如物理原型现已存在,那么一幅该物理原型的数字相片就能够用来作为布景。
我选用图画方针(在CPB内也叫作Timage)来显现大多数物理元件。由于选用了图画方针就能够引进位图,然后进行显现。例如能够引进一个发光二极管的图画。在该使用中,显现了一个包括5个按钮和4个LED的接口原图,如图1所示。布景图画中LED处于关断状况。一旦软件决议其间的一个LED应翻开,那么这个发光LED图画的可见特点就被设为真,所以点亮的LED的图画就覆盖了不亮的LED图画。
有了这种简略的堆叠多幅图画的窍门,咱们就能够仿真一个物理显现屏的其它部分。例如,假定咱们选用CPB IDE来创立一个包括单词“ALARM”的标示,并将这一元素命名为AlarmIndicator,那么咱们就能够编写一个函数来操控它:
void setAlarmState(Boolean state)
{
PanelForm->AlarmIndicator
->Visible = state;
}
面板表格中包括了咱们仿真时所用到的一切图形方针。Alarm-Indicator便是咱们将一个标签放到面板表格上之后为其分配的姓名。当咱们将该标签经过拖拽到表格窗口中的办法参加该表格时,它就成为了该表格的一个数据成员。
在CPB中,显现屏上的一个元素的一切特点都能够作为表征该元素的类的公共数据成员。因而,Visible特点只需进行一个简略的分配操作就能改动。公共数据成员能够在程序中的任何地方经过分配而改动。在CPB中,各特点也有其特别状况,答应在IDE中经过该状况改动特点。开发者能够点击一个标示,并在特点窗口设置Visible特点。显现的色彩和字体也能够经过相似的办法改动。
现在来看一个setAlarmState()程序,该程序用于驱动根据CPB的仿真。以下代码为CPB专用代码,在终究的方针上无法运转。不必多久,咱们将不得不为方针接口编写该函数的另一个版别,方法如下:
void setAlarmState(Boolean state)
{
if (state)
{
ledRegister |= 0x02;
}
else
{
ledRegister &= ~0x02;
}
}
有时,编程的风格会导致一些小函数形成函数调用开支。在较小的体系中这一问题较受重视,而这些函数中有一些能够写成宏或许内联(inline)函数。我一般只在项意图最终阶段才开端进行这类优化。
代码的安排
假如咱们现已编写了两个版别的setAlarm-State()函数,那么咱们有必要确保一次只编译其间的一个。要到达这一意图,一种办法是一向选用CPB代码,直到方针硬件规划好之后,再用方针专用的代码替代其间一切CPB专用的代码。假如咱们这样做,那么在咱们开端方针硬件的开发作业之后,就无法再运转仿真了。读者或许认为这不是什么问题,但事实上,即便硬件规划好之后,仿真也是有用的。
例如,仿真中根据PC的调试环境往往就比方针硬件的开发环境要好。由于方针硬件的下载速度或许较慢,或许每次修正软件都有必要从头烧录一块一次性可编程芯片。并且方针硬件的调试环境中或许也不支撑单步调试和断点调试。即便方针硬件的调试环境较好,相对而言,PC仿真仍是有其它优势。开发者能够将.exe文件经过电子邮件发送给不在同一作业地址的作业同伴,以取得他们的反应信息。
一旦开发者决议要在整个项意图开发周期中一起保存两个版别的函数,那么分隔它们就很简略。在CPB中的Project/Options下,能够界说宏。我一般会界说USING_CPB,然后在我的源代码中,使用一个#ifdef来区别不同的函数版别。另一种区别函数版别的办法便是将方针代码和仿真代码存放在不同的文件中,但让二者同享同一个头文件,以确保二者选用相同一组函数符号。
CPB环境是根据C++的一种环境,但许多嵌入式方针简直都不支撑C。这时,开发者只能选用同享代码中由穿插编译器所支撑的C++子集,这其实并没有幻想中的困难。处理该问题的办法之一便是针对嵌入式方针来编译代码,即便当时并没有硬件能够运转这些代码。这时那些在PC机上可用的而在方针硬件上则或许归于不合法的特性就显得杰出起来。例如,有些较小型的处理器就不支撑递归。一起,在嵌入式编译器上查看软件,还能快速地在程序中标出那些偶尔被包括进方针可执行文件中的CPB专用代码。我自己就发觉这种办法在盯梢软件的巨细时十分有用,由于CPB库过于巨大,会彻底歪曲程序的巨细,所以PC机中进行编译时给出的软件巨细并不实在。
这儿选用了三种类型的代码。其间有些归于CPB专用代码,只能在PC机上编译;有些归于方针专用代码,只能在方针上编译;而其它的则归于公共代码,应该既能在PC机渠道上运转,也能在方针渠道上运转。在抱负状况下,每个源文件应该都只包括一种类型的代码。规划工程师的IDE或makefile应答应其挑选在每次创立可执行文件时需求包括哪些文件。
主张在命名文件时,将一切CPB专用的文件命名为.cpp文件,一切方针专用的文件和同享文件均取.c为扩展名。那么在方针环境中编译时,就只需编译扩展名为.c的文件,而不编译扩展名为.cpp的文件。
假如规划工程师遵从以上风格,那么在CPB环境中编译时还会遇到一个问题。CPB环境将.c文件假定为C代码编写的文件,而将.cpp文件假定为C++代码编写的文件。当从一个文件到另一个文件产生调用时,将会因 C++产生破损函数名的办法不同而产生链接过错。咱们能够经过选用“extern C”结构来逃避这个问题。但这样有点费事,特别当调用产生在从C到C++或从C++到C时。能够为Borland编译器设置一个标志,告知它,不管文件名的后缀是什么,均将其作为C++文件来编译。惋惜的是IDE中没有这样的标志。所以咱们只能手艺修改项目配置文件来完结这一功用。
代码举例
读者能够在www.panelsoft.com/cpb 处找到一个可执行文件five.exe,文件中包括一行5个按钮和一组LED。按下前4个按钮中的任何一个都会翻开相应的一个LED。第5个按钮是RESET(复位)按钮,按下该按钮会关断一切LED。 当然,在结构这样一个项目时,并不需求进行仿真。但该例旨在阐明,只需具有初始的接口界面图象,那么仿真时,只需稍作尽力就可得到与实在设备看起来相似的运转成果。一起,该例还阐明,key.c模块中包括的代码既可在方针环境中运转,也可在仿真环境中运转,并且该代码不会因方针环境和仿真环境这两种渠道之间的差异而需求任何条件代码才干运转。用于结构该使用的一切源代码和初始位图均可从该站点下载。
树立相似的仿真需求规划工程师具有必定的C++常识,学习CPB开发环境也需求必定的进程,当规划工程师从未用过这种面向方针的事情驱动环境时特别如此。但是只需树立起一个仿真,那么其它作业只需按相同的过程进行即可。规划工程师假如曾编写过根据PC的程序,并且程序顶用到了GUI,那么这一经历会有助于对CPB的学习。我过去就曾使用这样一个程序来完结过一个简略的下载使用,完结与嵌入式方针的串行通讯。
嵌入式体系的人机界面原型规划战略
在目标硬件完成之前实现对人机界面的仿真,需要设计工程师在PC机上用软件构建人机界面原型。本文针对构建人机界面原型时所采用的工具语言和代码编写风格,以及不同语言编写的文件之间的接口问题进行了分析,对仿真
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/315698.html