9、简述Qt/Embedded应用系统的基本开发流程。(P223)
答:基于Qt/Embedded开发一个嵌入式应用的一般过程如下图所示。
选定嵌入式硬件平台在工作的机器上安装Qt/Embedded工具开发包根据目标硬件平台,交叉编译Qt/Embedded的库在工作的机器上进行应用程序的编码、调试根据目标硬件平台,交叉编译嵌入式应用在嵌入式硬件设备上调试运行应用有问题调试有无问题无发布嵌入式应用
从图中可以看到,应用软件开发工作基本上是在工作站或是PC机上完成的。在工作站或PC机上调试运行嵌入式应用,并将输出结果显示在一个仿真小型设备显示终端的模拟器上。在开发的后期,要根据选择的嵌入式硬件平台,将嵌入式应用编译链接成适合在目标平台上运行的二进制目标代码。另外由于应用系统使用到了Qt/Embedded的库,所以还要对Qt/Embedded库的源代码进行交叉编译,然后链接成为适合在目标平台上使用的二进制目标代码库。当一个Qt/Embedded应用被下载到目标平台上,并能够可靠运行时,一个开发过程才宣告结束。
10、试说明在Qt/Embedded中鼠标类设备和触摸屏设备的异同点。(P226)
答:Qt/Embedded中没有特别针对触摸屏的设备接口,不过触摸屏和鼠标类设备在功能上基本是一致的,因此,在Qt库中一般把触摸屏模拟成鼠标设备来实现对触摸屏设备的操作。由于触摸屏在实现原理上存在着A/D量化误差的问题,因此所有的触摸屏接口实现类需要从特殊的类QCalibratedMouseHandler继承,并获得校正功能。另外,触摸屏和鼠标底层接口的不一样,会造成对上层接口的不一致。例如,从鼠标驱动接口中几乎不会得到绝对位置信息,一般只会得到相对移动量。鼠标接口需要考虑移动加速度,而触摸屏接口则几乎是清一色的绝对位置信息和压力信息。针对此类差别,Qt/Embedded将同一类设备的接口部分也给予区别和抽象。
第9章 基于OMAP5912的开发应用实例
1、如何构建基于OMAP5912的嵌入式开发平台。 答:[略]
2、嵌入式Linux系统的启动流程分哪几个层次?(P244)
答:一般来说,一个嵌入式Linux系统的启动可以分为四个层次:
(1)引导加载程序:Bootloader和包括固化在固件中的boot代码(可选项)两大部分。 (2)Linux内核:针对特定的嵌入式系统专门定制的Linux内核以及内核的启动参数。特定于OMAP平台,选用麦克泰公司的Montavista Linux。
(3)文件系统:包括根文件系统和建立于FLASH内存设备之上的文件系统。通常用Ramdisk作为根文件系统,它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境的载体。
(4)用户应用程序:特定于用户的应用程序,并且在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。
3、说明嵌入式操作系统Montavista Linux内核在OMAP5912硬件平台上的移植步骤。(P251~254)
答:嵌入式操作系统Montavista Linux内核在OMAP5912硬件平台上的移植步骤为: (1)软件环境配置
① 安装Montavista Preview Kit到/opt/montavista中。 ② 安装成功后,进行本地用户的一个备份操作。
③ 接下来我们将做一个嵌入式内核源码树的本地备份。
④ 做一个指向linux-2.4.20_mv131的逻辑链接,以便以后编译不同的内核时,只需修改相应的链接,而不必对Makefile进行改动。
(2)参数配置
① 根目录:根目录下只需修改Makefile文件。
② arch目录:arch目录存放着与体系结构相关部分的内核代码。 ③ arch/arm/boot目录:编译出来的内核是存放在这个目录中。 (3)编译和移植
当对内核配置或者相应的功能进行改动后,一般都必须重新编译内核。编译内核的同时也编译和链接用到的各个模块。先设置好环境参量,然后更改目录到本地用户的/home/hxh/montavista/kernel/linux中,并运行配置内核的命令。还可以对各个设备驱动、各种提供的功能进行选择和裁减,以便达到我们最终的应用需求。配置完成之后选择保存。
4、如何理解基于OMAP5912硬件平台Montavista Linux下设备驱动程序的设计和使用? 答:略。
5、设备驱动程序中需要完成的任务包括哪些?(P255)
答:设备驱动程序中需要完成的任务包括:对设备以及对应资源初始化和释放;读取应用程序传送给设备文件的数据并回送应用程序请求的数据。这需要在用户空间、内核空间、总线及外设之间传输数据。
6、在嵌入式系统中使用Bootloader有哪些优点?(P245)
答:大多数嵌入式系统还是采用了引导加载程序Bootloader,而不让可执行映像在EEPROM或FLASH中就地执行。这样做是出于几个方面的考虑:
(1)效率方面的考虑
虽然CPU可以在ROM或FLASH空间就地执行操作系统(包含应用软件)的映像,但
是ROM和FLASH的速度往往比不上RAM。所以先把映像从ROM或FLASH空间搬运到RAM空间,然后在RAM空间中运行这个映像,有利于提高系统的运行效率。
(2)操作系统的多样性
一方面嵌入式系统可以采用很多不同种类的操作系统,同一种操作系统也可以有不同的版本。而且,嵌入式系统的应用软件又常常与操作系统连成一体,这就更增加了系统映像的多样性。另一方面,嵌入式系统的硬件提供商所面对的通常是二次开发商而不是最终用户,往往并不清楚最终用的是什么操作系统,或者手中并无目标操作系统的映像。所以,最好的办法是先在硬件中装上一个引导加载程序,而让二次开发商提供具体的操作系统映像,这样就为采用不同版本,甚至完全不同的操作系统(以及应用程序)映像提供了灵活性。
(3)存储地与执行地分离
特别是在嵌入式系统的调试阶段,更换系统的可执行映像是很频繁的事情,此时需要把新的可执行映像写入相应的EPROM或FLASH芯片中去。如果让可执行映像就地运行,那就变成要把新的映像覆盖到正在执行的老的映像上,那样当然会带来一些技术上的问题。这说明映像的存储地与执行地应该分离。
(4)调试/排错方面的考虑
调试/排错方面的考虑也要求在RAM中执行系统映像。嵌入式软件的开发在前期可以采用一些模拟、仿真的调试/排错手段,可是最终总得要“来真格”的,到实际的运行环境中考察、调试。如果目标程序在ROM或FLASH中就地运行,就无法通过这种方法设置断点了。
(5)嵌入式系统独特的开发模式
嵌入式系统的操作系统内核往往与应用软件静态地连接在一起,而且程序的开发通常是在另一台“主机”上进行,所以每次修改程序以后就得把新的映像“下载”到目标机中,此时就得依靠目标机的引导加载程序。
7、简述Bootloader的概念和Bootloader的操作模式。(P247~248)
答:Bootloader运行时,首先根据设置好的中断向量入口,跳转到相应的入口,进入特权模式,关闭各种模式中断,然后开始做各种初始化工作。
大多数Bootloader都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。从最终用户的角度看,Bootloader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
(1)启动加载(Boot loading)模式 这种模式也称为“自主”(Autonomous)模式。也即Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是Bootloader的正常工作模式,因此在嵌入式产品发布的时候,Bootloader显然必须工作在这种模式下。
(2)下载(Downloading)模式 在这种模式下,目标机上的Bootloader将通过串口连接或网络连接等通信手段从宿主机(Host)下载文件,如下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后再被Bootloader写到目标机上的FLASH类固态存储设备中。
8、说明Bootloader的启动过程。(P248)
答:Bootloader的启动过程可分为单阶段(Single-Stage)或多阶段(Multi-Stage)。从固态存储设备上启动的Boot Loader大多分为stagel和stage2两个阶段。依赖于CPU体系结构
的代码,比如设备初始化代码等,通常都放在stagel中,而且通常都用汇编语言来实现,以达到短小精悍和高效的目的。而stage2则通常用C语言来实现,这样可以实现更复杂的功能,而且代码具有更好的可读性和可移植性。
Bootloader的stagel通常包括以下步骤(以执行的先后顺序): 硬件设备初始化
为加载Bootloader的stage2准备RAM空间 拷贝Bootloader的stage2到RAM空间中 设置好堆栈
跳转到tage2的C入口点
Bootloader的stage2通常包括以下步骤(以执行的先后顺序) 1) 初始化本阶段要使用到的硬件设备 2) 检测系统内存映射(memory map)
3) 将kernel映像和根文件系统映像从FLASH读到RAM空间中4) 为内核设置启动参数 5) 调用内核
补充:
理解并设计音频驱动设备AIC23在Montavista Linux下的驱动程序。 答:给出例程: #define NULL 0 /* Codec Handle */ typedef int OSK5912_AIC23_CodecHandle; typedef int Int16; typedef unsigned int Uint32; typedef unsigned short Uint16; typedef unsigned char Uint8; typedef volatile unsigned short VUint16; /* AIC23 Codec Structure */ typedef struct {
Int16 regs[10];
} OSK5912_AIC23_Config;
/* ------------------------------------------------------------------------ *
* AIC23 Definitions * ------------------------------------------------------------------------ */ /* I2C Address for AIC23 - dependent on value of AIC23:CS signal */ //#define OSK5912_AIC23_I2CADDR 0x1a // AIC23:CS = 0 #define OSK5912_AIC23_I2CADDR 0x1b // AIC23:CS = 1
#define OSK5912_AIC23_POWERDOWN 6 #define OSK5912_AIC23_NUMREGS 10 #define OSK5912_AIC23_RESET 15
* /* AIC23 codec settings - each entry below represents an AIC23 register */ OSK5912_AIC23_Config aic23config = {
0x0017, /* 0 OSK5912_AIC23_LEFTINVOL Left line input channel volume */ \\ 0x0017, /* 1 OSK5912_AIC23_RIGHTINVOL Right line input channel volume */ \\ 0x00d8, /* 2 OSK5912_AIC23_LEFTHPVOL Left channel headphone volume */ \\ 0x00d8, /* 3 OSK5912_AIC23_RIGHTHPVOL Right channel headphone volume */ \\ 0x0011, /* 4 OSK5912_AIC23_ANAPATH Analog audio path control */ \\ 0x0000, /* 5 OSK5912_AIC23_DIGPATH Digital audio path control */ \\
0x0000, /* 6 OSK5912_AIC23_POWERDOWN Power down control */ \\ 0x0043, /* 7 OSK5912_AIC23_DIGIF Digital audio interface format */ \\
0x0019, /* 8 OSK5912_AIC23_SAMPLERATE Sample rate control */ \\ 0x0001 /* 9 OSK5912_AIC23_DIGACT Digital interface activation */ \\ };
#define OSK5912_AIC23_DEFAULTCONFIG { \\
0x0017, /* Set-Up Reg 0 Left line input channel volume control */ \\ /* LRS 0 simultaneous left/right volume: disabled */ \\ /* LIM 0 left line input mute: disabled */ \\
/* XX 00 reserved */ \\ /* LIV 10111 left line input volume: 0 dB */ \\
\\ 0x0017, /* Set-Up Reg 1 Right line input channel volume control */ \\ /* RLS 0 simultaneous right/left volume: disabled */ \\ /* RIM 0 right line input mute: disabled */ \\
/* XX 00 reserved */ \\ /* RIV 10111 right line input volume: 0 dB */ \\
\\ 0x01f9, /* Set-Up Reg 2 Left channel headphone volume control */ \\ /* LRS 1 simultaneous left/right volume: enabled */ \\ /* LZC 1 left channel zero-cross detect: enabled */ \\
/* LHV 1111001 left headphone volume: 0 dB */ \\ \\ 0x01f9, /* Set-Up Reg 3 Right channel headphone volume control */ \\ /* RLS 1 simultaneous right/left volume: enabled */ \\ /* RZC 1 right channel zero-cross detect: enabled */ \\
/* RHV 1111001 right headphone volume: 0 dB */ \\ \\ 0x0011, /* Set-Up Reg 4 Analog audio path control */ \\
/* X 0 reserved */ \\ /* STA 00 sidetone attenuation: -6 dB */ \\ /* STE 0 sidetone: disabled */ \\ /* DAC 1 DAC: selected */ \\ /* BYP 0 bypass: off */ \\ /* INSEL 0 input select for ADC: line */ \\