嵌入式程序设计(精选12篇)
嵌入式程序设计 篇1
摘要:描述基于嵌入式系统的通用软件开发模式与开发过程,包括嵌入式系统开发平台的介绍、开发平台的选择、开发平台的搭建以及交叉编译工具的选择,重点介绍交叉编译的实现过程。设计硬件平台为基于Intel公司的PXA255系列嵌入式开发板,软件平台为嵌入式ARM-Linux操作系统。采用C语言编程,ARM-Linux-GNU工具链进行交叉编译,SDL(Simple DirectMedia Layer)图形库进行绘图,以五子棋游戏为例,设计并实现一个基于图形界面的嵌入式游戏。结果表明,该游戏人机交互界面友好,运行流畅。
关键词:嵌入式系统,交叉编译,嵌入式Linux,SDL
0 引 言
随着近年来计算技术、通信技术的飞速发展,特别是互联网的迅速普及和3C(计算机、通信、消费电子)合一的加速,微型化和专业化成为发展的新趋势,嵌入式产品成为信息产业的主流。嵌入式系统被定义为以应用为中心,以计算机技术为基础,软件硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
嵌入式系统是面向用户、面向产品、面向应用。而广泛用于制造工业、过程控制、通信、仪器、仪表等,消费类产品,如果独立于应用自行发展,则会失去市场。嵌入式处理器在功耗、体积、成本、可靠性、速度、处理能力、电磁兼容性等方面均受到应用要求的制约,这些也是各个半导体厂商之间的竞争热点。
嵌入式处理器的应用软件是实现嵌入式系统功能的关键。软件要求固化存储,软件代码要求高质量、高可靠性。
1 开发平台
一个完整的嵌入式系统结构如图1所示[1],设计中采用的硬件平台为基于Intel Xscale架构的PXA255开发板,CPU运算速度为400 MHz,FLASH为32 MB容量的Intel Strata FLASH,SDRM容量为64 MB,USB Slave支持USB1.1,LCD支持640×480分辨率。
由图1可以看出,一个完整的嵌入式系统不仅包含有硬件平台,还有运行于该硬件平台的操作系统和基于该操作系统的应用软件,而嵌入式Linux只是众多嵌入式操作系统中的一个[2]。
从20世纪80年代末开始,陆续出现了一些嵌入式操作系统,例如比较著名的有Vxwork,pSOS,Neculeus,QNX,ECOS,LYNX,Palm OS和Windows CE,这些专用操作系统都是商业化产品,其高昂的价格使许多低端产品的小公司望而却步;而且源代码的封闭性也大大限制了开发者的积极性。另外,结合国内实情,当前国家对自主操作系统的大力支持,也为源码开放的Linux推广提供广阔的发展前景。再者,对上层应用开发者而言,嵌入式系统需要的是一套高度简练,界面友善,质量可靠,应用广泛,易开发、多任务,并且价格低廉的操作系统。基于以上情况,采用嵌入式Linux操作系统作为开发的软件平台[3]。
2 交叉编译工具链
在嵌入式系统软件的开发过程中,交叉编译工具链是极为重要的一环,设计并制作良好的交叉编译工具链是顺利实现软件开发的重要保障。
2.1 ARM-Linux的gcc交叉工具链
设计采用的Linux操作系统是经过修改与裁剪的ARM-Linux;使用的开发工具是非图形开发工具gcc[4]。gcc交叉编译工具一般情况下需自行制作,制作方法较为简单,这里不做详细介绍。制作一条比较完整的ARM-Linux gcc交叉工具链主要用到如下软件包:
binutils工具包(ftp://ftp.gnu.org/gnu/
binutils);
gcc编译器(ftp://ftp.gnu.org/gnu/gcc);
glibc函数库(ftp://ftp.gnu.org/gnu/glibc);
glibc-linuxthreads包(ftp://ftp.gnu.org/gnu/glibc);
linux内核(ftp://ftp.kernle.org/pub/linux/kernel)。
如果Linux内核低于2.6版本,还应下载相应的内核补丁。(ftp://ftp.arm.linux.org.uk/pub/linux/arm/kernel/v2.4/)。
2.2 SDL图形库
为使程序运行的界面更加友好和美观,在设计中要使用到图形函数接口,这就意味着要向前面的工具链(采用gcc工具链版本为3.3.2)添加第三方的图形函数库。设计中采用的SDL(Simple DirectMedia Layer)图形库为免费的跨平台多媒体应用编程接口,具有丰富的函数库,便于开发者使用[5]。
2.2.1 SDL常用到的开发包
(1) SDL_Image:
提供显示多种格式的图像显示接口,它支持bmp,png,jpeg,gif,tiff等;
(2) SDL_Draw:
提供画点线圆等几何图形的接口(SDL_gfx也含有这样的功能http://www.ferzkopp.net/joomla/content/view/19/14/);
(3) SDL_ttf:
提供显示TTF文字的接口;
(4) SDL_mixer:
提供播放各种声音文件的接口。
把SDL编译到工具链用的并非PC机本身带的gcc编译器,而是要用到第2.1节已经做好了的交叉编译工具链。其中使用的pkg-config工具版本要在0.15.0版本或以上。
SDL以及与SDL安装相关或有依赖关系的软件有:alsa-lib-1.0.15,audiofile-0.2.6,esound-0.2.38,freetype-2.1.9,jpegsrc.v6b,libid3tag-0.15.1b,libmad-0.15.1b,libpng-1.2.22,madplay-0.15.2b,SDL-1.2.12,SDL_draw-1.2.11,SDL_gfx-2.0.15,SDL_image-1.2.6,sdl_mad-0.1,SDL_mixer-1.2.8,SDL_ttf-2.0.9,tiff-3.8.2,tslib-1.3,zlib-1.2.3。
2.2.2 交叉编译的主要步骤
主要步骤为:
(1) 设定环境变量:PREFIX为安装目录;CROSS为ARM-Linux-;PKG_CONFIG_PATH为pkgconfig的路径;ARCH在这里设成ARM;HOST注意要是ARM-Linux,而不是i386-linux(这与前面做ARM-Linux-gcc不一样);BUILD设置为i386-linux。编译时一定要指定CC,NM,AR等变量,让它们跟交叉编译器对应的工具关联起来,否则编译时将会采用PC机Linux的gcc编译器进行编译,不能达到交叉编译的目的[6]。
(2) 按顺序依次编译如下软件:
zlib 编译命令行:
./configure --shared --prefix=$PREFIX;make;make install。
freetype 编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$PREFIX;make;make install。
libpng 编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$PREFIX;make;make install。
libtiff编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX)/usr --without-x --enable-zlib --with-zlib-include-dir=$(PREFIX) /include --with-zlib-lib-dir=$(PREFIX) /lib --with-jpeg-include-dir=$(PREFIX) /include --with-jpeg-lib-dir=$(PREFIX) /lib ;make;make install。
tslib 编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --cache-file=$(ARCH)-linux.cache
--sysconfdir=${PREFIX}/etc --enable-static && ;make;make install。
Libmad 编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX);make;make install
libid3tag编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX);make;make install
madplay 编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX);make;make install
alsa编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --disable-esd --disable-video-directfb;make;make install。
audiofile编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --disable-esd --disable-video-directfb;make;make install。
esound 编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --disable-esd --disable-video-directfb;make;make install。
SDL 编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --with-esd-exec-prefix=$(PREFIX) --disable-video-directfb;make;make install。
sdl_image编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --with-sdl-exec-prefix=$(PREFIX) --enable-sdltest;make;make install。
sdl_tff 编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --with-freetype-exec-prefix=$(PREFIX);make;make install。
sdl_draw 编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --with-sdl-exec-prefix=$(PREFIX);make;make install
sdl_mixer编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --with-sdl-exec-prefix=$(PREFIX);make;make install
sdl_mad 编译命令行:
./configure --host=$(HOST) --build=$(BUILD) --prefix=$(PREFIX) --with-sdl-exec-prefix=$(PREFIX);make;make install
至此,整个工具链就制作完成,打包并做好备份。这个工具链并不限于只用于制作该工具的Linux操作系统上使用,同样可用于别的Linux环境。
3 开发环境设置
嵌入式系统通常为一个资源受限的系统,直接在嵌入式系统的硬件平台上编写软件比较困难,有时甚至是不可能的。一般嵌入式软件开发采用的办法是先在通用计算机上编写程序,然后通过交叉编译,生成目标平台上可运行的二进制代码格式,最后下载到目标平台上的特定位置上运行。
仅安装好Linux系统和开发工具,还没有真正完成设计所需要的开发环境。SDL只是一个图形的函数库,它向上提供图形函数接口,向下调用系统图形引擎来画图。它支持的图形引擎有很多,这里采用Linux内核自带的FrameBuffer,代码简洁,十分适用于嵌入式软件开发。
如果在开发板上的Linux的/dev/目录及其子目录下没有找到fb0或fb1或其他类似名称的设备时,则很有可能正在使用的内核没有FrameBuffer驱动。此时只能重新定制内核,选择对FrameBuffer支持和相关的驱动,再进行内核编译。
4 主要解决问题
对于一个人机对弈的嵌入式五子棋游戏来说,主要应解决图形显示、人工智能算法、键盘事件处理3个问题[7.8]。
4.1 图形显示
图形显示问题包括如何设计友好的人机交互界面;如何将光标和棋子显示在正确的位置上;如何在棋盘移动光标时去掉旧位置上的光标痕迹;如何在光标与棋子叠加时去除光标痕迹;如何进行下棋后的图像处理问题;如何从方形图片得到圆形棋子;如何进行汉字的显示问题等。
由于采用的开发板LCD规格为640×480像素,根据这个规格设计所使用的背景图片、黑棋子、白棋子、光标。为了使界面更加友好,采用图片字体显示,而不使用SDL_ttf中的字体。
棋盘与棋子采用3D效果,黑、白棋子与光标三者的图片大小一致,都是25×25像素,且背景色的色度空间都选用RGB(255,0,255),也就是粉红色。通过调用SDL函数库中的SDL_SetColorKey函数把粉红色作为过滤色。因此在显示这些图片时,看不到粉红色的背景,看起来就像图片做了切割一样。
光标在新的位置重画后,即使使用SDL_UpdateRect函数把整个屏幕都刷新,原来的位置仍然还有光标的图像存在,一直到程序的退出。解决这个问题采用的办法是当光标要在某个位置显示时,先把这个位置上与光标图片大小一样的区域记录起来,再显示光标,当光标移动时,把记录起来的图片重新画回到原来的位置,然后在画光标之前记录新的目标区域,如此重复。
用上面的方法解决光标的重画还存在一些问题,也就是当下棋时,光标离开这个位置时,使用下棋之前所记录的图片来重画了这个位置,结果就是当光标离开时,这个位置的棋子突然消失。一个简单而又实用的方法就是在选择下棋时,同时把棋子画到棋盘还有先前记录区域的图片上。这样就算棋盘上的棋子擦掉了,还可以从记录区域的图片上将它重新画出来。
4.2 对弈算法
对于一个对弈游戏来说,算法的智能性是非常重要的,但高智能的算法往往意味着要花费更多的CPU资源和更多的内存资源[9],而这两项对嵌入式系统来说,往往都是非常缺乏的。
由于嵌入式硬件资源的限制,使用了一个较简单的算法。利用一个15×15的二维全局数组来记录下棋的情况,1表示是人下的棋子;2表示是机器下的棋子,0表示是空位。当机器下棋时,使用4个函数linex,liney,line45,line135从水平、垂直、45°角、135°角4个方向搜索,遇到对手的棋子就把分数加10。记录每个方向上可下棋位置的分数,选择分数高的位置下棋子。
4.3 键盘事件处理
键盘事件响应问题包含如何及时响应键盘敲击,如何得到键值,如何作出正确的响应。考虑到软件的可移植性,没有直接使用Linux系统的事件处理函数来处理键盘事件,而是采用SDL本身的键盘响应事件函数,代码简洁清晰。
5 五子棋游戏设计与实现
main主函数主要调用初始化函数InitGraph( )与控制函数GameControl( ),这两个都是全局函数,返回类型都是void。InitGraph( )主要进行程序初始化和图片装载;GameControl( )是主要的游戏控制函数。
5.1 InitGraph( )函数
InitGraph( )先调用SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO)初始化一个终端屏幕,再使用SDL_SetVideoMode(640,480,16,SDL_SWSURFACE)把它设置成合适的模式。其中的“640,480”表示这是个640×480像素的屏幕;16代表的是色深。
SDL中使用SDL_Surface结构来记录屏幕区域或图片,过程用到的所有图片都使用这个结构来存取。
SDL_CreateRGBSurface函数用来创建一个SDL_Surface实例,而IMG_Load函数则可以把一张图片装载到一个SDL_Surface中去,接着使用SDL_SetColorKey函数来设置透明色,这里把RGB(255,0,255)设置成透明色。因此,显示出来的图片中颜色为RGB(255,0,255)的区域都成了透明的。
SDL_BlitSurface函数用来把一个SDL_Surface的某一部分或全部画到另一个SDL_Surface上去。如果目标SDL_Surface是屏幕,那就是要在屏幕上显示此SDL_Surface,当然要使用SDL_UpdateRect把这个区域刷新一下才能看到结果。因为经常要显示图片和擦除图片,所以这也比较麻烦,再加上要光标移动时不仅要画出光标,更是要在画之前保存这块区域的图片。所以把SDL_BlitSurface包装成一个可以保存区域图片的画图函数——ShowPicture。
5.2 GameControl( )函数
GameControl( )是程序的主要控制模块。SDL_Event是记录事件的数据结构,通过SDL_PollEvent(&event)可以得到键盘和鼠标事件。对event结构的判断可得到想要的按键值和按键的动作。
电脑下棋的位置主要是通过调用ComputerThink函数得到的。ComputerThink函数采用第4.2节的对弈算法,调用linex,liney,line45,line135对某个位置进行水平、垂直、45°角和135°角4个方向的5个棋子内的范围进行扫描。如扫描水平这条线时,先从这个点向左扫描,遇到对手下的棋子把分数加10;遇到自己下的棋子,则停止这个方向的扫描,进而扫描相反的方向。如果这条线上有空地方可以下棋,则记下它的横坐标x、纵坐标y和它的分数。水平、垂直、45°与135°四条线都扫描完后,通过比较这几个可下棋的点的分数,选择分数高的点来下棋。
5.3 ShowPicture( )函数
ShowPicture函数主要用显示图片,这个函数不仅实现了将图片画到屏幕指定的位置,还可以把目标区域备份起来,并可以自动更新屏幕。
5.4 运行结果
设定宿主机ARM-Linux-gcc的路径为/usr/local/arm/3.3.2/bin;sdl-config 的路径为/usr/local/arm/3.3.2/ARM-Linux/bin。交叉编译之前先设置好交叉编译工具的路径,并进行交叉编译。
#PATH=/usr/local/arm/3.3.2/bin:/usr/local/arm/ARM-Linux/bin:$PATH
ARM-Linux-gcc `sdl-config --libs --cflags` -lSDL_image fivechess.c –o fivechess
下载到开发板的运行截图如图2所示。
6 结 语
开发嵌入式软件有基本固定的流程,并需要软硬件平台的相互配合。设计过程中出现的问题有可能是硬件设置的不合理引起的,也有可能是软件代码设计的不合理引起的。
在嵌入式软件开发过程中,工具链的制作扮演了十分重要的角色。一个好的开发工具可以加快软件的开发速度,提高软件的质量。反之,则不但有可能会延长整个产品的开发时间,降低产品质量,严重的话还可能导致整个项目的失败。
基于嵌入式系统的五子棋程序采用标准C语言来编写,其中使用的SDL图形库本身也是个跨平台的图形库,整个程序的可移植性比较高。游戏已经开发完成,运行比较流畅,具有一定的实用价值。
参考文献
[1]刘淼.嵌入式系统接口设计与Linux驱动程序开发[M].北京:北京航空航天大学出版社,2006.
[2]魏洪兴,谌卫军,康一梅,等.嵌入式系统设计师教程[M].北京:清华大学出版社,2006.
[3]于志宏.C/C++嵌入式系统编程[M].北京:中国电力出版社,2001.
[4]范永开,杨爱林.Linux应用开发技术详解[M].北京:人民邮电出版社,2006.
[5]Sam Lantinga.SDL Library Documentation[EB/OL].http://www.sdl.org/download,2005.
[6]Stevens W Rich,Stephen A Rago.Advanced Programming inthe Unix Enviroment[M].Ame-rica:Addison Wesley,2005.
[7]Loki Software Inc.Programming Linux Games[M].Am-erica:Linux Journal Press,2001.
[8]严小卫,莫建文.智能五子棋的设计与实现[J].广西师范大学学报:自然科学版,1999(4):11-14.
[9]张海峰,白振兴,张登福.五子棋中的博弈智能设计[J].现代电子技术,2004,27(7):25-27.
[10]杨雪,罗贤全,马俊涛.基于嵌入式Linux的测试系统软件实现研究[J].现代电子技术,2008,31(6):117-119.
嵌入式程序设计 篇2
Linux为是一个成熟而稳定的操作系统。将Linux植入嵌入式设备具有众多的优点,包括可剪裁和容易移植等,所以Linux操作系统在嵌入式领域获得了广泛的应用。嵌入式Linux一直是嵌入式领域的研究热点,与PC架构不同,嵌入式系统的硬件具有多样性和差异性,嵌入式系统的开发需要对特定系统进行硬件设计,同时还要针对这些硬件来编写驱动程序。Linux内核就是通过驱动程序来同外围设备打交道的,系统设计人员必须为每个设备编写驱动程序,否则设备无法在操作系统下正常工作。设备驱动程序设计的基本概念与模型
设备驱动程序是操作系统内核与机器硬件之间的接口,它为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,设计驱动程序是内核的一部分,可以实现以下功能:
对设备初始化和释放;
把数据从内核传送到硬件,以及从硬件读取数据;
读取应用程序传送给设备文件的数据,以及回送应用程序请求的数据;
检测和处理设备出现的错误。
前面已经提到驱动程序的作用,而编写驱动程序就是构造一系列可供应用程序调动的函数(包括open、release、read、write、llseek、ioctl等)。在用户自己的驱动程序中,首先要根据驱动程序的功能,实现file_operations结构中的函数,不需要的函数接口可以直接在file_operations结构中初始化为NULL;file_operations变量会在驱动程序初始化时注册到系统内部。当操作系统对设备操作时,会调用驱动程序注册的file_operations结构中的函数指针。
以下是嵌入式linux2.4设备驱动程序的最简模型。
具体实现前面定义的函数时,需注意下面几点:
1)在test_init函数中要通过调用register_chrdev()函数来向内核注册字符设备驱动程序。如果是块设备,则还需调用mmmap()进行地址空间的映射,再调用register_blkdev()函数来向内核注册块设备驱动程序,在Linux系统中,对中断的处理是属于系统核心部分,因而如果设备与系统之间以中断方式进行数据交换,则必须把该设备的驱动程序作为系统核心的一部分,也就是说设备驱动程序要通过调用request_irq()函数来申请中断,通过free_irq()函数来释放中断(在test_cleanup中实现)。
2)open()函数和release()函数的具体实现有着一定的对应性,在open()函数中主要是执行打开设备时的一些初始化代码,如果该驱动程序需要管理多个设备,那么还要获取从设备号,根据从设备号来判断需要操作的设备,其中,从设备号可通过调用函数MINOR(inode->i_rdev)来获得,然后再调用宏MOD_INC_USE_COUNT来使得驱动程序使用计数器加1,而在release()函数中则要进行相反的处理。即调用宏MOD_DEC_USE_COUNT来减小驱动程序使用计数器。
3)归根到底,驱动函数的实现就是调用内核所支持的函数(包括内核提供的API和用户自己定义的寄存器操作函数)来完成对设备的操作,虽然嵌入式系统设备的种类众多,不同设备操作的具体实现方法不可能相同,但是Linux操作系统提供了一系列特殊API,为开发内核驱动程序带来了很大的方便,调用这些API时需要注意的是:通常情况下,应用程序是通过内核接口访问驱动程序的(这是驱动程序的主要使用方式),因此驱动程序需要与应用程序交换数据,但是操作系统内核和驱动程序在内核空间中运行,而用户程序在用户空间中运行,用户程序不能访问内核空间,操作系统内核和驱动程序也不能使用指针或memcpy()等常规的C库函与用户空间传输数据,造成这种状况的主要原因是linux操作系统使用了虚拟内存机制,使用了虚拟内存机制后,用户空间的内存可能被换出,当内核使用用户空间指针时,对应的页面可能已经不在内存中了,因此在使用调用函数时要注意:设备驱动程序在申请和释放内存时不是调用malloc()和free(),而调用kmalloc()和kfree();用于内核空间与用户空间进行数据拷贝的函数主要有access_ok()(检查某内存空间是否有权访问),copy_to_user()和put_usr()(内核函数向用户空间传输数据),copy_from_user()和get_user()(用户空间向内核空间传输数据);关于内核空间与I/O空间的数据交换,不同体系结构的处理器对I/O的处理方式也不同,x86系列处理器中,I/O与内存完成不同,它是分开编址的,访问它要使用专用的指令;而对ARM体系结构的处理器来说,则是不区分I/O和内存,统一编址的,可以使用同样的指令访问,在驱动程序中可以使用一系列函数来访问I/O口,如outb()、outw()、outl()inb()、inw()、inl()、outsb()、outsw()、outsl()、insb()、insw()和insl()等。
Linux2.6与2.4内核驱动程序的区别
为了彻底防止对正在被使用的内核模块进行错误操作,linux2.6内核在加载和导出内核模块方面都较2.4内核有所改进,避免了用户执行将导致系统崩溃的操作(例如强制删除模块等)。同时,当驱动程序需要在多个文件中包含 头文件时,不必定义宏来检查内核的版本。与2.4内核相比,2.6内核在可扩展性、吞吐率等方面有较大提升,其新特性主要包括:使用了新的调度器算法;内核抢占功能显著地降低了用户交互式应用程序;多媒体应用程序等类似应用程序的延迟;改进了线程模型以及对NPTL的支持,显著改善了虚拟内存在一定成程度负载下的性能;能够支持更多的文件系统;引进了内存池技术;支持更多的系统设备,在2.4内核中有约束大型系统的限制,其支持的每一类设备的最大数量为256,而2.6内核则彻底打破了这些限制,可以支持4095种主要的设备类型,且每个单独的类型又可以支持超过一百万个的子设备;支持反向映射机制(reverse mapping),内存管理器为每一个物理页建立一个链表,包含指向当前映射页中每个进程的页表条目的指针。该链表叫PTE链,它极大的提高了找到那些映射某个页的进程的速度。
Linux操作系统的设备驱动程序是在内核空间运行的程序,其中涉及很多内核的操作,随着Linux内核版本的升级,驱动程序的开发必然也要作出相应的修改,总之,在linux2.6内核上编写设备驱动程序时具体要注意以下几个方面:
1)Linux2.6内核驱动程序必须由MODULE_LICENSE(“Dual BSD/GPL”)语句来定义许可证,而不能再用2.4内核的MODULE_LICENSE(“GPL”)。否则,在编译时会出现警告提示。
2)Linux2.6内核驱动程序可以用int try_module_get(&module)来加载模块,用module_put()函数来卸载模块,而以前2.4内核使用的宏MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT则可不用。
3)前面给出的字符型设备驱动程序模型中结构体file_operations的定义要采用下面的形式。这是因为在Linux内核中对结构体的定义形式发生了变化,不再支持原来的定义形式。
4)就字符型设备而言,test_open()函数中向内核注册设备的调用函数register_chrdev()可以升级为int register_chrdev_region(dev_t from,unsigned count,char * name),如果要动态申请主设备号可调用函数int alloc_chrdev_region(dev_t * dev,unsigned baseminor,unsigned count,char * name)来完成;原来的注册函数还可以用,只是不能注册设备号大于256的设备,同理,对于块设备和网络设备的注册函数也有着相对应的代替函数。
5)在声明驱动程序是否要导出符号表方面有着很大的变化。当驱动程序模块装入内核后,它所导出的任何符号都会变成公共符合表的一部分,在/proc/ksyms中可以看到这些新增加的符号。通常情况之下,模块只需实现自己的功能,不必导出任何符号,然而,如果有其他模块需要使用模块导出的符号时,就必须导出符号,只有显示的导出符号才能被其他模块使用,Linux2.6内核中默认不导出所有的符号,不必使用EXPORT_NO_SYMBOLS宏来定义;而在2.4内核中恰恰相反,它默认导出所有的符号,除非使用EXPORT_NO_SYMBOLS,因此在上面给出的范例中可以省略去该定义语句。
6)Linx内核统一了很多设备类型,同时也支持更大的系统和更多的设备,原来Linux2.4内核中的变量kdev_t已经被废除不可用,取而代之的是dev_t。它拓展到了32位,其中包括12位主设备号和20位次设备号。调用函数为unsigned int iminor(struct inode * inode)和unsigned int imajor(struct inode * inode),而不再用Linux2.4版本中的int MAJOR(kdev_t dev)和int MINOR(kdev_t dev)。
所有的内存分配函数不再包含在头文件 中,而是包含在 中,而原来的 已经不存在。所以当在驱动程序中要用到函数kmalloc()或kfree()等内存分配函数时,就必须要定义头文件 而不是。同时,前面提到的申请内存和释放内存函数的具体参数也有了一定的改变,包括:分配标志GFP_BUFFER被取消,取而代之的是GFP_NOIO和GFP_NOFS;新增了_GFP_REPEAT、_GFP_NOFAIL和_GFP_NORETRY分配标志等,使得内存操作更加方便。
8)因为内核中有些地方的内存分配是不允许失败的,所以为了确保这种情况下得成功分配,linux2.6版本内核中开发了一种称为“内存池”的抽象。内存池其实相当于后备的高速缓存,以便在紧急状态下使用。要使用内存池的处理函数时,必须包含头文件。内存池处理函数主要有以下几个:mempool_t *mempool_create()、void*mempool_alloc()、void mempool_free()、int mempool_resize();
另外值得一提的是:2.6内核为了区别以.o为扩展名的常规对象文件,将内核模块的扩展名改为.ko,所以驱动程序最后是被编译为ko后缀的可加载模块,在应用程序中加载驱动程序模块时要注意。结语
嵌入式系统软件设计方法应用分析 篇3
【关键词】嵌入式系统;软件设计;应用分析
引言
嵌入式系统是一种以计算机技术为基础,以特定的应用功能为设计目的的一种能够完全嵌入控制件内部的计算机系统。嵌入式应用中虽然有很多像Qt/Embedded、MiniGUI之类的图形界面处理软件或工具包来辅助系统设计,但在很多情况下中却无法使用这些软件或工具包。尤其是近几年来,互联网和移动网络的高速发展, 更是将嵌入式系统的发展带到了一个全新的高度,对嵌入式系统应用的功能性要求也越来越高,给嵌入式系统设计和开发带来了更大的难度。这些应用的软件架构需要一种实用、简捷的设计模式来解决上述设计问题,从而保证系统的可靠性。
1.嵌入式系统的发展历程
1.1 早期的嵌入式系统设计方法,一般是采用“硬件优先”原则。即在只粗略估计软件任务需求的情况下,首先进行硬件设计与实现。
到现在,嵌入式系统的发展已经有了将近四十年的历程,在这四十年当中,嵌入式系统已经陆陆续续的渗透到工程设计、科学研究、军事技术以及网络技术中,成为人们生活所必不可少的一部分。采用这种设计方法,一旦在测试时发现问题,需要对设计进行修改时,整个设计流程必须重新进行,对成本和设计周期的影响很大。而且,随着科学技术以及计算机网络技术的不断发展,对嵌入式系统的功能和运行的可靠性要求也变得越来越高,使得嵌入式系统的设计和开发也变得越来越困难。
1.2 自从在上世纪七十年代最早的嵌入式系统的前身单片机问世之后,经过无数科学研究人员的不懈努力,各种各样的嵌入式微处理器和嵌入式微控制器相继出现,正式标志着嵌入式系统进入了发展阶段,成为了时代发展的一部分。因而出现了软硬件协同(codesign)设计方法,即使用统一的方法和工具协同设计软硬件体系结构,最大限度地挖掘系统软硬件能力,避免由于独立设计软硬件体系结构而带来的种种弊病,来获得高性能低代价的优化设计方案。
2.嵌入式应用系统软件设计的思路
简单版本的嵌入式应用系统在使用的过程中可以不涉及操作系统,但是当应用系统需要设计的功能比较复杂的时候,对系统软件所进行的设计是相当复杂的,当前,嵌入式系统设计人员已将擅长的设计方法发展到用软件来体现系统的部分功能。嵌入式操作系统的引入,在应用系统目标软件和硬件之间架起了一座桥梁,它可以大大减少系统设计的复杂性。
系统体系结构一旦确定,硬件和软件就可以相对独立地进行设计。协同设计的目标是做出恰当的体系结构决策,允许在以后的实现阶段中独立完成。这样,嵌入式操作系统作为应用程序和系统硬件之间的虚拟“视图”,将目标应用软件和硬件系统隔离开来,减少了目标应用软件对底层硬件系统的依赖,这样既增强了应用软件的可移植性,也减少了应用软件设计的复杂性。在设计或者对嵌入式操作系统进行移植的时候,应该将系统对硬件所产生的依赖部分转化到位于底层的设备驱动程序上面,这些设备驱动程序在这个时候只是提供给系统一个虚拟的视图,在此之后再由微内核提供将以上系统合并在一起的有效机制,这样既可以簡化内核所可能拥有的复杂程度,又能够进一步缩减内核可能拥有的体积。为了便于使用,提高系统的可维护性与可扩展性,将目标硬件相关代码封装成软件包的形式,以便开发者定制替换,定制和替换过程只是微内核中虚拟视图的增加与删减,相应只需改变硬件抽象层。嵌入式系统软件的设计,关键是有可用的工具包,在不同的开发阶段需要不同的工具包。在早期嵌入式应用系统软件设计时,首先使用的是内部电路模拟器(ICE)。内部电路模拟器插在微处理器和总线之间的电路中,开发者可以通过它控制所有的输入输出以及微处理器的行为。但是内部电路模拟器是异体,容易引起不稳定。近年来,出现的各种集成开发环境集成了代码编辑器、编译器、连接器、调试器、模拟器等工具,它使开发者可以首先脱离目标硬件环境,快速开发出应用软件原型。
这种平台式开发对基于标准的市场尤其有用,在这种市场中,产品必须支持一些基本功能,其他功能须进行定制。现在,各种各样的硬件开发板,为开发者提供了在与目标硬件兼容的硬件环境中调试应用程序的功能,更加加快了这个进程。
3.嵌入式系统软件设计方法应用
3.1 对软件的实时性进行设计:跟通用软件设计相比,嵌入式系统软件设计对系统的实时性具有很高的要求,只有保证嵌入式系统的实时性,让系统能够在规定时间内对激励做出反应,才能够保证嵌入式系统的正常运行。因此,在软件设计过程中,一定要按照实时性的不同,将软件功能分为实时和分时两个部分对软件的性能进行严格、合理设计,保证嵌入式系统软件的实时性能。
3.2 对软件的可靠性进行设计:为了能够有效保证嵌入式系统运行的可靠性,在对软件进行设计过程中,还需要对软件的可靠性进行合理设计。在对软件进行设计的过程中,一定要在充分考虑嵌入式系统运行特点的基础上,仔细编写功能模块的代码,尽可能避免错误的出现。同时,在编写完功能模块的执行代码之后,一定要立即对其进行试运行,如果发现问题,及时进行解决,以避免集成功能后对系统的运行的可靠性造成影响。
3.3 由于嵌入式设备中的资源有限,只能选择轻量级的Web Server(如:thttpd、boa等),考虑到应用的广泛性,建议选择boa服务器。作为与用户交互的主要方式,Web page力求简洁,并尽可能提供很多的功能接口。这些功能接口基本可以分为两种类型,一种是触发动作功能,主要利用button触发实现现场图片的采集等动作的操作。另一种是文件交互功能,这种功能的实现相对比较复杂,它不仅需要button触发, 还需要一些文本域作为用户配置的传递机制。动态Web交互功能主要通过form窗体来实现,当用户点击功能接口,浏览器将窗体内容通过http协议传输给服务器,服务器再根据form中的action字段来调用相应的CGI文件。
3.4 混合编程,提高软件的执行力:混合编程指的是在软件编程过程中,同时利用汇编语言和高级语言进行编程,这也是当前编程发展的一种主要趋势。在编程过程中,针对不同的编程要求选择不同的编程语言,比如,对一些执行能力要求比较高或者是实时性要求比较高的程序进行编程,应该选择严谨性比较好的汇编语言进行编写,而对于一些对逻辑性要求比较高的程序进行编程,可以选择具有一定智能性的高级语言进行编写。如此以来,就可以同时提高软件的执行力和分析能力,提高嵌入式系统的智能性。
4.结语
嵌入式系统已经成为人们生活的重要组成部分之一,因此,在日常工作当中,一定要对嵌入式系统的设计和开发引起足够重视。而在嵌入式系统中,软件占据着极为重要的组成部分,也是系统设计、开发的重点、难点,所以,在软件设计过程中,一定要从软件的实时性、可靠性以及可拓展性等方面进行综合考虑,对软件进行合理设计。
参考文献
[1]吕骏.嵌入式系统设计[M].北京:电子工业出版社,2012.
嵌入式程序设计 篇4
为了这个培养目标,在进行课程体系设置时,主要是从三个方面考虑:一是电子技术知识,既有模电也有数电;二是计算机编程知识,即软件开发这一块,实现嵌入式程序的设计;三是计算机硬件这一块,能对单片机及一些控制芯片进行应用。其中编程知识的学习,包括第一学年的主干课程《C语言程序设计》,第二学年开设《面向对象编程技术》课程。在嵌入式专业人才培养方案中,并没有限定面向对象编程课程具体讲授哪一种面向对象编程语言,在教学内容上,有这样几种常用的语言是可以选择的:Java语言,这是一种典型的面向对象编程语言,现在应用也比较广泛;再就是C#语言,与C语言有一定的衔接,同样也是面向对象编程,应用也比较多。这两种语言语法简洁、实用,易学好懂,学生容易产生兴趣,教学效果较好。另外一个选择是C++语言。
那么,在这3种语言中,该以哪种语言作为嵌入式专业学生学习面向对象程序设计的样板呢?不妨从如下几个方面作一个比较:
1 与C语言的关系
嵌入式系统编程不同于一般形式的软件编程,它是建立在特定的硬件平台上,其编程语言应具备较强的硬件直接操作能力。当然,汇编语言具备这样的特质。但是,由于汇编语言开发的复杂性,它并不是嵌入式系统开发的一般选择。与之相比,C语言—一种“高级的低级语言”,则成为嵌入式系统开发的最佳选择。
C++和C#,以及Java这3种语言都是面向对象(OOP)的,都使用了类似C语言风格的语法,但C++并不是纯面向对象的,它保留了很多模块化的东西。C++与C的关系更紧密一些。它是基于C发展起来的程序设计语言,是C的一个面向对象的解释。C++为C扩充了大规模工程应用,复杂的系统结构和掌控方法,对C有着很好的兼容性,而C#和Java对C语言没有任何兼容性。
2 语法
Java和C#相对于C++的不同最大的有两点:第一点是他们运行在一个虚拟环境之中,第二点就是语法简单。前二者非常相似,都抛弃了最灵活,同时也是应用起来最复杂的指针问题,不再深入地址单元去执行相关操作,对内存的管理完全自动化,这样虽然带来了程序的稳定性和安全性,但是在某种程序上丢失了效率。
除了语法的相对简单,Java还提供了丰富的类库帮助你解决应用问题———因为它是面向应用的语言,包括多线程标准、JDBC标准、GUI标准,而这些标准在C++中是不存在的。C#没有宏和模板,不允许多重继承,而这些都是C++的重要应用方面。C++语言的强大功能和灵活性是建立在其复杂的语法之上的,因此对于初学者来说,不象C#、Java语言那样容易上手。
3 应用领域
目前,在Web开发上,C++没有多大的市场。在企业级应用软件的开发上,以Java、C#居多,正是这两种语言的简洁实用,使软件的开发周期大大缩短,但这个领域C++仍占有一席之地。在系统级的开发上,C/C++应用居多。这3种语言各有特色。总的来说,C++的应用集中在如下主要领域:
高级系统程序设计:包括操作系统核心、网络管理系统、编译系统、文字排版系统、图像和声音的编排系统、通讯系统、数据库系统等等。在网络软件的设计方面,C++拥有很多成熟的用于网络通信的库,其中最具有代表性的是跨平台的、重量级的ACE库,该库可以说是C++语言最重要的成果之一。操作系统编程中,C语言是主要使用的编程语言,但C++凭借其对C的兼容性,以及面向对象的性质在该领域也崭露头角。
嵌入式系统:近5年来,C语言在嵌入式软件开发中使用最多,同时,C++在嵌入式软件设计领域维持27%左右的占有率。
视频游戏:C++的效率是一个很重要的原因。
在科学计算领域,FORTRAN是使用最多的语言之一。但是近年来,C++凭借先进的数值计算库、泛型编程等优势在这一领域也应用颇多,包括仿真、实时数据获取和数据库访问等等。
另外,在设备驱动程序、分布式应用、移动(手持)设备等领域,C++语言也占据着比较重要的地位。
就Java和C#二者单独来看,C#更像是微软公司和SUN公司进行商业斗争的产物。历史上,微软公司是支持过Java语言的,代表性的产品有Visual J++和WFC。后来因为众所周知的原因,微软公司推出了C#,其目的很明确,就是和Java竞争。
实际上C#和Java在特性上也非常类似(不仅仅是语法)。二者都是为了更加方便地解决应用问题,在GUI、数据库访问、网络通信、多线程等和实际应用密切相关的点上都有成熟的解决方案。C++更多地靠第三方的库来实现这些功能,因为C++是一个国际标准,要在C++中加入这些语言之外的、面向应用的特性还需要很长一段路要走。而C#、Java的拥有者是商业化公司,各种动作自然要敏捷得多。
4 结论
C++可以说是全世界应用最广泛的语言,主流语言中功能最强大,开发平台多,同时它在嵌入式系统开发的作用也是不容忽视的。对于嵌入式专业的学生来说,C++是他们学习面向对象编程课程的最佳选择。
摘要:目前高职高专院校的计算机嵌入式专业,在开设《面向对象程序设计》课程时,选择何种具有面向对象编程特点,同时切合嵌入式专业的编程语言作为教学内容,是设置该课程需要考虑的问题。在对C#、Java以及C++3种面向对象编程的语言进行比较后,选择C++语言最合适。
关键词:面向对象程序设计,Java,C#,C++
参考文献
[1]强锋科技,朱洪波.Visual C++完全自学宝典[M].北京:清华大学出版社,2008.
[2]王斌.常用嵌入式高级编程语言比较[J].蒙自师范高等专科学校学报,2002,4(6).
嵌入式系统设计报告 篇5
班 级:学 号:姓 名:成 绩:指导教师:
20090612 2009112107 侯金钟 武俊鹏、刘书勇 1.实验一
1.1 实验名称
嵌入式系统硬件开发环境
1.2 实验目的
1.熟悉UP-net3000实验平台。
2.超级终端设置及BIOS 功能使用。
1.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
1.4 实验内容及要求
熟悉UP-net3000实验平台的硬件电路和外设,ARM JTAG的安装和使用,利用超级终端检验外设的工作状态。
1.5 实验设计与实验步骤
1.建立工程
(1)运行ARM SDT 2.5 集成开发环境(ARM Project Manager).(2)在新建的工程中,如图1A-2 所示,选中工程树的“根部”。
(3)因为开发板上的嵌入式处理器ARM7TDMI 没有浮点处理器,所以,如图1A-3 所
示,在弹出的对话框中设置Floating Point Processor 为none,并保持其他的设置不变。(4)选中工程树的“根部”,通过菜单Project | Tool Configuration for work1.apj | asmlink | Set,对整个工程的连接方式进行设置。(5)在弹出的对话框中,选中Entry and Base 标签,如图1A-4 所示,设置连接的Read-Only(只读)和Read-Write(读写)地址。
(6)选择Linker Configuration 的ImageLayout 标签,(7)选择Project | Edit Project Tamplete 菜单,弹出Project Template Editor 对话框。
(8)选择Project | Edit Variables for work1.apj,弹出Edit Variables for work1.apj 对话框。
2.进行程序的在线仿真、调试
1.6 实验过程与分析
熟悉UP-net3000实验平台的硬件电路和外设,安装了ARM JTAG,利用超级终端检验了外设的工作状态。
1.7 实验结果总结
软件安装成功,结果显示正常。
1.8 心得体会
通过此次试验,我对ARM的环境的功能有一定的了解与完善。对试验台有了基本的认识与使用。
2.实验二
2.1 实验名称
嵌入式系统软件开发环境
2.2 实验目的
1.熟悉ADS1.2 开发环境,学会ARM 仿真器的使用。
2.使用ADS 编译、下载、调试并跟踪一段已有的程序,了解嵌入式开发的基本思想和过程。
2.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
2.4 实验内容及要求
本次实验使用ADS 集成开发环境。新建一个简单的工程文件,并编译这个工程文件。学习ARM 仿真器的使用和开发环境的设置。下载已经编译好的文件到嵌入式控制器中运行。学会在程序中设置断点,观察系统内存和变量。
2.5 实验设计与实验步骤
(1)运行ADS1.2 集成开发环境(CodeWarrior for ARM Developer Suite)。
(2)在新建的工程中,选择Debug 版本,使用Edit | Debug Settings菜单对Debug 版本进行参数设置。(3)在Debug Settings 对话框中选择Target Settings 项。在Post-linker一栏中选择ARM from ELF。
(4)在Debug Settings 对话框中选择ARM Linker 项
(5)在第四步中如果选择简单的地址连接设置,在Debug Settings 对话框中选择ARM Linker 项
(6)回到的工程窗口中,选择Release 版本,使用Edit | Release Settings 菜单对Release 版本进行参数设置。(7)参照第(3)、(4)、(5)、(6)步在Release Settings 对话框中设置Release版本的Post-linker、连接地址范围、入口模块和输出文件。(8)回到如图1B-3 所示的工程窗口中,选择Targets 选项卡,如图1B-11 所示。选中DebugRel 版本,按Del 键将其删除。DebugRel 子树是一个折衷版本,通常用不到,所以在这里删除。
2.6 实验过程与分析
1)回到工程窗口选中Debug 版本,执行菜单Project | Make 对工程进行编译连接。(2)在ADS 中执行菜单Project | Debug 启动ADS1.2 的调试工具AXD。(3)在AXD 中执行菜单Options | Configure Target 对AXD 进行设置。(4)点Select 按钮选择远程连接为ARM ethernet driver,点Configure 按钮输入仿真器的IP 地址。
(5)等待程序装载完毕以后,通过Execute | Go 菜单以及Execute | Stop(或者工具栏中的相应按钮)运行或暂停程序。程序暂停后在窗口中将显示出程序暂停的位置。(6)通过Execute | Step 菜单(或者工具栏中的相应按钮)可以单步运行程序。
(7)程序停止后可以通过Processor Views | Sources 菜单查看源文件,并可在适当位置按F9 设置端点。
(8)使用在Processor View 菜单下的Registers、Variables 和Memory 命令可以查看工作寄存器或者内存变量。读者可以逐一地尝试,为以后调试程序打下基础。
2.7 实验结果总结
超级终端输出“Hello World!”。
2.8 心得体会
基本了解了ADS1.2的配置条件,学会了ARM仿真器的使用方法。
3.实验三
3.1 实验名称
键盘及LED实验
3.2 实验目的
1.学习键盘及LED 驱动原理。
2.掌握ZLG7289芯片串行接口的使用方法,用ZLG7289芯片驱动17键的键盘和8个共阴极LED。
3.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
3.4 实验内容及要求
通过ZLG7289芯片驱动17键的键盘和8个共阴极LED,将按键值在LED上显示出来。要求从右至左循环显示至少四位数字。
基本功能实现之后可考虑实现从左至右显示四位及四位以上数字(最大八位),并可设置清零键等扩展功能。
3.5 实验设计与实验步骤
利用所给的基础代码进行调试,观察输出结果,结合指导书和教材掌握基本原理和源代码的编写方式。根据实验的要求设计函数流程,并反复调试,实现功能。1.新建工程,将“Exp3 键盘及LED 驱动实验”中的文件添加到工程。2.定义ZLG7289 寄存器(ZLG7289.h)
#define ZLG7289_CS(0x20)//GPB5 #define ZLG7289_KEY(0x10)//GPG4 #define ZLG7289_ENABLE()do{ZLG7289SIOBand=rSBRDR;ZLG7289SIOCtrl=rSIOCON;rSIOCON=0x31;rSBRDR=0xff;rPDATB&=(~ZLG7289_CS);}while(0)#define ZLG7289_DISABLE()do{rPDATB|=ZLG7289_CS;rSBRDR=ZLG7289SIOBand;rSIOCON=ZLG7289SIOCtrl;}while(0)3.编写ZLG7289 驱动函数(ZLG7289.c)4.定义键盘映射表:(Keyboard16.c)
unsigned char KeyBoard_Map[]= {4,8,11,0,0,0,0,0,5,9,12,15,1,0,0,0,6,10,13,16,2,3,0,0,7,0,14,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//64 键值映射表,通过查找键盘映射表来确定键盘扫描码对应的按键值。
5.定义键值读取函数。(Keyboard16.c)6.编写主函数,将按键值在数码管上显示。
3.6 实验过程与分析
利用键盘驱动函数实现基本数字输入,然后利用循环左移函数实现输入数字做一样功能,并通过改变函数中相应delay的值来消除键盘按键带来的抖动。
3.7 实验结果总结
按键值可以在LED上显示出来。要求从右至左循环显示八位数字,同时可以复位清零。达到实验的效果。
3.8 心得体会
通过本次实验,我了解了LED的显示屏幕的数字的移位功能,这个功能不止可以用一个方法实现,而循环左移是其中比较巧妙且省力的一种,在遇到类似情况的时候,可以优先考虑能不能利用到文件中已经存在的函数,这样可以不必自己编写函数,省时省力。是一种可靠的方法。4.实验四
4.1 实验名称
电机转动控制及中断实验
4.2 实验目的
1.熟悉ARM本身自带的六路即三对PWM,掌握相应寄存器的配置。
2.编程实现ARM系统的PWM输出和I/O输出,前者用于控制直流电机,后者用于控制步进电机。
3.了解直流电机和步进电机的工作原理,学会用软件的方法实现步进电机的脉冲分配,即用软件的方法代替硬件的脉冲分配器。
4.了解44B0处理器上中断的应用。5.学习在44B0处理器上中断的应用。
6.进一步熟悉平台外围硬件及其驱动程序的编写。
4.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
4.4 实验内容及要求
1.学习步进电机和直流电机的工作原理,了解实现两个电机转动对于系统的软件和硬件要求。学习ARM 知识,掌握 PWM 的生成方法,同时也要掌握 I/O的控制方法。
2.编程实现ARM芯片的一对PWM输出用于控制直流电机的转动,通过A/D旋钮控制其转动方式。
3.编程实现ARM的四路I/O通道,实现环形脉冲分配用于控制步进电机的转动,通过A/D旋钮控制步进电机的转角。
4.通过键盘控制直流电机与步进电机的切换。5.设置并启动定时器。
6.设置中断,编写定时器中断服务程序,对中断次数进行计数并在LED上显示结果。
4.5 实验设计与实验步骤
1.添加并打开工程。
2.进行直流电机初始化设置和代码编写。3.进行步进电机初始化设置和代码编写。
4.对Timer3编程,编写定时器中断服务程序,完成对中断次数的计数。5.编写LED计数显示函数,使LED能正确计数并显示0-9999。6.编写中断初始化函数和中断响应函数。7.终端下载测试。
4.6 实验过程与分析 1.对直流电机进行编程和测试,掌握转速和旋转方向的设定方法。
2.对步进电机进行编程和测试,掌握ARM的四路I/O通道,实现环形脉冲分配用于控制步进电机的转动,通过A/D旋钮控制步进电机的转角。
3.对主函数进行编程,用键盘响应直流电机与步进电机的切换控制。
4.掌握中断相关语句的应用,弄清定义的中断向量、中断向量号,编写中断响应函数,并完成中断响应控制。
4.7 实验结果总结
实现了直流电机与步进电机的基本设置和控制,可以通过键盘控制电机之间的切换。完成了中断的响应和定时中断。当对其中一个旋钮转动时,就可以由直流电机转换成步进电机的转换,达到实验的效果。
4.8 心得体会
通过本次实验,我了解了直流电机和步进电机的工作原理,同时也知晓了电机间的转换过程,了解其中的道理内涵,熟悉了ARM自带的A/D转换器的工作原理及编程方法,了解了中断的意义和实现方法,实现了简单了中断处理程序。同时我也收获了很多关于ARM处理机的相关知识。
5.实验五
5.1 实验名称
触摸屏驱动实验
5.2 实验目的
1.了解触摸屏的基本概念与原理。
2.理解触摸屏与LCD的关系。3.编程实现对触摸屏的控制。
4.熟悉用 ARM 内置的 LCD控制器驱动 LCD。
5.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
5.4 实验内容及要求
1.了解触摸屏基本原理,理解对触摸屏进行输出标定、与LCD显示器配合的过程。2.通过编程实现触摸两点自动在两点间划直线。3.通过编程实现在触摸屏上动态画出曲线。5.5 实验设计与实验步骤
1.添加并打开工程。
2.在头文件中定义宏和常量及驱动函数。
#define ADS7843_CTRL_START 0x80 #define ADS7843_GET_X 0x50 #define ADS7843_GET_Y 0x10 #define ADS7843_CTRL_12MODE 0x0 #define ADS7843_CTRL_8MODE 0x8 #define ADS7843_CTRL_SER 0x4 #define ADS7843_CTRL_DFR 0x0 #define ADS7843_CTRL_DISPWD 0x3 // Disable power down #define ADS7843_CTRL_ENPWD 0x0 // enable power down #define ADS7843_PIN_CS(1<<6)//GPF6 #define ADS7843_PIN_PEN(1<<5)//GPG5 /////////触摸屏动作//////// #define TCHSCR_ACTION_NULL 0 #define TCHSCR_ACTION_CLICK 1 //触摸屏单击 #define TCHSCR_ACTION_DBCLICK 2 //触摸屏双击 #define TCHSCR_ACTION_DOWN 3 //触摸屏按下 #define TCHSCR_ACTION_UP 4 //触摸屏抬起 #define TCHSCR_ACTION_MOVE 5 //触摸屏移动
#define TCHSCR_IsPenNotDown()(rPDATG&ADS7843_PIN_PEN)(ADS7843_CTRL_START|ADS7843_GET_X|ADS7843_CTRL_12MODE |ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)//采样x 轴电压值,数据为12 位,参考电压输入模式为差分模式,允许省电模式
#defineADS7843_CMD_Y(ADS7843_CTRL_START|ADS7843_GET_Y|ADS7843_CTRL_12MODE |ADS7843_CTRL_DFR|ADS7843_CTRL_ENPWD)int TchScr_Xmax=1840,TchScr_Xmin=176, TchScr_Ymax=195,TchScr_Ymin=1910;//触摸屏返回电压值范围 #defineADS7843_CMD_X 3.校准触摸屏坐标,进行坐标转换。
4.实现触屏取点并显示功能。
将触摸动作及触摸点坐标在超级终端上显示出来。5.实现两点间自动划线功能。6.实现触摸屏动态划线功能。
可以使用TchScr_GetScrXY()函数(第三个参数为0)来获得液晶屏的x、y 方向的电压
范围,分别点触摸屏有效面积的左上角和右下角,得到下列参数:
TchScr_Xmax=1840;TchScr_Xmin=176;TchScr_Ymax=195;TchScr_Ymin=1910;//此数值仅供参考,请以实际校对为准
5.6 实验过程与分析 1.在定义触屏响应功能的函数中对点击触屏进行响应函数的修改,在其中添加修改点颜色的函数,修改得到的触摸点的颜色,并显示在LCD上。
2.获取第一个点坐标并储存,获取第二个点坐标并储存,由编写的划线函数取得储存的两点间直线上所有点的坐标,并对其改变颜色,显示在LCD上,即完成划直线功能。
3.将划线函数应用到响应触屏移动消息的函数下,即可对连续获得的触摸坐标进行连续的画短直线,连接成曲线,完成动态划线功能。
5.7 实验结果总结
了解了触摸屏响应动作消息的函数的工作原理,通过修改实现了触摸屏响应不同动作进行画点、划线、动态划线的功能。验证触摸屏的灵敏度的实验。
5.8 心得体会
通过这次实验,我基本掌握了通过编程驱动触摸屏以及触摸屏响应时间,实现了触摸屏对不同动作消息的响应。同时也知晓了在触摸屏上的描点画线的实现,但是由于不知名的原因,描点画线的误差较大,位置偏差较大,同时触摸屏有时会不灵敏,出现时好时坏的现象,但是由于我们的辛勤钻研,最终克服了这个困难,实现了最后的触摸屏的实现。
6.实验六
6.1 实验名称
UCOS-Ⅱ在ARM微处理器上的裁剪
6.2 实验目的
1.了解UCOS-Ⅱ内核的主要结构。
2.掌握UCOS-Ⅱ裁剪的基本原理与嵌入式编程实现方法。3.学习如何根据具体情况对UCOS-Ⅱ操作系统进行裁剪。
4.通过对UCOS-Ⅱ配置文件(OS_CFG.H)中相关的配置常量进行设置,实现对UCOS-Ⅱ的裁剪。
6.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
6.4 实验内容及要求
对UCOS-Ⅱ内核进行裁剪并移植到ARM7微处理器上。
6.5 实验设计与实验步骤 1.按照要求,载入STARTUP目录下文件,完成系统初始化、环境配置。2.载入UCOS-Ⅱ的全部源码,与处理器架构相关的文件位于arch目录下。3.在os_cpu.h中编写与处理器和编译器相关的代码。
4.编写os_cpu_c.c等6个与操作系统相关的函数。5.编写os_cpu.asm等4个与处理器相关的函数。
6.6 实验过程与分析
按照实验步骤进行,得到了需要的系统。
6.7 实验结果总结
按照要求进行了裁剪,得到了满足需要又紧凑的应用软件系统。
6.8 心得体会
通过本次实验,我了解了UCOS-Ⅱ内核的主要结构,掌握UCOS-Ⅱ裁剪的基本原理与嵌入式编程实现方法,学会了如何根据具体情况对UCOS-Ⅱ操作系统进行裁剪。
7.实验七
7.1 实验名称
UCOS-Ⅱ在ARM微处理器上的移植和编译
7.2 实验目的
1.了解UCOS-Ⅱ内核的主要结构。
2.掌握将UCOS-Ⅱ内核移植到ARM7处理器上的基本方法。
7.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
7.4 实验内容及要求
1.将UCOS-Ⅱ内核进行移植到ARM7微处理器上。
2.编写两个简单任务,在超级终端上观察两个任务的切换。
7.5 实验设计与实验步骤
1.该实验的文件分为两类,其一是 STARTUP 目录下的系统初始化、配置等文件,其二是 UCOS-Ⅱ的全部源码,arch 目录下的 3 个文件是和处理器架构相关的。
2.设置 os_cpu.h 中与处理器和编译器相关的代码。
3.用 C 语言编写 6 个操作系统相关的函数(OS_CPU_C.C)。4.用汇编语言编写 4 个与处理器相关的函数(OS_CPU.ASM)。5.编写一个简单的多任务程序来测试一下移植是否成功。6.编译并下载移植后的 UCOS-Ⅱ。
7.6 实验过程与分析
1.按照实验步骤进行,将µC/OS-II 内核移植到了ARM7 微处理器上。2编写了两个简单任务,在超级终端上观察两个任务的切换。
7.7 实验结果总结
将µC/OS-II 内核顺利移植到了ARM7 微处理器上。
7.8 心得体会
通过本次实验,使我更加了解了µC/OS-II 内核的主要结构,掌握了ARM的C语言和汇编语言的编程方法,了解了ARM7处理器结构,掌握了将µC/OS-II 内核移植到ARM 7 处理器上的基本原理与嵌入式编程实现方法。
8.实验八
8.1 实验名称
综合实验
8.2 实验目的
对前七次实验进行总结,应用之前所学的知识,将前几次实验内容结合起来,完成键盘,LED,触摸屏,直流电机,步进电机各种功能的组合。实现一个较为全面的功能结构。
8.3 实验环境
硬件:ARM 嵌入式开发平台、用于ARM7TDMI 的JTAG 仿真器、PC 机Pentium100 以 上、串口线。
软件:PC 机操作系统win98、Win2000 或WinXP、ARM SDT 2.51 或ADS1.2 集成开发 环境、仿真器驱动程序、超级终端通讯程序。
8.4 实验内容及要求
对前七次实验进行总结,应用之前所学的知识,完成自拟的嵌入式系统,要求综合前期基础实验的各种功能。
8.5 实验设计与实验步骤
1.添加并打开工程。2.进行LCD设计,在LCD显示屏输出文本。
3.进行LED及键盘设计,完成LED输出显示功能和键盘输入功能。4.进行电机控制设计,完成键盘控制电机转动功能。5.进行中断设计,完成定时中断功能。
6.进行触摸屏设计,完成触摸屏感应和划线功能。7.进行裁剪和移植功能设计和完成。
8.6 实验过程与分析
1.完成LCD显示功能,在LCD显示屏上输出文本:“Hello World!”。2.进入界面触屏控制选择功能,实现触屏选择功能。
3.自定义四种种功能,第一为电机控制,从键盘读取命令,并将功能编号显示在LED上,LED显示的是计数的数据,同时旋转按钮完成电机转速的控制选择。
4.第三种功能为划线,功能编号显示在LED高四位上,同时LCD屏幕清屏,为划线功能做准备,可以实现划线功能。
5.第四种功能为定时中断,当由键盘控制时,LED显示数值清零,实现了中断。6.实现裁剪与移植功能。
8.7 实验结果总结
完成了各种基本功能,并通过自拟的系统将各种功能整合起来,完成了一个小的嵌入式系统,对前七次的功能有了更深入的了解。通过LED的计数,当在计数值在前30秒之内,由键盘控制LED的数值及显示,按键盘上的某一个按键,实现对LED上的数值清零,后30秒由触摸屏控制清零,并且在前30秒之内,旋转按钮,实现对直流电机的运转,并且到步进电机的转换。
8.8 心得体会
嵌入式系统低功耗设计研究与实现 篇6
【关键词】嵌入式;系统;低功耗;研究
一、嵌入式系统设计
嵌入式系统由软件模块以及硬件模块组成,其中软件模块需要在硬件模块中运行才可以实现其功能。嵌入式系统中的硬件部分是嵌入式系统的基础部分,主要提供嵌入式系统的I/O端口、外设接口等,而软件是嵌入式系统的控制核心,通过运行,给硬件提供指令,指示硬件进行相应的动作,也就是说软件必须在硬件部分上运行,才可以起到很好的作用。
二、嵌入式系统趋向低功耗的必要性
1.节能的需求
嵌入式系统是一个相对复杂的系统,各个模块工作时工作量是很大的,这就需要电源供应正常,保证系统的正确运行。而随着系统的不断扩大,各个模块会造成更大的功耗,因此,为了更有效的利用嵌入式系统,延长嵌入式系统的工作时间,需要采取节能措施。
2.增强抵抗能力
在嵌入式系统工作的过程中,难免会受到外界的干扰,特别是嵌入式系统中敏感电子元器件,更应该做好防磁的措施,如果处理不当,不能很好的增强抵抗力,将严重影响系统的正常工作。嵌入式系统的功耗越高的话,电磁辐射能量就会越大,这样嵌入式系统自身以及外设都会受到影响,造成精度的降低。
三、利用嵌入式系统硬件设计方法降低功耗
对于嵌入式系统而言,硬件功耗问题是主要原因,对于嵌入式系统低功耗设计的影响因素最大,处理好硬件低功耗设计,会对嵌入式系统低功耗做出重大贡献。
1.优先选择低功耗芯片、元器件
在嵌入式系统工作的过程中,芯片元器件对电源的消耗非常的大,因此,在嵌入式系统设计前,对于元器件的选择,除了满足设计性能指标的需求,还需要满足功耗问题,尽量选择低功耗芯片。现在比较成熟的工艺主要有两种,一个是TTL工艺,另一种是CMOS工艺,其中CMOS工艺耗能很少,可以优先选择。对于芯片的设计或者焊接时,需要注意的是芯片引脚不要出现悬空端,悬空端容易引进外界噪声信号,对嵌入式系统的电源会产生很大的影响,造成高低电平的转换。在默认的情况下,如果高低电平转换,功耗会很大,这个时候,最好选择高电平输出,确保耗能降到最低。
2.采用不同步供电技术
一个完整的嵌入式系统包含很多部分,比如说包含AD采样、DA转换、UART异步串行通信等等,这些模块在系统工作时不会同时工作,有可能在进行完一个模块后才进行下个模块,为了降低功耗,可以选择不同步,即采取分时方法,当某一模块工作完后如果需要隔很长时间才会再执行操作,那就可以选择执行完后将此模块设置为休眠状态,从而降低功耗。
3.合理利用I/O端口资源
嵌入式系统工作时,需要频繁的使用I/O口,I/O口在输出的情况下可以输出约为20mA的电流,对于次,可以采取有效的措施,很好的利用这一电流,对其他外设采取供电的办法,当然,外设对电流的需求需要小于20mA。采取这种办法,可以很好的利用这一资源,得到充分的利用,更好的降低功耗。
4.加强智能电源设计工作
解决好嵌入式系统低功耗的问题,需要注意的就是减少耗能问题,而解决好耗能问题,还可以从另一个角度解决,优化电源设计,趋向于智能化方向发展。在智能电源中安装自动检测芯片,这样可以确保系统处于不同的情况下时,采取不同的策略,及时的做出处理,这样就可以对CPU以及外设模块采取不同的处理措施。比如说,当系统在外部正常供电时,这个时候电源供应可以采取正常供电的方法,提供正常的工作频率,保证电压的正常使用;而如果电源模块检测到系统工作在外部电池状态下,那这个时候,根据检测的结果,可以降低系统主频率,将电压降低到最小运行值,确保嵌入式系统工作在低功耗的状态下。
四、利用嵌入式系统软件设计方法降低功耗
1.减少编译运行时间
嵌入式系统的工作离不开软件的执行,一个小模块的正常运行往往需要很多条代码执行编译。嵌入式系统在运行中需要几个模块先后都运行,也就是说,需要大量的代码执行编译过程,这样的话,就会直接造成功率极大消耗。针对于此,可以对程序进行优化,因为代码有单周期、双周期、四个周期之分,对代码优化,尽量选择与底层密切、周期短的指令,这样,程序代码在编译的过程中,会提高处理速度,降低功耗。一般来讲,低级语言,比如说汇编语言,相对高级语言,比如说C语言、C++语言功耗要低很多。
2.鼓励使用软件代替硬件,硬件代替软件的方法
嵌入式系统在执行某个指令或者为了实现某个功能某块时,可以既选择硬件模块实现,也可以用软件方法实现,比如说软件程序FIR滤波与硬件设计模拟低通滤波,这两种方法都可以实现滤掉高频信号,确保低频信号全部通过。这个时候,可以比较这两种方法,哪一种最优,最节省功耗。软件中处理器需要时间,编译消耗功率,而硬件中电路工作也会消耗功率,因此,通过比较,可以做出最佳选择。
3.采用快速运算处理的计算方法
嵌入式系统在处理接收到的数据时,往往需要大量的运算,才会得到期望的结果。为了有效的降低功耗,提高处理速度,对一些算法可以进行优化。比如说在进行DFT傅立叶变换时,传统的思想是利用DFT设计,求出结果,但是这种设计相对FFT快速傅立叶变换而言,运算量大,时间也很长,这个时候就可以采用FFT的方法。在进行设计时,对各种算法都进行充分比较,在需求的精度都满足的情况下,优先选择算法处理快的。
4.软件设计建议多采用中断程序
嵌入式系统在工作时,当系统上电初始化时,主程序只会实现系统的初始化,这其中包括各个模块寄存器的初始化,外部设备的初始化。对于系统软件降低功耗,还可以采取的办法就是当程序没有动作需要执行的时候,可以将系统设置在低功耗状态,而当系统有动作要发生时,这个时候,可以利用中断程序,让系统跳到要执行动作的程序中,也就是说此时仅仅中断程序会消耗功率,其他模块不会。待中断程序执行完之后,系统继续回到低功耗的状态,节省电量的消耗。
五、结束语
随着社会的发展,科技不断进步,嵌入式系统日益趋向于智能化、自动化方向发展。在各行各业中,嵌入式系统都得到了很好的应用。不过随着功能的增强,应用增多,电源供应成了问题,很多嵌入式系统的耗能都很严重。考虑到嵌入式系统由软件以及硬件两大部分组成,因此,为了降低嵌入式系统的功耗,可以通过硬件措施以及软件措施,实现目的。对硬件方法主要考虑到硬件的电源、芯片选择以及I/O的有效利用;而对于软件而言,主要就是对程序进行很好的优化,充分将软件与硬件结合,只有这样,才能更好的解决嵌入式系统的功耗问题,促进嵌入式系统更好的发展。
参考文献
[1]郑杰.嵌入式系统中的低功耗设计[J].设计技术,2005(2).
[2]王怀瑞.嵌入式系统中的低功耗设计研究[J].河北省科学院学报,2008(4).
[3]王志超.基于硬件构件的嵌入式系统低功耗研究[J].信息化研究,2010(5).
[4]杨天池.嵌入式系统的低功耗设计[J].仪器仪表学报,2006(6).
[5]张健.嵌入式系统低功耗电路设计[J].光电技术应用,2005(6).
[6]姚伟.嵌入式系统低功耗软件技术研究[J].计算机技术与发展,2011(1).
[7]文桦.嵌入式系统低功耗设计研究[J].嵌入式技术,2009(5).
嵌入式程序设计 篇7
数据库几乎是每个较大的软件所必须应用的, 在嵌入式设备中, 由于可使用的资源很有限, 这就要求使用的数据库安装后占用的文件系统的空间要少, 而且所使用其他资源也有很大限制, 这也与开发者使用的数据库有很大冲突。SQLITE是Qt提供的一种进程内数据库, 小巧灵活, 无须额外安装配置且支持大部分ANSI SQL92标准, 是一个轻量级的数据库。Qt为数据库访问提供的Qt Sql模块实现了数据库和Qt应用程序的无缝集成, 同时为开发者提供了一套与平台无关和具体所用数据库均无关的调用接口。这使得开发者只需掌握基本的SQL语句, 就能进行简单的数据库应用程序开发。
一、Qt 中数据库
Qt中使用QtS ql模块实现了对数据库的完美。Qt Sql模块由驱动层 (实现了特定数据库与SQL接口的底层桥接) 、SQL接口层 (提供了数据库类的访问) 和用户接口层 (提供从数据库数据到用于数据库表示的窗体的映射) 3部分组成, 各部分由不同的Qt类支撑。Qt Sql模块为不同层次的用户提供了丰富的数据库操作类, 只要熟悉这些类的结构和功能, 就可以方便使用, 同时还支撑常用的数据库模式, 如主从视图和上下钻取等模式。
Qt Sql模块使用驱动插件 (driver plugings) 与不同的数据库接口通信。由于Qt中的SQL模块的应用程序接口与具体数据库无关, 因此所有与数据库相关的代码均包含在这些驱动插件中。配置Qt时, 可以选择将SQL驱动内置于Qt中或编译成插件。
二、Qt 中数据操作
1、连接数据库
在进行数据库操作前, 必须建立与数据库的连接。Qt提供了QSql Database类完成连接, 连接过程需要指定驱动器、连接名、主机名、数据库名、用户名和密码, 然后使用open函数打开连接。同时, 在使用数据库时, 在Qt工程环境中需要进行相关的配置。具体配置如下:
(1) 环境配置:如果想要使用Qt Sql模块, 则必须对工程进行配置:
1在工程文件上加入一行:QT+=sql
2在头文件中加入语句:#include<QtSql/QtSql>
(2) 本地数据库查询:通过以下语句:
QStringL ist drivers=QSqlD atabase::drivers () ;
q Debug () <<drivers;命令查看Qt中包含的数据库
QSql Database db=QSql Database::add Database ("QSQLITE") ;
q Debug () <<"driver valid?"<<db.is Valid () ;相关的驱动是否有效。
查看结果如下所示:
(3) 数据库连接:
数据库连接由任意字符串表示, 如果没有指定连接的情况下, QSql Database可以提供默认的连接供Qt其他的SQL类使用。建立数据库连接的语句如下:
数据库连接成功如图所示:
2、数据库遍历操作
Qt中仍然支持常用数据库操作的SQL语句。在Qt中, QtSql模块中的QSql Query类提供类一个执行SQL语句的接口, 并可以遍历执行的返回结果集。如果不使用SQL语句进行数据库操作, 可以利用QSqlQ ueryM odel和QSqlT able Model类等进行数据库操作, 而且可以将结果在表格中显示出来。
(1) 使用SQL语句操作数据库
数据库连接成功后, 首先要创建数据库表, 利用SQL语句操作:
QSql Query query
query.exec ("create table information (id int primary key, ""name varchar (20) " "sex varchar (10) ") ;
然后向表中插入记录, 利用SQL语句操作:
query.exec ("insert into information values (0, 'Jhon', ’man’) ") ;
query.exec ("insert into information values (0, 'Alic', ’woman’) ") ;
最后, 对数据库表进行遍历操作, 利用SQL语句, 如插入记录、显示表记录、查询、定位等。
(1) 插入一条记录
query.prepare ("insert into information (id, name, sex) ""values (?, ?, ?) ") ;
query.bind Value (0, 5) ;
query.bind Value (1, "Lin") ;
query.bind Value (2, "woman") ;
(2) 显示全部记录
query.exec ("select * from information") ;
while (query.next () ) {
q Debug () <<"row Num:"<<query.at () <<"id:"<<query.value (0) .toI nt () <<"name:"<<q uery.value (1) .to String () <<"sex:"<<query.value (2) .to String () ;}
(3) 查询定位第二条记录
if (query.seek (2) ) {
q Debug () <<"row Num:"<<query.at () <<"id:"<<query.value (0) .toI nt () <<"name:"<<query.value (1) .to String () <<"sex:"<<query.value (2) .to String () ;
(4) 最后一条记录
if (query.last () ) {
q Debug () <<"row Num:"<<query.at () <<"id:"<<query.value (0) .toI nt () <<"name:"<<query.value (1) .to String () <<"sex:"<<query.value (2) .to String () ; }
运行结果如图所示:
(1) Qt类机制操作数据库
Qt中使用了自己的机制来避免使用SQL语句, 提供了更简单的数据库操作和数据显示模型。分别是只读的QSql QueryModel, 操作单表的QSqlT able Model和以及可以支持外键的QSqlR elationalT ableM odel。QSqlQ uery Model类为SQL的结果集提供了一个只读的数据模型。
(1) 利用QSqlQ uery Model类对数据操作
1在窗口中显示表数据操作
具体操作步骤:首先新建QSqlQ uery Model类对象modelQuery, 并利用SQL语句查询整个information表的内容;然后设置了表中属性显示时的名字;最后建立了一个视图view, 并将这个model模型关联到视图中, 这样数据库中的数据就能在窗口上的表中显示出来了。操作代码如下所示:
运行结果如图所示:
2表数据操作
包括显示表数据中行列数、显示一条记录、插入记录等操作。
运行结果如下所示:
QSqlQ uery Model这个类模型默认是只读的, 所以在窗口上并不能对表格中的内容进行修改。要想使其可读写, 需要自己的类继承自QSqlQ ueryM odel, 并且重写set Data () 和flags () 两个函数。如果我们要改变数据的显示, 就要重写data () 函数。或者利用QSqlT able Model类对数据进行操作。
(2) 利用QSqlT able Model类对数据库操作
QSql Table Model *model=new QSql Table Model (this) ;
model->set Table ("information") ;// 添加表
model->set Edit Strategy (QSql Table Model::On Manual Submit) ;// 提交模式, 手动操作
model->select () ;// 选择数据表
table View->set Model (model) ;// 在QTable View类对象中显示
QSqlR elationalT ableM odel与QSqlT able Model没有太大 区别, 该类为单张的数据库表提供了一个可编辑的数据模型, 它支持外键。
三、Qt 数据库综合应用
按照上述描述方法设计数据库程序, 在Qt进行数据连接, 然后创建数据库表, 在利用Qt中QSqlT able Model类模型对数据库进行增加、删除、提交数据库、撤销、排序及查询等操作。操作界面如所示:
(1) 增、删、提交更新操作
(2) 排序操作
(3) 查询和恢复查询操作
最后, 将Qt移植到开发板上, 配置交叉环境及编译器arm_linux_gcc, 然后将应用程序通过交叉编译器编译, 再将交叉编译后生成的可执行文件移植到开发板上, 这样开发的应用程序可以在开发平台上启动运行。
四、总结
针对嵌入式系统下的数据库设计问题, 利用Qt设计界面, 然后采用Qt提供的Qt Sql模块实现了数据库的设计。利用QSqlD atabase实现数据库连接, QSql Query实现数据库表的创建和添加记录, QTableM odel进行数据表的操作, QTable View实现数据库表的显示, 最后实现嵌入式下的数据库开发与设计。
参考文献
[1]张治国, 董西广.基于Qt平台的数据库编程[J].福建电脑, 2011: (3) :165-167.
[2]王栋财, 梁隆恺, 韩改宁等.基于嵌入式媒体播放器的设计与开发[J].软件工程师.2014:17 (6) 17-18.
[3]Jasmin Blanchette, Mark Summerfield.C++GUI Programming with Qt4[M].Prentice Hall, June, 2006.
嵌入式程序设计 篇8
尼葛洛庞帝曾预言,嵌入式智能电脑将是继P C和Internet后的最伟大发明。嵌入式Linux(Embedded Linux)是指对标准Linux经过小型化裁剪处理之后,能够固化在容量只有几KB或者几MB字节的存储器芯片或单片机中,是适合于特定嵌入式应用场合的专用Linux操作系统。随着我国电子信息产业的迅猛发展,嵌入式32位微处理器在工业领域的应用越来越广泛。而Linux与嵌入式处理器的结合正日益被人们看好,Linux具有内核小,效率高,源代码开放等优点,还内含了完整的TCP/IP网络协议,很适合作为嵌入式操作系统使用[1]。
嵌入式Linux操作系统与外设通信是通过设备驱动程序来实现的。本文以A/D驱动程序编写为例,介绍Linux下的驱动程序的编写。
1 驱动程序的设计
嵌入式Linux操作系统是通过各种驱动程序来驾驭硬件设备的,它为用户屏蔽了各种各样的设备,驱动硬件是Linux操作系统最基本的功能,并且提供统一的操作方式,即系统调用。驱动程序是连接应用程序与具体硬件的桥梁。Linux支持三类硬件设备:字符设备、块设备和网络接口。
编写设备驱动程序,我们所要做的是为相应的设备编写几个基本接口函数(open,read,write,release),并向操作系统内核注册即可。当上层应用要使用该设备时,内核就会调用相应的设备操作函数。设备驱动通过特定的接口与内核中的其他部分相互作用。下面介绍驱动程序编写的常见模块。
1.1 主设备号定义
#define MAJOR_NUM 254//主设备号
主设备号标识设备对应的驱动程序。
次设备号由内核使用,用于正确确定设备文件所指的设备。
1.2 设备驱动程序接口
1.3 注册和注销模块
1.3.1 设备注册模块
1.3.2 设备注销模块
1.4 基本入口点设备函数的具体实现
1.4.1 设备打开模块
1.4.2 设备读取模块
1.4.3 设备释放模块
1.5 module_init和module_exit宏
module_init(ADCdrv_init);
module_exit(ADCdrv_exit);
Linux Kernel
module_init和module_exit这两个宏定义于
2 结束语
Linux的驱动开发调试有两种方法,一种是直接编译到内核,再运行新的内核来测试;二是编译为模块的形式,单独加载运行调试。模块方式调试效率很高,可以使用insmod工具将编译的模块直接插入内核,也可以使用rmmod从内核中卸载模块,从而不需要重新启动内核,这使得驱动调试效率大大提高[2]。
摘要:阐述了嵌入式Linux设备驱动程序的设计原理,并以A/D的驱动程序为例详细说明了驱动程序编写的要点。
关键词:嵌入式Linux,设备驱动程序,A/D转换
参考文献
[1]孙琼.嵌入式Linux应用程序开发详解[M].北京:人民邮电出版社,2006.
嵌入式程序设计 篇9
1 嵌入式软件
随着社会不断朝着信息化的方向发展,计算机在人们日常生活中的重要性越来越突出。在计算机软件设计中,由于嵌入式软件具有较强的稳定性,并且操作简单,深受计算机行业人士的喜爱。嵌入式软件在计算机软件设计中也有着重要的地位,不仅能够大大地提高软件产品的质量,还能够避免软件产品中的问题及不足。在计算机软件设计的时候,可以以嵌入式软件的执行预测、缓存机制及动态分配为基础,优化计算机软件实时处理功能。嵌入式软件在计算机软件设计中主要是硬件处理及软件处理两方面的应用,在计算机软件设计中,要以系统为支撑,然后通过程序员编写程序。在此过程中对多个任务进行同时处理的系统就是嵌入式处理器。嵌入式处理器能够在极短的时间内处理多个任务,并且还能够实时保存信息资源。嵌入式软件有两个优点,其一,由于嵌入式软件的模块化,它可以检测软件并且对其进行修复;其二,嵌入式软件可扩展软件处理器,在计算机进行软件设计和操作的时候,可以使用最低的功率进行,使嵌入式软件的优势可以最大程度地得到发挥,嵌入式软件在计算机软件设计中有着主导作用[1]。
2 在计算机软件设计中的应用
在计算机软件设计中使用嵌入式软件涉及了多个领域,可以大大缩短软件设计中的时间并提高软件设计的效率。
2.1 原理
嵌入式软件和计算机软件存在着一定程度的区别,所以也就导致了嵌入式软件在计算机软件设计运行原理中存在差异的原因。嵌入式软件在计算机软件设计中的预测指令、缓存机制及动态分配等功能中有着重要的作用,它可以在保证计算机软件设计的操作基础上提高软件设计的安全性。虽然嵌入式软件和计算机系统有所差异,但是两者还有一定的相同点:在设计中都要考虑软件设计及硬件设计。软件包括操作系统及程序编写系统,硬件包括输入/输出设备、存储器、外设、处理器等。计算机软件设计中,是由应用程序对系统的操作进行控制,操作系统对程序的编程及硬件进行控制。另外,嵌入式微处理器是嵌入式软件的核心,如今在计算机软件设计中普遍应用的是ATg IRM9200处理器。在软件设计中,模块的设计是核心内容,它的设计质量决定了计算机软件设计是否可操作,也决定了计算机软件设计是否安全[2]。
2.2 开发步骤及设计
2.2.1 嵌入式软件的开发依据
在计算机软件设计中应用嵌入式软件的原理主要是计算机在处理紧急的软件时,嵌入式软件可以利用实时处理功能构建CORBA模型【3】。另外,嵌入式软件还能运用远程调控功能为计算机软件设计提供多种设计任务,降低计算机软件设计的时间,提高计算机软件设计效率及质量。以CORBA模型为例子,研究嵌入式软件在计算机软件设计中的应用,探索嵌入式软件是否可以对计算机软件设计进行创新及完善。
2.2.2 开发步骤
在计算机软件设计中使用嵌入式软件,可以有效提高计算机软件的设计水平,优化计算机软件的开发流程,进一步提高软件系统的可靠性。在计算机软件设计中使用嵌入式软件的时候,首先就要确定软件的开发流程,全面了解计算机中的软件及硬件结构,使两者能够分离,使软件不再依靠硬件,从而提高计算机软件的安全性及可靠性。应用嵌入式软件还能初始化计算机软件中的数据,并格式化计算机软件中的数据结构,为了能够使计算机软件中的设计能够更加完善,可以直接对软件及硬件进行操作。嵌入式软件的开发流程如图1所示。
嵌入式软件的开发流程的步骤分为:(1)全面掌握计算机软件系统的需求,并且对其进行分析了解;(2)根据计算机软件的需求,程序员就可以编写程序代码;(3)对软件性能进行测试,并且对测试结果进行分析,从而能够优化计算机软件设计。由此可见嵌入式软件的开发流程是比较简单的,这也为计算机软件提供了可靠性的保障。在软件设计中,应该着重注意软件数据的初始化工作和格式化工作[4]。
2.3 嵌入式软件在计算机软件设计中的应用
2.3.1 对计算机软件多任务进行划分
嵌入式系统中的应用软件可以保障系统功能的完善,并且还肩负着资源管理及任务间的通信责任。对软件的资源管理及任务通信进行实现的是计算机系统中的微内核,其也是计算机软件的基础程序。应用嵌入式软件,就要对软件不断地进行优化设计及协调,并且优化嵌入式RTOS模型,使软件系统中的任务可以独立工作。
对计算机软件中的任务进行划分,需要将数据进行转换,之后再进行分析应用程序。影响任务划分主要是由于应用系统数据通信之间的异步关系,其可以从两方面进行考虑:(1)系统中的输入/输出系统。输入/输出系统中的驱动要以软件系统中的应用程序及中断为基础才能够实现,其中应用程序就占了CPU大部分的空间,所以就要通过中断以此来提高计算机软件中的实时性及实用性;(2)软件系统内部功能。计算机软件系统中的并行任务有周期任务、应用控制任务及用户接口任务等等,为了将这些任务合为一个任务,就要对任务的激活进行全面考虑。为了能够使计算机软件设计流程更加简单,可以使用同一种事件驱动,来提高软件的资源共享[5]。
2.3.2 存储映像布局及任务组织
在对系统应用功能划分为多个独立任务之后,就要对其进行组织,组织任务的方式主要是以各个任务之间的关系为基础进行的,这些任务的组织及管理功能与嵌入式操作系统有着一定的联系。另外,由于嵌入式操作系统并不完善,所以就要应用程序保存在Flash或者ROM中。为了之后操作系统可以正常运行,就要在组织任务的时候对其进行科学的安排,并且对计算机软件中的系统布局进行优化及完善。软件系统布局主要重点考虑存储映像布局和物理零地址存储器,系统在加电之后,可以在物理零地址上设置代码。嵌入式软件中的应用系统是由ROM启动,物理零地址可以存储计算机系统中的向量。此方式最大的优点就是简单快捷,能够提高处理器在调取向量的速度。
2.3.3 任务调度及实时性应用
在计算机软件设计中应用嵌入式软件,要重点考虑嵌入式系统的实时性,主要分为两方面:(1)软实时性。主要是使系统能够在规定的时间内完成任务,如果没有完成可以延迟;(2)硬实时性。主要是使系统能够在规定的时间内完成任务,如果没有完成,则会有严重后果。所以计算机软件系统的调度应该采用优先的方式,这种方式主要是指微内核可以根据系统中的紧急任务来对软件系统进行优先顺序的安排,并且可以根据不同的优先等级对系统进行划分,以使响应时间可以有效降低[6]。
2.3.4 初始化系统
在计算机软件设计中使用嵌入式软件,还要重点考虑对系统的初始化及执行。编写初始化系统代码是在嵌入式系统的微内核及硬件抽象层中的,主要是对系统进行初始化及引导。与计算机软件系统不一样的是其并没有BIOS系统,所以,开发软件的工作人员就要设计方案来引导系统和编写初始化代码,对这些代码进行执行之后,再进行工作,比如存储系统的初始化、RAM变量的初始化及设置异常中断向量等等。最后再通过设置相应的指令来缓冲嵌入式软件系统,随后进入系统进行调度。
2.3.5 时钟通信及任务
计算机软件设计的时候要注重考虑时钟服务,在嵌入式软件中也有时钟,通常是以“lick”形式出现。所以在计算机软件设计中使用嵌入式软件的时候,还要设计计算机软件的时间,使其中的每项任务都有时钟,并且通过时钟来对其进行控制动作。在嵌入式软件中,大多都有信号、信号量、邮箱等,这可以使软件资源及任务通信和同步得到有效实现。
3 结语
随着社会的不断进步与计算机技术的飞速发展,嵌入式软件在计算机中的应用也有较好的前景。通过以上描述,在计算机软件中应用嵌入式软件,使用分层结构进行设计,可以提高计算机软件的灵活性,还可以简化系统软件的设计过程。首先阐述了嵌入式软件的含义及特点,对嵌入式软件设计的方式进行了分析,研究了在计算机软件设计中使用嵌入式软件的作用。
摘要:随着我国社会的不断发展,计算机行业的技术水平也在不断地提高。在此背景下,嵌入式软件也得到了人们的重视,被人们广泛运用到计算机软件设计中。嵌入式软件具有专业性及实时处理的优点,将嵌入式软件运用到计算机软件设计中,可以使软件设计的流程更加简单明了,预防并及时解决计算机中出现的问题,有效地提高计算机系统的整体应用效率。
关键词:嵌入式软件设计,计算机软件设计,应用
参考文献
[1]朱勇.计算机软件设计中嵌入式实时软件的应用探析[J].信息技术与信息化,2015,(8):66-67.
[2]马宇驰.计算机软件设计中嵌入式实时软件的应用探析[J].信息通信,2014,(4):104-104.
[3]张爱兵.计算机软件设计中嵌入式实时软件的应用探究[J].电子技术与软件工程,2014,(6):113-113.
[4]李禹松.嵌入式实时软件在计算机软件设计中的应用[J].硅谷,2013,(18):37-37.
[5]章慧云.嵌入式实时软件在计算机软件设计中的应用[J].信息技术与信息化,2014,(12):184-185.
嵌入式程序设计 篇10
近年来, 国内对嵌入式操作系统的研究开始成为热点, 已成为中国IT产业中的一个重要的新兴产业和增长点。主要表现在:产业持续快速增长;新产品、新技术更新速度加快;嵌入式技术不断进步;嵌入式产业发展环境不断改善。Vx Works实时操作系统在高可靠性、高性能领域中被广泛应用。主要应用在通信、航空、航天等高精尖技术及实时性要求极高的领域中, 如手机通讯、交换机、机顶盒、飞机导航等。为了实现Vx Works对专用目标板的移植, 必须编写相应的驱动程序。串行通信是嵌入式设备通信应用中最为广泛的一种方式, 它具有可靠性高、抗干扰能力强等优点。本文分析了Vxworks操作系统串口驱动程序的编制过程, 及其实现方法[1]。
1 驱动程序管理
在Vx Works系统中, 设备被当作文件来管理, 这里的文件与通常意义上保存在存储设备中的普通文件不同。使用统一的接口方便管理。
驱动管理的I/O系统由设备列表、文件描述符表、设备驱动程序表组成。Vx Works可以为每一个驱动程序分配一个索引号, 以便查找设备驱动程序。这里的索引号就是设备列表中的驱动程序索引号。通过设备列表所对应的设备即可找到其对应的驱动程序。文件描述符表由系统创建并维护, 每当用户成功执行一个open命令时, 系统都会为对应的文件描述符添加上相应的信息。
从I/O系统执行open接口的流程来看, 驱动程序表和设备列表都是事先存在设备相关信息的情况下才能够由I/O系统访问, 这就需要依靠I/O系统提供的两个函数:iosDrv Install () 和ios Dev Add () 。ios Drv Install将设备驱动程序安装到系统中, 或者说, 添加到系统的驱动程序列表中;iosDev Add在系统中创建一个设备, 或者说, 将一个设备添加到系统的设备列表中。为了尽可能实现程序内聚, 这两个函数的联系仅仅是驱动程序索引号。ios Drv Install只负责驱动程序的安装并返回对应的驱动程序索引号。该函数所执行的操作只与驱动程序表有关, 并且只执行增加条目的操作。
执行创建设备之后, 用户才可以通过open函数访问设备获得文件描述符, 进而执行相应的其它操作。
2 I/O设备驱动程序的实现过程
Vx Works根据设备类型的不同, 分为4大类型:字符设备、块设备、SIO设备、网络设备。从广义上讲, 那些文件系统等都可以归结为驱动程序的范畴。每一种设备都有特定的应用范围, 字符设备作为最常见的设备种类特指那些以串行方式操作数据的设备, 这样的设备并不仅仅局限于串口等通讯设备, 还可以包括视频采集卡、音频适配器等。
从架构上来说, 字符设备驱动程序的实现最为简单。其原因在于, 字符设备驱动程序向上只与I/O系统有接口, 只需要提供标准的几个接口即可, 尤其是很多接口都可以根据设备的实际情况选择不实现, 从而简化了工作量。
应用程序通过文件名 (即设备名) 查找设备列表, 返回驱动程序表中驱动程序入口索引并保存于文件描述表中 (以后的读写操作将通过该表访问具体设备) 。由设备表索引查找驱动程序表, 从而得到相应的设备操作函数入口。此外, 对于块设备来说读写操作最后还要通过文件系统读写入口函数。编写设备驱动程序只需编写相应设备的xrpci Create () , xrpci Open () , xrpci Delete () , xrpci Close () , xrpci Read () , xrpci Write () , xrpci Ioctl () 等7个主要函数外加xrpci Drv () , xrpci Dev Create () 2个函数就可以了。其中xrpci Ioctl () 接口用于实现那些除了读、写之外的其它所有设备的操作与控制, 如串口波特率的设置、停止位、校验位等数据通讯格式的设置。xrpci Drv () 用来将设备驱动程序安装到系统中, 或者说, 即把7个主要函数添加到系统驱动程序的列表中, 返回一个驱动程序索引号。xrpci Dev Create () 函数主要执行3个操作:初始化设备、初始化设备数据结构、将设备添加到系统的设备列表中。至此完成了设备与驱动程序的挂接。
应用程序可以调用open () 等函数通过操作系统提供的这种层次访问结构访问到相应的设备xrpci Open () 等函数。在操作完该设备后应该使用close函数来释放此文件描述符。在使用open () 函数来取得文件描述符之后, 我们可以通过该文件描述符用read () , write () , ioctl () 等函数来对设备进行操作。
应用程序访问设备见图1。
3 串口驱动程序的软件实现
3.1 定义设备描述符结构
要根据具体的串行设备定义出自己的设备描述符结构
3.2 驱动程序各函数的实现过程
(1) 调用ios Drv Install () 安装驱动程序
用函数ios Drv Install (xrpci Open, (FUNCPTR) NULL, xrpci Open, xrpci Close, xrpci Read, xrpci Write, xrpci Ioctl) 将相应驱动函数入口点添加到驱动程序表中, 供I/O系统调用, 并返回相应的驱动程序索引号。
(2) 调用STATUS xrpci Dev Create () 创建设备
首先它初始化设备描述符及设备描述符结构体, 如下所示:
接着创建信号量和消息。然后调用ios Dev Add () 函数将设备添加到设备列表, 并将设备接收功能设置为中断工作方式。最后调用xrpci Initboard () 函数初始化设备[2]。
(3) 用xrpci Read () 和xrpci Writeite () 实现设备的读、写操作
在实现设备驱动程序的两个函数的功能时, 选择了非阻塞方式, 一旦设备并未准备好读操作或写操作, 则接口向I/O系统返回错误。
当用户调用write () 函数进行写操作时, I/O系统调用在驱动程序表中注册的函数xrpci Write (int pxrpci Dev Id, unsigned char*p Buf, int n Bytes) , 通过创建的信号量完成发送操作。
当串口接收到数据时会调用接收中断服务程序, 将接收的字符通过消息队列写入指定的缓冲区。当用户调用read () 函数进行读操作时, I/O系统调用在驱动程序表中注册的函数xrpci Read (int pxrpci Dev Id, unsigned char*p Buf, int n Bytes) , 此函数会将消息队列中的内容读入用户缓冲区, 完成接受操作[3]。
操作结束后, 驱动程序返回实际发生读写操作的数据长度, 或者返回错误信息, 供应用程序的I/O接口调用。
(4) 用xrpci Ioctl () 完成其他功能
xrpci Ioctl (int pxrpci Dev Id, int cmd, int arg) 响应用户ioctrl () 函数的调用, 来实现其它的功能, 比如串口的波特率设置、数据通讯格式等。由以下函数实现:
4 结束语
Vx Works是一种高效的嵌入式多任务实时操作系统, 在各种CPU平台上提供了统一的编程接口和一致的运行特性, 尽可能屏蔽了不同CPU的底层差异, 其应用范围随着嵌入式系统的广泛应用而日益扩大。串口驱动程序是VxWorks下一种特殊的字符型设备, 驱动程序并不是直接挂在I/O系统下, 而是通过虚拟设备驱动xrpci Drv来调用。作者利用本文所讨论的驱动程序的实现方法和过程, 实现了在某项目开发中Vx Works系统的串行设备驱动程序, 将其添加到系统关于标准串口驱动程序的底层, 这样可以保证在对其进行初始化的同时, 用户直接调用标准的接口函数, 就完成了所实现的串口通讯的功能应用。
参考文献
[1]张杨, 于银涛.VxWorks内核、设备驱动与BSP开发详解[M].北京:人民邮电出版社, 2009.
[2]陈智育, 温彦军, 陈琪.VxWorks程序开发实践[M].北京:人民邮电出版社, 2004.
嵌入式程序设计 篇11
关键词:嵌入式技术 无线控制 智能家居
智能家居可提供人类从未体验过的安全与便利,受到市场的热捧,成了世界范围内的研究热点。其中,嵌入式技术应用不仅能有效地实现智能家居功能,还可大大降低研发成本、缩短开发时间,呈现出良好的市场前景和应用价值。
当前智能家居控制系统多以单片机或ARM7作为主处理器,运算速度和系统资源相对有限,功能相对简单,智能化程度不高,应用范围窄。由于该类系统主要采用开关量检测,经常因为检测资源的匮乏无法有效地实现系统的分析功能。且该类系统硬件电路不能随意增加和减少设备,一旦硬件改动,软件部分需要大量改写甚至重新编写。
一、智能家居无线控制系统结构设计
笔者设计的智能家居无线控制系统结构框图如下图所示。本设计选择ARM9作为嵌入式系统的主处理器,尽管ARM9的价格稍高于ARM7,但由于ARM9的片上资源远较ARM7丰富,故而可大大简化外围电路设计,不仅性能更强,综合性价比也大为提高。
图 智能家居系统总体结构框图
系统中的GPRS模块和手机模块构成通信模块,ZigBee无线网络在控制模块和家居电器间构建信息通道,传感器模块检测家居环境,并将数据传递给控制模块。此外,本设计还包含有显示及操作用的LCD模块、电源模块和语音报警模块。
GPRS模块和ZigBee无线网络实现ARM对家居电器的监控,同时防止外部对本系统内部设备的攻击与非法访问。采用无线技术的好处显而易见,既可以省去繁琐的布线,又可以更灵活地放置网络内设备,改善家居布局。此外,利用GPRS模块可实现远程控制,为家居生活带来了极大的方便。结合传感器模块,即使发生意外情况时家中无人,也可迅速报警,通知家庭成员,甚至直接可由家庭成员利用远程控制做出补救。如家中有成员走动时,空调保持一定的室温,而无人走动时关闭空调或升高室温,从而提高舒适度,节约能源。
二、系统主程序模块设计思路
系统主程序模块主要是控制相应的设备以达到预期指标效果,主程序对系统采集的信息进行整合并加以分析判断。例如系统设定的温度值为27℃,而当前采集的温度值为30℃,系统就会控制制冷装置自动启动,并关闭门窗,使得室内的温度可以维持在27℃。假如温度采集模块出现故障,采集的信息没有随相应设备工作发生改变,则系统能自动判别并将传感器故障报警信号置位,避免系统因为传感器的故障而导致判断出现问题。
三、系统功能
该系统功能具体描述如下。
家居电器的综合监控:控制系统内所有相关家居电器,包括对其设置的参数和监测状态的检测,并做出相应的反应。
室内环境信息采集:定期采集数据,主要监测湿度、温度和空气成分(有毒气体如烟、煤气),将信息传递给控制系统作为参考。
自动报警:一旦家居环境发生超出设定阀值的变化,如有毒气体超标,或监测到陌生人未经开启门锁入室,控制系统会自动报警,并通过GPRS模块通知家庭成员。
本地控制:家庭成员可通过家庭计算机监控家居电器。
远程控制:依赖互联网和ZigBee系统,家庭成员可通过通信终端控制家居电器,查询工作状况。
安全防盗:依赖互联网、家庭网关和通信终端,家庭成员和家居环境建立起双向通信,一旦家庭防盗系统在未解除的情况下发生某些操作,或家居电器发生异常时,控制系统会立即通知家庭成员,达到安全防盗的效果。
笔者设计的基于嵌入式系统的智能家居远程无线控制系统,在功耗、体积、性能和可扩展性上有独特的优势,经过对实验结果的分析、验证,该系统基本达到了预期的要求,可实现家居的智能控制,具有广阔的发展空间。
参考文献:
[1]李刚,王民等.嵌入式远程监控系统前端的设计与实现[J].现代制造工程,2008(9).
[2]谭云福,张建忠.基于S3C2410微控制器的视频采集系统设计[J].电子器件,2008(4).
(作者单位:郑州煤矿机械制造技工学校)endprint
摘 要:本文针对智能家居系统的特点和所要实现的基本功能,利用32位嵌入式ARM9处理器S3C2440作为控制系统的控制核心,按照总体设计方案的要求,完成了整个系统硬件平台的设计,并针对相关模块给出了各自的硬件设计方案。
关键词:嵌入式技术 无线控制 智能家居
智能家居可提供人类从未体验过的安全与便利,受到市场的热捧,成了世界范围内的研究热点。其中,嵌入式技术应用不仅能有效地实现智能家居功能,还可大大降低研发成本、缩短开发时间,呈现出良好的市场前景和应用价值。
当前智能家居控制系统多以单片机或ARM7作为主处理器,运算速度和系统资源相对有限,功能相对简单,智能化程度不高,应用范围窄。由于该类系统主要采用开关量检测,经常因为检测资源的匮乏无法有效地实现系统的分析功能。且该类系统硬件电路不能随意增加和减少设备,一旦硬件改动,软件部分需要大量改写甚至重新编写。
一、智能家居无线控制系统结构设计
笔者设计的智能家居无线控制系统结构框图如下图所示。本设计选择ARM9作为嵌入式系统的主处理器,尽管ARM9的价格稍高于ARM7,但由于ARM9的片上资源远较ARM7丰富,故而可大大简化外围电路设计,不仅性能更强,综合性价比也大为提高。
图 智能家居系统总体结构框图
系统中的GPRS模块和手机模块构成通信模块,ZigBee无线网络在控制模块和家居电器间构建信息通道,传感器模块检测家居环境,并将数据传递给控制模块。此外,本设计还包含有显示及操作用的LCD模块、电源模块和语音报警模块。
GPRS模块和ZigBee无线网络实现ARM对家居电器的监控,同时防止外部对本系统内部设备的攻击与非法访问。采用无线技术的好处显而易见,既可以省去繁琐的布线,又可以更灵活地放置网络内设备,改善家居布局。此外,利用GPRS模块可实现远程控制,为家居生活带来了极大的方便。结合传感器模块,即使发生意外情况时家中无人,也可迅速报警,通知家庭成员,甚至直接可由家庭成员利用远程控制做出补救。如家中有成员走动时,空调保持一定的室温,而无人走动时关闭空调或升高室温,从而提高舒适度,节约能源。
二、系统主程序模块设计思路
系统主程序模块主要是控制相应的设备以达到预期指标效果,主程序对系统采集的信息进行整合并加以分析判断。例如系统设定的温度值为27℃,而当前采集的温度值为30℃,系统就会控制制冷装置自动启动,并关闭门窗,使得室内的温度可以维持在27℃。假如温度采集模块出现故障,采集的信息没有随相应设备工作发生改变,则系统能自动判别并将传感器故障报警信号置位,避免系统因为传感器的故障而导致判断出现问题。
三、系统功能
该系统功能具体描述如下。
家居电器的综合监控:控制系统内所有相关家居电器,包括对其设置的参数和监测状态的检测,并做出相应的反应。
室内环境信息采集:定期采集数据,主要监测湿度、温度和空气成分(有毒气体如烟、煤气),将信息传递给控制系统作为参考。
自动报警:一旦家居环境发生超出设定阀值的变化,如有毒气体超标,或监测到陌生人未经开启门锁入室,控制系统会自动报警,并通过GPRS模块通知家庭成员。
本地控制:家庭成员可通过家庭计算机监控家居电器。
远程控制:依赖互联网和ZigBee系统,家庭成员可通过通信终端控制家居电器,查询工作状况。
安全防盗:依赖互联网、家庭网关和通信终端,家庭成员和家居环境建立起双向通信,一旦家庭防盗系统在未解除的情况下发生某些操作,或家居电器发生异常时,控制系统会立即通知家庭成员,达到安全防盗的效果。
笔者设计的基于嵌入式系统的智能家居远程无线控制系统,在功耗、体积、性能和可扩展性上有独特的优势,经过对实验结果的分析、验证,该系统基本达到了预期的要求,可实现家居的智能控制,具有广阔的发展空间。
参考文献:
[1]李刚,王民等.嵌入式远程监控系统前端的设计与实现[J].现代制造工程,2008(9).
[2]谭云福,张建忠.基于S3C2410微控制器的视频采集系统设计[J].电子器件,2008(4).
(作者单位:郑州煤矿机械制造技工学校)endprint
摘 要:本文针对智能家居系统的特点和所要实现的基本功能,利用32位嵌入式ARM9处理器S3C2440作为控制系统的控制核心,按照总体设计方案的要求,完成了整个系统硬件平台的设计,并针对相关模块给出了各自的硬件设计方案。
关键词:嵌入式技术 无线控制 智能家居
智能家居可提供人类从未体验过的安全与便利,受到市场的热捧,成了世界范围内的研究热点。其中,嵌入式技术应用不仅能有效地实现智能家居功能,还可大大降低研发成本、缩短开发时间,呈现出良好的市场前景和应用价值。
当前智能家居控制系统多以单片机或ARM7作为主处理器,运算速度和系统资源相对有限,功能相对简单,智能化程度不高,应用范围窄。由于该类系统主要采用开关量检测,经常因为检测资源的匮乏无法有效地实现系统的分析功能。且该类系统硬件电路不能随意增加和减少设备,一旦硬件改动,软件部分需要大量改写甚至重新编写。
一、智能家居无线控制系统结构设计
笔者设计的智能家居无线控制系统结构框图如下图所示。本设计选择ARM9作为嵌入式系统的主处理器,尽管ARM9的价格稍高于ARM7,但由于ARM9的片上资源远较ARM7丰富,故而可大大简化外围电路设计,不仅性能更强,综合性价比也大为提高。
图 智能家居系统总体结构框图
系统中的GPRS模块和手机模块构成通信模块,ZigBee无线网络在控制模块和家居电器间构建信息通道,传感器模块检测家居环境,并将数据传递给控制模块。此外,本设计还包含有显示及操作用的LCD模块、电源模块和语音报警模块。
GPRS模块和ZigBee无线网络实现ARM对家居电器的监控,同时防止外部对本系统内部设备的攻击与非法访问。采用无线技术的好处显而易见,既可以省去繁琐的布线,又可以更灵活地放置网络内设备,改善家居布局。此外,利用GPRS模块可实现远程控制,为家居生活带来了极大的方便。结合传感器模块,即使发生意外情况时家中无人,也可迅速报警,通知家庭成员,甚至直接可由家庭成员利用远程控制做出补救。如家中有成员走动时,空调保持一定的室温,而无人走动时关闭空调或升高室温,从而提高舒适度,节约能源。
二、系统主程序模块设计思路
系统主程序模块主要是控制相应的设备以达到预期指标效果,主程序对系统采集的信息进行整合并加以分析判断。例如系统设定的温度值为27℃,而当前采集的温度值为30℃,系统就会控制制冷装置自动启动,并关闭门窗,使得室内的温度可以维持在27℃。假如温度采集模块出现故障,采集的信息没有随相应设备工作发生改变,则系统能自动判别并将传感器故障报警信号置位,避免系统因为传感器的故障而导致判断出现问题。
三、系统功能
该系统功能具体描述如下。
家居电器的综合监控:控制系统内所有相关家居电器,包括对其设置的参数和监测状态的检测,并做出相应的反应。
室内环境信息采集:定期采集数据,主要监测湿度、温度和空气成分(有毒气体如烟、煤气),将信息传递给控制系统作为参考。
自动报警:一旦家居环境发生超出设定阀值的变化,如有毒气体超标,或监测到陌生人未经开启门锁入室,控制系统会自动报警,并通过GPRS模块通知家庭成员。
本地控制:家庭成员可通过家庭计算机监控家居电器。
远程控制:依赖互联网和ZigBee系统,家庭成员可通过通信终端控制家居电器,查询工作状况。
安全防盗:依赖互联网、家庭网关和通信终端,家庭成员和家居环境建立起双向通信,一旦家庭防盗系统在未解除的情况下发生某些操作,或家居电器发生异常时,控制系统会立即通知家庭成员,达到安全防盗的效果。
笔者设计的基于嵌入式系统的智能家居远程无线控制系统,在功耗、体积、性能和可扩展性上有独特的优势,经过对实验结果的分析、验证,该系统基本达到了预期的要求,可实现家居的智能控制,具有广阔的发展空间。
参考文献:
[1]李刚,王民等.嵌入式远程监控系统前端的设计与实现[J].现代制造工程,2008(9).
[2]谭云福,张建忠.基于S3C2410微控制器的视频采集系统设计[J].电子器件,2008(4).
嵌入式程序设计 篇12
关键词:嵌入式实时软件,计算机,软件设计
随着我国科技水平的提升, 对于我国计算机软件设计中, 应用开发嵌入式实时软件有着极为广阔的前景, 可以在计算机软件设计中, 嵌入式实时软件, 不仅可以取得良好实践效果, 也可以有效促进我国计算机整体软件开发水平的提升。以下本文对此做具体介绍。
1 嵌入式实时软件概述
计算机软件设计中, 将嵌入式实时软件应用到程序设计中, 将面向需要处理的软件对象, 通过实时处理技术融入其中, 使计算机软件在远过程调用中, 更加具备独立性、安全性与实用性。在计算机软件设计过程中, 嵌入式实时软件更好提高软件产品质量, 嵌入式实时软件, 具有很强的存储区保护功能, 有利于软件检测和修复, 降低软件产品缺陷, 满足软件使用者质量要求。
2 计算机软件设计中应用嵌入式实时软件的意义
嵌入式实时软件设计就是包含硬件与软件的综合设计体, 不仅涵盖机械知识, 结合软件设计使得计算机软件系统更加的强大, 也可以提高计算机软件系统控制的能力。对于计算机软件设计部分, 嵌入式实时软件开发, 有很广的应用领域, 嵌入式软件设计中, 它包括对于硬件设计和软件设计两部分, 嵌入式实时软件作为非一般PC系统开发, 在嵌入式实时软件中, 应该具备处理器、I/O端口、微处理器以及编程等多个部分。通常, 嵌入式实时软件中都具有实时操作功能及多任务操作的功能, 采用嵌入式实时软件设计计算机软件, 可以在计算机软件系统中, 应用层次化模块的结构, 确保嵌入式实时操作系统可以和计算机底层硬件相互结合, 应用嵌入式实时软件完成硬件系统任务, 提高计算机软质量。在计算机软件设计中, 应用嵌入式实时软件, 还具有处理中断、切换上下文、分配资源的优势, 保证软件产品的质量。
3 实现嵌入式实时软件应用的设计方案
3.1 案例介绍
基于计算机软件设计技术, 设计微机继电保护器, 将嵌入式实时软件设计其中, 可以大大提高计算机软件产品的质量。对于本次嵌入式实时计算机软件开发中, 是基于硬件以及软件嵌入式系统的开发。本次计算机软件设计中, 将会应用数字信号处理器、IO设备、C++语言以及ARM, 开发设计计算机嵌入式实时软件。
3.2 开发流程及结构
开发嵌入式实时软件中, 首先, 在需求分析阶段, 应该明确计算机软件功能需求, 做好沟通管理;对于软件的设计阶段以及代码生成阶段、测试固化阶段, 都应该秉持嵌入式设计理念, 实现对系统的实时控制。在设计本次计算机嵌入式实时软件中, 将会对嵌入式实时软件各个功能进行模块化处理, 将其分成子模块, 并可以利用模块方式对其进行程序开发工作, 将嵌入式实时软件中的多个任务划分开来并发执行, 实现系统中软件与硬件之间的交互。嵌入式实时软件中, 还应该划分任务职责, 赋予任务唯一的地址, 并采用优先级调度的模式, 提高嵌入式实时实时性功能。
3.3 硬件设计
设计嵌入式实时计算机软件中, 选择AT91RM9200微处理器, AT91RM9200处理器有丰富的外设接口, 且处理器的控制器也可以实施同步控制, 实现系统中事件突发访问的功能, 提高计算机嵌入式实时软件响应时间。
3.4 软件设计
在嵌入式实时软件软件设计中, 面向模块组件进行开发, 保持软件内任务执行的速度与灵敏性, 简化嵌入式实时软件控制流程, 面向组件开发过程中, 组件被视为通过接口向外界提供服务或者请求服务的黑盒, 其中的多个组件也可以被组成更高层次组件, 嵌入式实时软件中, 其组件多具有独立性强、重用性强的特点, 利用这样的嵌入式实时软件开发出的计算机软件系统, 可以更好提高计算机软件的实时性与独立性。
3.5 程序实现
在开发计算机软件中, 可以应用C++语言, 对嵌入式实时软件加入其软件编程中, 并实行对嵌入式实时软件的编程应用。以下针对该计算机软件设计中, 嵌入式实时软件代码的一部分程序:
4 结论
综上所述, 经嵌入式实时软件应用到计算机软件设计中, 提高计算机软件系统的实时性, 并且还需要简化计算机软件系统中的软件代码, 节省内存, 提高计算机软件系统的运行效率, 具备实际应用效益。
参考文献
[1]李禹松.嵌入式实时软件在计算机软件设计中的应用[J].硅谷, 2013, 14 (12) :76-77.
[2]张广泉, 林苗, 戎玫.基于构件的嵌入式实时软件建模与分析[J].计算机工程与科学, 2012, 07 (18) :41-42.
【嵌入式程序设计】推荐阅读:
嵌入式软件设计论文08-09
嵌入式程序的优化08-30
基于嵌入式课程设计11-07
嵌入式硬件设计论文09-17
智能小车嵌入式系统设计分析07-01
嵌入式课程设计指导书08-11
基于模块化设计的嵌入式软件测试方法07-17