第一篇:基于ARMLINUX的嵌入式GUI的设计与开发.
基于ARM LINUX的嵌入式GUI的设计与开发
摘 要:GUI设计在嵌入式系统设计中占据着举足轻重的地位,MiniGUI为一种适合于嵌入式系统的、功能强大的GUI,本文介绍了基于ARM和Linux的MiniGUI移植方法以及在ARM开发板上实现普通手机操作界面的设计过程,并提出了相应功能的实现方法,给出了设计的效果。
关键词:嵌入式系统;ARM;Linux;MiniGUI
1、引言
目前,嵌入式应用非常广泛。嵌入式系统由硬件和软件两大部分组成。硬件方面的主要核心是嵌入式处理器,以ARM为核的32位RISC处理器是中高端嵌入式应用的代表。软件方面一般由嵌入式操作系统和应用软件组成。嵌入式操作系统种类众多,比如Linux、uCLinux,其具有开放源码、免费授权和资源丰富等优点,备受开发者的青睐。应用软件根据产品需求会用到图形界面(GUI)、文件系统(FS)、网络(TCP/IP协议栈)等软件功能,其中,GUI对于提高人机交互友好性,易操作性具有很好的效果,而随着图形显示设备的广泛应用,目标产品对GUI的需求越来越多。
2、系统环境和构架
系统实现环境采用SmartARM2200开发板及运行在ARM上的uCLinux操作系统。
SmartARM2200开发板:CPU型号为LPC2210,内核规格为ARM7TDMI-S,60M,支持uCLinux操作系统[1] [2];上面带有充足的存储资源(PSRAM,NAND FLASH,NOR FLASH和E2EPRORM等)和丰富的接口(以太网接口、CF卡和SD卡接口,串口接口等),可使用2.2英寸240*320 TFT液晶屏,可使用JTAG仿真调试[3];
嵌入式Linux内核[4]:uCLinux嵌入式操作系统;
uCLinux开发平台的构建:
基于Linux嵌入式系统的设计,其开发流程为如图1所示:
图1 Linux嵌入式系统开发流程
图中,依次建立开发环境arm-elf-gcc,安装uCLinux内核,下载ZLG/BOOT,下载uCLinux内核和文件系统,为了调试uCLinux应用程序,将宿主机的共享目录加到开发板的/mnt目录下,并启动NFS服务。MagicARM2200-S主芯片为LPC2210,LPC2210芯片没有内部Flash,无法进行ISP下载,需要额外的DownLoad程序。
3、MiniGUI移植
在宿主机上安装MiniGUI:将MiniGUI函数库源代码和资源文件(MiniGUI-STR压缩包)复制到PC机的RedHat 9.0特定目录上,解压,编译。
在目标板的uCLinux操作系统上运行MiniGUI应用程序[3],需要:
1)由于不同目标机的图形显示设备与输入设备不一致,所以需要为MiniGUI编写相应的GAL和IAL(驱动程序),再于MiniGUI的源代码一起交叉编译生成MiniGUI的静态链接库文件(uCLinux不支持共享库,只能使用静态连接库); 2)MiniGUI应用程序也在宿主机上进行交叉编译,并与MiniGUI静态链接库生成目标板可执行的FLAT格式文件,交叉编译如图2所示; 图2 MiniGUI应用程序的交叉编译
3)在目标板的uCLinux操作系统上搭建MiniGUI运行环境(安装MiniGUI的资源文件res和运行的配置文件MiniGUI.cfg),将MiniGUI应用程序(FLAT格式)下载和运行。
根据系统要求,需安装MiniGUI资源文件,并修改运行时的配置文件MiniGUI.cfg。
4、系统设计与实现 4.1系统总体框架
基于SmartARM2200开发板,进行MiniGUI系统,并模拟手机显示部分主要功能:首页,图标选择界面,电话本,信息,游戏,其他等六大模块,系统总体框架如图3.1所示:
1)首页:具有显示静态封面图片,更改、显示时间等功能;
2)图形选择界面:提供一个以图标加标签文字的方式供用户浏览选择条目的界面;
3)电话本管理:提供记录姓名、手机、电话、地址等信息,并且可以添加、修改、设计适合手机键盘输入的拼音输入法程序,满足中文姓名,中文短信等汉字输入的需要,键盘布局如图3.2所示;
4)信息管理:提供编写新信息,浏览收信箱和发信箱等的操作界面; 5)游戏:提供一到两个单机游戏,比如贪吃蛇,俄罗斯方块; 6)其他:利用GUI绘图函数绘制几幅优美的图像,制作闹钟等;
图3.1系统整体框图图
图3.2键盘布局图
注:在主界面下,可以通过按左右键来进入图形选择界面,电话本管理和短信管理;在图形选择界面下可以通过选择不同的图标来进入不同的操作界面。
4.2 系统模块设计
4.2.1主界面功能的实现如下:
1)主窗口的创建部分[5]
InitMainWindow();
// 设置各项属性,并建立主窗口
ShowWindow(hMainWnd,SW_SHOWNORMAL);
// 显示主窗口
2)消息循环
while(GetMessage(&Msg,hMainWnd))
{ TranslateMessage(&Msg); DispatchMessage(&Msg);}
3)填充背景色和显示汉字
LoadBitmapFromFile(HDC_SCREEN,&mainskin,“res/skin2.bmp”);
FillBoxWithBitmap(hdc,0,0,MWINDOW_RX,283,&mainskin);
TextOut(hdc,30,295,“信息”); // 显示文字
其中资源图片一般在MiniGUI建立主窗口的过程中发送MSG_CREATE消息时加载(逻辑字体也在此时创建),而背景色的填充和汉字的显示则是在窗口初始显示,发送MSG_PAINT消息时绘制,而且必须在指定的设备上下文中操作:
hdc = BeginPaint(hWnd);
// 获得设备hdc
EndPaint(hWnd,hdc);
// 释放设备hdc
4)时间操作
在MSG_CREATE消息时,启动1s的定时器:SetTimer(hWnd,ID_TIME,100);在定时器消息MSG_TIMER中获取当前时间,并显示出来。
4.2.2图形选择界面的功能实现
当有键盘按下时,系统会发送MSG_KEYDOWN,处理此消息时,通过判断按键方向,确定当前选择的图标,当选择图标发生变化时,即用背景色重绘原有边框,用另一种颜色绘制新的边框,并将标签文字重写在右下角的位置。
4.2.3电话本管理模块完成的功能:
1)显示电话本名单,通过上下键移动可选中不同的名单,同时显示其电话号码;
2)选中一个名单时,可以查看其详细信息(姓名,手机,固话,住址,排序,类型等),并且可以编辑修改;
3)当选中“新建”时,可以创建一个新的电话名单和其详细信息;
4)姓名和住址的编辑支持中文拼音输入法,通过2~9按键上标注的26个字母组合,可以输入常见的汉字。
电话本管理模块的实现方法如下:
1)电话本列表框实现:
{CTRL_LISTBOX,//列表框控件定义:
WS_VISIBLE WS_VSCROLL WS_BORDER LBS_NOTIFY,//LBS_SORT,//
L
BS_AUTOCHECKBOX,1,0,238,263,ID_PhoneList,”“,0,}
在初始化和更新条目时需要填充列表框,清空列表框和填充函数分别为:
SendDlgItemMessage(hWnd,ID,LB_RESETCONTENT,0,0);
SendDlgItemMessage(hWnd,ID,LB_ADDSTRING,0,(LPARAM)myphonenote[i].name);
更改选择条目字符串和更改反白条位置的函数分别为:
SendDlgItemMessage(hwnd, ID, LB_SETTEXT,index,buff),SendDlgItemMessage(hwnd,ID,LB_SETCURSEL,index,0L);
2)条目明细——查看框
分别创建相应的静态框和编辑框,列表框,并填充相应的值即可。
3)条目明细——编辑框
初始化时把光标赋予姓名框,备份当前的条目信息。
SendMessage(hwnd,EM_LIMITTEXT,10,0L);
4)拼音输入框
拼音输入法实现了手机电话本的修改维护和信息的编写,它不仅窗口比较多,切换频繁,而且需要汉字字库和键盘编码译码的支持,显示界面实现的难度比较大,其实现框架图如图4所示:
图4 拼音输入法界面
5、系统实现
经过交叉编译,通过FTP或NFS,和MiniGUI的资源文件、配置文件一起下载到构架好uCLinux操作平台的ARM板,重启运行,程序在开发板上运行时部分界面效果比较理想,如图5所示:
图5 运行结果
参考文献:
[1]李岩,荣盘祥编著.基于S3C44B0X嵌入式uCLinux系统原理及应用.清华大学出版社.[2] 广州周立功单片机发展有限公司.uCLinux开发平台构建.[3]周立功等著.ARM嵌入式系统实验教程(二).北京航空航天大学出版社.[4]林晓飞,刘彬等编著.基于ARM嵌入式Linux应用开发与实例教程.清华大学出版社.[5]北京飞漫软件技术有限公司.MiniGUI编程指南.
第二篇:嵌入式开发工程师
任职要求:
1、大学本科及以上学历,2年以上工作经验,计算机电子通讯类专业毕业;
2、能够熟练使用POWER PCB或PROTEL或ORCAD等电路设计软件进行PCB设计;
3、熟悉电子元器件,能独立设计数字及模拟电路,拥有单片机开发工作经验,懂得RF433无线及红外遥控等相关知识;
4、熟练使用C语言,有嵌入式开发工作开发及智能家居防盗报警产品经验者优先。
岗位职责:
1、新产品项目设计开发工作;
2、为相关部门及项目提供技术支持;
3、产品售后返修分析,品质不断提升性能改进;
4、组织对新研发产品的制样、验证、试产、量产等工作的确认与审核。
第三篇:嵌入式Linux开发流程
嵌入式Linux开发流程
嵌入式 linux开发,根据应用需求的不同有不同的配置开发方法,但是一般都经过以下过程:
建立开发环境。操作系统一般 REDHAT-LINUX,版本 7 到9 都可以,选择定制安装或全部安装,通过网络下载相应的 GCC 交叉编译器进行安装(比如 arm-linux-gcc、arm-uclibc-gcc),或者安装产品厂家提供的交叉编译器。
配置开发主机。配置 MINICOM,一般参数为115200,数据位 8位,停止位 1,无奇偶校验,软硬件控制流设为无。在 WINDOWS 下的超级终端的配置也是这样。MINICOM软件的作用是作为调试嵌入式开发板信息输出的监视器和键盘输入的工具;配置网络,主要是配置 NFS 网络文件系统,需要关闭防火墙,简化嵌入式网络调试环境设置过程。
建立引导装载程序BOOTLOADER,从网络上下载一些公开源代码的BOOTLOADER,如 U-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,根据自己具体芯片进行移植修改。有些芯片没有内置引导装载程序,比如三星的 ARM7、ARM9 系列芯片,这样就需要编写烧写开发板上 flash 的烧写程序,网络上有免费下载的 WINDOWS 下通过JTAG并口简易仿真器烧写 ARM 外围 flash 芯片的程序。也有 LINUX 下公开源代码的J-FLASH 程序。如果不能烧写自己的开发板,就需要根据自己的具体电路进行源代码修改。这是让系统可以正常运行的第一步。如果你购买了厂商提供的仿真器,当然比较容易烧写flash了,但是其中的核心技术是无法了解的。这对于需要迅速开发应用的人来说可以极大地提高开发速度。
下载别人已经移植好的 LINUX 操作系统,如 UCLINUX、ARM-LINUX、PPC-LINUX等,如果有专门针对你所使用的CPU移植好的 LINUX 操作系统那是再好不过,下载后再添加自己的特定硬件的驱动程序,进行调试修改,对于带 MMU的 CPU可以使用模块方式调试驱动,对于 UCLINUX 这样的系统好像只能编译进内核进行调试。
建立根文件系统,从下载使用 BUSYBOX 软件进行功能裁减,产生一个最基本的根文件系统,再根据自己的应用需要添加其他的程序。默认的启动脚本一般都不会符合应用的需要,所以就要修改根文件系统中的启动脚本,它的存放位置位于 /etc目录下,包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile 等,自动挂装文件系统的配置文件/etc/fstab,具体情况会随系统不同而不同。根文件系统在嵌入式系统中一般设为只读,需要使用 mkcramfs、genromfs 等工具产生烧写映象文件。
建立应用程序的 flash 磁盘分区,一般使用JFFS2 或 YAFFS 文件系统,这需要在内核中提供这些文件系统的驱动,有的系统使用一个线性 flash(NOR 型)512K-32M,有的系统使用非线性 flash(NAND型)8-512M,有的两个同时使用,需要根据应用规划 flash的分区方案。
开发应用程序,可以下载到根文件系统中,也可以放入 YAFFS、JFFS2 文件系统中,有的应用程序不使用根文件系统,而是直接将应用程序和内核设计在一起,这有点类似于UCOS-II 的方式。
烧写内核、根文件系统、应用程序。
发布产品。
第四篇:嵌入式开发工程师-简历
【个人信息】姓名:
身高:
性别:
学历:
籍贯:
专业:电子信息工程
联系电话:
E-mail:
【求职意向】 嵌入式开发工程师或相关工作,对LINUX驱动开发极感兴趣
【工作经验】 2009.3----2010.3中山长宝GPS卫星导航有限公司
2009.1----2009.3中山世博游艺有限公司
【教育背景】 2010.3——2010.7广州粤嵌通信科技股份有限公司(简称粤嵌教育)ARM+Linux培训
2005.9——2009.6广州大学松田学院电子信息工程工学学士
【项目经验】
GPS车载终端,GPS个人定位器(从事一年相关工作)基于ARM9的嵌入式智能家居系统(QT图像界面,应用程序,驱动等)基于ARM9的嵌入式视频点播系统(包括本地播放,网络播放)ARM9(S3C2440)的嵌入式系统移植(Uboot,Kernel,Rootfs,Driver)LINUX简单聊天工具
【相关技能】
英语水平: 四 级 掌握C、C++编程,有良好的编程风格 了解Linux内核机制,熟悉Linux驱动开发 熟练使用单片机(如STC系列,SST系列,INTEL系列)熟悉ARM9的硬件结构 熟悉Linux操作系统、交叉编译环境,掌握常用脚本编写 熟悉BootLoader制作,内核的剪裁,驱动及根文件系统的移植 熟悉QT编程 , TCP/IP协议,掌握Linux应用编程 了解SQL基础知识 熟悉GSM.GPS的使用
【语言水平】 粤语/国语流利;英语已通过CET-4,可阅读专业相关资料
项目简介
GPS车载终端,GPS个人定位器
软件环境: KEIL 51
硬件环境: BENQ M23,M33 通信模块,51单片机,和GPS模块
项目描述: 通过MCU把GPS采集的数据处理后,通过串过发送AT指令使GSM
拨通GPRS网络,再把采集的GPS数据,按照定义好的协议上存到监
控平台
ARM9(S3C2440)LED流水灯、LCD文字及图片显示设计
软件环境: ADS1.2
硬件环境:ARM9(2440)开发板
项目描述: 将设计的程序移植到ARM9上,并成功驱动LED、LCD,完成LED
流水灯、LCD文字及图片显示项目
ARM9(S3C2440)嵌入式系统移植
软件环境: Linux2.6.24,U-boot,Qtopia
硬件环境: ARM9(2440)开发板
项目描述: 在2440上成功完成了U-boot移植,Linux内核的剪裁与移植,根文
件系统的制作,并完成了LED、LCD等驱动的移植。
基于ARM9的VOD点播系统
软件环境: Linux2.6.12,U-boot,Qtopia
硬件环境: GEC2440开发板
项目描述: 培训实战项目,完成了S3C2440嵌入式系统的整体移植,它基于
QT图形界面,移植了MPlayer播放器,实现了VOD(本地和网络)
多媒体点播, ARM9(S3C2440)嵌入式智能家居系统
软件环境: Linux2.6.12,U-boot,Qtopia
硬件环境: ARM9(2440)开发板
项目描述: 本系统主要实现温度检测,红外检测,蜂鸣器报警,步进机转动(模拟控
制家电),GSM短信通知等驱动,QT图形界面显示和应用编程.把温
度传感器和红外线采集的数据,传给应用程序,应用程序把数据显示
在QT界面,当应用程序检测到温度过高或有人闯进时,应用程序就调
用蜂鸣器报警驱动,并发短信通知主人,主人也可以下发短信控制步
进机转动
本人做的LINUX驱动简介
ds18b20温度传感器Linux驱动
该驱动为字符型驱动程序,能从ds18b20芯片读取温度信息.ds18b20芯片采用了独特的1-wire bus技术,只用一根数据线即可实现与cpu芯片的连接(利用了cpu gpio本身的弱上拉电阻)。本驱动程序的重点是实现字符驱动的读函数接口。由于硬件连线简单,对ds18b20的软件操作较为繁琐,每一个操作都要要经过以下三个步骤:(1)芯片初始化(2)芯片选择(因为一线总线上可挂载多个ds18b20, 所以必须通过一定的机制指明操作的对象)(3)发送功能命令(例如,温度查询命令)和读取数据。在初始化的步骤中,cpu拉低数据线,然后释放数
据线,经过一定时间读取数据线上的值,如为低电平,则表明数据上挂载了ds18b20,否则初始化失败。在芯片选择的步骤中,由于只挂载了一片ds18b20, 所以只需发送skip rom命令即可。在发送功能命令的步骤中,首先发送温度查询命令(convert t), 然后在数据线上读取两个字节的温度数据,温度数据按由低位低字节向高位高字节的顺序发送,余下的为温度无关数据,可忽略。温度数据的0-10位为数值位(最小单位为0.0625), 11-15位为扩展符号位。该驱动使用linux的udelay函数来实现时序操作所要求的延时操作。
使用内存模拟块设备并挂载ext2文件系统(简单块设备驱动)
本驱动程序使用kmalloc分配出一块内存区域来模拟块设备,并在该块设备上挂载ext2文件系统。本驱动程序同时实现了字符设备和块设备驱动接口。块设备的内容通过字符驱动的写函数由用户空间写入。块设备接口实现的重点是其初始化函数和request函数的实现。在初始化函数中完成以下操作:注册块设备主设备号(register_blkdev),注册request函数的实现并获取与之关联的request_queue,设置request_queue的一些参数(例如,blk_queue_hardsect_size和blk_queue_max_sectors),分配(alloc_disk)和设置块设备结构体gendisk,注册gendisk。在request函数的实现中完成以下操作:获取request_queue中的第一个request结构体(elv_next_request), 遍历该request结构体中每一个bio(rq_for_each_bio)中的每一个segment(bio_for_each_segment),在循环体中将每个segment的数据发送到块设备控制器(或从块设备控制器中读入segment中)。遍历完成后,从request_queue中移除该request结构体(end_that_request_first),重复以上操作,直到request_queue为空,最后调用end_that_request_last做一些收尾工作。可以看到,块设备的驱动格式较为固定,不像字符驱动那样灵活。文件系统通过以下方法制作:首先建立一个2M大小的“空白”文件(dd),然后格式化该文件(mkfs.ext2),最后通过mount命令进行挂载,并创建文件系统内容。制作好的文件系统通过字符驱动的写接口写入驱动内存(cat), 最后挂载块设备。
蜂鸣器驱动
本驱动程序属于字符型驱动,由于该蜂鸣器物理硬件连接的是定时器的TOUT1管脚,只要实现定时器1的PWM功能即可,实现PWM功能,我们需要设置定时器的频率,也就是蜂鸣器的频率,并设置占空比.蜂鸣器启动的代码在IOCTL系统调用里实现,并把蜂鸣器的响应时间,以参数形式传给IOCTL这自己定义的函数.驱动蜂鸣器。
红外感应驱动
本驱动程序属于字符型驱动,红外感应的原理,简单的描述就是当有人靠近时,该模块相应的管脚会产生高电平,没人靠近时,该管脚为低电平.此工作原理,相当于一个外部中断,所以只要住一个带有外部中断的字符驱动即可
GSM驱动(即串口驱动)
本驱动程序属于字符型驱动,首先用ioremap申请串口相关控制寄存器,再编写串口接受和发送的中断程序,当寄存器UTRSTAT的第0位为真,表示接受到收据,当寄存器UTRSTART第2位为1时,表示可以发送寄存器为空,可以发送数据
【求职感言】 我对嵌入式计算机行业抱有热情,有强烈的求知欲和对新技术和新方法的热
忱,希望能得到一个良好的平台和起点,得到锻炼和提升的机会
【业余爱好】
● 看书,篮球,足球,魔兽争霸
【自我评价】●具备吃苦、耐劳的能力,敢于面对错误和承担责任。
第五篇:关于嵌入式开发的一点建议
CSDN:很多人都讲嵌入式开发很难,能不能就你学习和工作经验与大家分享下嵌入式开发如何开始和深入?作为嵌入式研发工程师,你认为其应具备哪些知识结构和实战能力? 卜茂霞:说到嵌入式开发如何开始和深入,其实我也没有特别的方法,在这里仅谈下我的个人见解吧。做嵌入式开发必须具备良好的C语言功底,汇编虽然不是必须,但懂点更好。其次可以到网上找一个比较流行的MCU开发板,比如STM32做为学习开发板,参照示例代码,自己动手编译烧录跑程序,比如跑马灯的程序,深刻了解整个开发过程。接下来可以学习小型的实时操作系统,比如UC/OS和RT-Thread等,如果C语言比较好的话可以尝试了解这个实时操作系统的原理部分,尝试阅读其源码,掌握其使用技巧。而接下来最好是能参与具体的开发项目,负责几个模块,写写驱动,或做应用。
需要强调的是,每个过程一定要自己尝试动手,不要停留在书本或官方提供的开发手册上,一定要通过自己的实践去验证自己想法,在这个过程中通过不断思考与验证,有问题找经验丰富的同事或在网上找答案,另外最好能将心得记录下来(比如说写CSDN博客),并不断总结。这样持之以恒,不知不觉你就会发现已经进入资深嵌入式开发工程师的行列了。个人认为嵌入式开发工程师应具备:1.良好的C语言功底。2.至少熟悉一款MCU,其它的技能可以在具体项目中不断学习来补充。