第1章前言1.1 研究背景学习基于ARM9体系结构的嵌入式系统硬件设计和软件设计,解决餐饮行业服务人员过多,效率低下的矛盾,进一步提高无线点餐系统的广泛应用。
我国大部分餐饮业多为传统的服务模式,遇到了很多问题:1. 大量的人工处理客户预定、点菜、查询、退菜,来回奔跑于客户和厨房之间;下单,催菜,乱成一团,厨师常因看不清楚服务员字迹苦恼,导致落单和菜单丢失的事情时有发生。
2. 催促上菜的客人很多的时候,服务员很难记住哪些客人催促过,可能导致客人对饭店留下不良印象,甚至他会把该店印象传达给身边的亲戚和朋友,由此产生的连锁反应,严重影响餐馆,酒店的声誉。
3. 没有全面的经营分析数据,不能高效、全面的分析饭店的经营状况,财务状况,常常影响经营决策的失误,使管理者心有余而力不足。
4. 服务员人工记账,导致账目错误,也无处查询,给餐馆造成不必要的经济损失。
从消费者角度,消费者对餐饮业的要求越来越高,对餐饮业的环境氛围,餐饮方式越来越讲究。
无线点餐系统为消费者提供了一种方便快捷的服务。
从技术角度,随着近几年嵌入式技术的广泛普及与发展,ARM处理器的广泛使用和Linux系统的快速发展,为无线点餐系统奠定了基础。
1.2 研究现状随着网络技术的发展,无线点餐系统涉及红外,蓝牙,ZIGBEE,802.11x 等无线技术,这些新技术的使用标志着我国餐饮业的管理水平有很大的提高。
并且会逐渐成为餐饮行业提高服务效率,降低劳动力成本,增加经营收入,提升餐饮行业的管理理念[1]。
无线点餐系统主要经历了以下几个阶段:1. 以红外技术和单片机为主,短距离无线通信。
这种通信系统距离有限,障碍物影响较大,已逐渐被淘汰。
2. 以蓝牙技术和单片机为主,这种系统虽然已不受障碍物影响,但传输距离仍受限制,且传输速率不高,不适应市场发展的需求。
3. 以ZIGBEE技术为基础,服务器端也需要安装ZIGBEE模块,且组网技术复杂。
4. 以Wi-Fi为代表的802.11x技术和微处理器为主,终端采用Wi-Fi技术,服务器端直接使用通用无线路由器即可,也便于以后产品升级。
由于系统硬件的提高,服务器终端增加了很多附加服务,如广告宣传,餐厅自我宣传,顾客调查,娱乐功能等[2]。
由以上的分析可以得出,现代化餐饮管理大系统中需要无线点餐终端成为其重要组成部分,餐饮业用的点菜系统的差别关键在于无线点餐终端的实现方式不同。
当前市场现有的无线点餐终端产品中,低档产品只能进行简单无线数据传输功能,信息量比较低,菜单只是传统的菜单;高档产品的功能过于复杂,操作起来不方便,并且价格比较贵。
所以市场急需是一种功能恰到好处适合广大餐饮企业、价格适当的中档产品。
……第2章××系统整体方案设计2.1 系统需求分析2.2.1 处理器选型在为本嵌入式系统设计选择处理器时,应考虑以下因素[3]:1. 性能:处理器必须具备足够的性能,并能支持产品的生命周期。
2. 实现:根据具体的应用,需要的处理器可能是高度集成的产品,开发人员需要考虑的是尽可能多的外围硬件,能否只需简单处理就可以连接到处理器上,来减少系统芯片的数量,降低整个系统的开发费用。
3. 工具支持:支持软件创建、调试、系统集成、代码调整和优化的工具对于整个项目的成功非常重要。
4. 操作系统支持:嵌入式系统应用的复杂性要求采用有益的抽象来降低复杂度。
针对所选处理器优化的商用操作系统能够缩短应用开发周期和产品上市时间[4]。
5. 仿真支持:周期精确的仿真技术在某些种类的应用中十分重要,尤其对于数字信号处理,它的大部分功能是依靠仿真技术来验证正确性的。
嵌入式系统的软/硬件协同设计模型也使得处理器仿真器成为开发流程中的一个有用工具。
6. 功耗:许多便携型的嵌入式实时系统是依靠电池供电的。
因此,电池寿命成为系统的一个重要参数。
在这种情况下,应考虑采用针对便携式应用优化的低功耗器件。
无线点餐终端应用于日常手持终端,功耗的大小是不可忽略的一个选择要求。
2.2.2 嵌入式GUI选择嵌入式Linux可供选择的GUI种类繁多,本设计选用了跨平台、面向对象、丰富API的Qt用户界面库。
下面是Qt的简要介绍[5]。
1. 优良的跨平台特性。
Qt支持下列操作系统:MicrosoftWindows95/98,MicrosoftWindowsNT,Linux,Solaris,SunOS,HP-UX,DigitalUNIX(OSF/1,Tru64),Irix,FreeBSD,BSD/OS,SCO,AIX,OS390,QNX等等。
2. 面向对象。
Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。
Qt提供了一种称为signals/slots的安全类型来替代callback,这使得各个元件之间的协同工作变得十分简单[5]。
3. 丰富的API。
Qt包括多达250个以上的C++类,还提供基于模板的collections,serialization,file,I/Odevice,directory management,date/time类,甚至还包括正则表达式的处理功能。
持2D/3D图形渲染,支持OpenGL大量的开发文档,XML支持Webkit引擎的集成,可以实现本地界面与Web内容的无缝集成。
2.2 系统的整体设计方案综合以上分析,本设计的开发平台选用TQ2440开发板,它采用三星公司生产的基于ARM920T的微处理器S3C2440A,这款芯片应用广泛。
操作系统选用内核为Linux2.6.30.4的开源的Linux系统。
由于是嵌入式系统应用,数据库选用了SQLite3,它是一款专门为嵌入式系统设计的。
点餐系统需要一个很好的用户界面,美观,开源,可移植性强,本设计选用了Qt4.5的开源版本,它是嵌入式系统设计中较为流行的图形界面开发工具。
图2-1 无线点餐框图[6]由于电子产品的迅速发展,消费类产品的要求也越来越高,市场上已出现同类产品,但使用Linux 系统的较少,针对此情况,本设计基于已有ARM9开发板,并搭载Linux 操作系统而设计了一款无线点餐系统。
系统框图如图2-1。
……2.3 ××算法推导图像的大部分噪音,比如由敏感元件,量化器等引起的噪音,多半是随机性的,它们对某一像素的影响,都可以看成孤立的,因此与邻近各个点相比,该点的灰度值将显著的不同。
基于此点,可以用邻域平均的方法来消除噪音。
公式(2.1)中,(),f x y 表示(),x y 点的灰度值,T 为设定的一个阈值。
以(),f x y 为中心我们取一个M N ⨯的窗口(N=3,5,7),窗口内像素组成的点集以A 来表示,经图像平滑后,像素(),x y 对应的输出为:1(,)(,)0(,)t f x y T f x y f x y T ≥⎧=⎨<⎩ (2-1)…… 邻域平均法的平均作用会引起图像的模糊现象,模糊的程度与邻域的半径成正比。
如公式(2.2),为了减少这种模糊失真,有人提出了“超限邻域平均法”,即如果某个像素的灰度值(),f x y 大于其邻域像素的平均值T ,且达到了一定的水平,则判断该相素为噪音,用该点邻域像素的平均值代替该点的像素灰度值,公式如下:(,)(,)11(,)|(,)(,)|(,)(,)x y A x y Af x y f x y f x y T N N N Ng i j f x y ∈∈⎧->⎪⨯⨯=⎨⎪⎩∑∑其它 (2-2) 在实际应用中,根据实际情况,可以选择不同窗口大小和窗口形状,比如十字窗,圆形窗。
由于窗口过大,会引起图像的模糊,所以一般常用的是3x3窗口,而且还可以根据不同的图像,对邻域像素取不同的权重,然后再进行平均。
……第3章×××平台设计3.1 开发环境的构建基于Linux的嵌入式系统开发是一个交叉开发过程,其特点是:嵌入式系统为专用计算机系统,其有限资源都是根据应用程序需要而设计的,一般无法满足开发环境运行的需要;PC机使用的大都是x86体系结构,所以PC机开发环境编译产生的目标文件无法在嵌入式ARM平台上运行。
交叉编译就是在一种平台上编译出能在体系结构不同的平台上运行的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,但是这个程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。
用来编译这种跨平台程序的编译器就叫交叉编译器,所以要生成在目标机上运行的程序,必须要建立交叉编译环境。
……第4章××软件设计4.1 信号与槽机制原理信号和槽用于对象间的通讯。
信号/槽机制是Qt的一个中心特征并且是Qt 与其它工具包的最不相同的部分。
在图形用户界面编程中,我们经常希望一个窗口部件的一个变化被通知给另一个窗口部件。
更一般地,我们希望任何一类的对象可以和其它对象进行通讯[3]。
……较老的工具包使用一种被称作回调的通讯方式来实现同一目的。
回调是指一个函数的指针,所以如果你希望一个处理函数通知你一些事件,你可以把另一个函数(回调)的指针传递给处理函数。
处理函数在适当的时候调用回调。
回调有两个主要缺点:首先他们不是类型安全的,我们从来都不能确定处理函数使用了正确的参数来调用回调;其次回调和处理函数是非常强有力地联系在一起的,因为处理函数必须知道要调用哪个回调。
在Qt中我们有一种可以替代回调的技术。
我们使用信号和槽。
当一个特定事件发生的时候,一个信号被发射。
Qt的窗口部件有很多预定义的信号,但是我们总是可以通过继承来加入我们自己的信号。
槽就是一个可以被调用处理特定信号的函数。
Qt的窗口部件有很多预定义的槽,但是通常的习惯是你可以加入自己的槽,这样你就可以处理你所感兴趣的信号[1-4]。
……信号和槽的机制是类型安全的:一个信号的签名必须与它的接收槽的签名相匹配(实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的签名)。
因为签名是一致的,编译器就可以帮助我们检测类型不匹配。
信号和槽是宽松地联系在一起的:一个发射信号的类不用知道也不用注意哪个槽要接收这个信号。
Qt的信号和槽的机制可以保证如果你把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。
信号和槽可以使用任何数量、任何类型的参数。
它们是完全类型安全的:不会再有回调核心转储(coredump) [19]。
当某个事件出现时,通过发送信号,可以将与之相关联的槽函数激活,即执行槽函数代码。
在程序中使用QObject::connect()函数将某个信号与某个槽进行关联,而信号和槽之间的真正关联是由Qt的信号和槽机制实现的。