【嵌入式体系结构复习资料】

选择:

1. 以下哪个不是嵌入式系统设计的主要目标?( D  )

A.低成本    B.低功耗   C.实时要求高  D.超高性能

2. 嵌入式系统有别于其他系统的最大特点是(A  )。

A.嵌入专用  B.高可靠     C.低功耗       D.低成本

3.下面哪个系统属于嵌入式系统。( D  )

A.“天河一号”计算机系统   B.联想 T400 笔记本计算机 

   C.联想 S10 上网本        D.联想 OPhone 手机

4. 下面不属于嵌入式操作系统的是(C)。

A. VxWorks             B. lunix        C. Dos            D. windows CE

5. 从层次结构来看,嵌入式系统包括(  D  )。

A. 硬件层   B. 板级支持包   C.实时操作系统和应用软件  D.以上都是

6. 在嵌入式系统设计中,嵌入式处理器选型是在进行( C  )时完成。

A.需求分析  B.系统集成   C.体系结构设计D.软硬件设计

7. 在嵌入式系统设计中,进行硬件版图设计是在进行(  D )时完成。

A.需求分析  B.系统集成  C.体系结构设计  D.软硬件设计

8. 下面关于哈佛结构描述正确的是( A )。

A.程序存储空间与数据存储空间分离 B.存储空间与 IO 空间分离

C.程序存储空间与数据存储空间合并 D.存储空间与 IO 空间合并

9. 以下哪个处理器属于嵌入式处理器?( A )

A.S3C44B0x    B.奔腾   C.看门狗   D.MP3 播放器

10. 下面哪一类嵌入式处理器最适合于用于工业控制( B )。

A.嵌入式微处理器  B.微控制器   C.DSP   D.以上都不合适

11.存储一个32位数0xAABBCCDDF到3000H-3003H四个字节单元中,若以大端格式存储,则3002H的存储单元的内容为(C )。

A.0xAA  B. 0xBB   C. 0xCC  D. 0xDD

12.下列哪一个是快速中断模式下,对R14寄存器的正确写法( A )。

A. R14_fiq   B. R14_irq   C. R14_svc   D. R14_abt

13.如果想对r1-r4寄存器进行出栈处理,下列指令正确的是(D )。

A. ldm sp,{r1-r4} B.ldmfa r11,{r1-r4}

C. ldmfd sp,{r1-r4}        D.ldmfd sp!,{r1-r4}

14.如果想对r1-r4寄存器进行压栈处理,下列指令正确的是( D )。

A.stm sp,{r1-r4} B.stmfa r11,{r1-r4}

C.stmfd sp,{r1-r4}       D.stmfd sp!,{r1-r4}

15.ARM的异常源中优先级别最低的异常源是( A)。

            A.Und     B.IRQ    C.SVC    D.Reset(最高)

16. 在串行异步通信中(UART),发送一方的RXD要和接收一方的(A )相连。A.TXD      B.RXD     C.Ncts    D.nRTS

17.ARM处理器复位后,处理器处于( C )模式。

    A. User        B. System   

C.SVC        D. FIQ

18.用于将R0的[3]位的值置位的指令是( D )。

A. ADD R0,#0x01   B.ORR R0,#0x04   C.BIC R0,R0,#0x01  D.AND R0,R0,#0x08

19. ARM处理器是一个 ( D  ) 。  

16位CISC   B. 16位RISC   C. 32位CISC   D. 32位RISC

20.欲使ARM Cortex-A9处理器禁止中断,则应该使( C)。

A.CPSR的F位为1      B.  CPSR的F位为0  

C.CPSR的I位为1      D.  CPSR的I位为0

22. CPSR寄存器中,控制ARM处理器处于ARM状态还是THUMB状态的是(C )位。

A. I       B. F       C. T      D. Z

23.下列哪种类型不属于ARM处理器支持的数据类型( C )。

A. 字节   B. 字   C. 双字   D. 四字

24.ARM汇编语句“ADD R0,R1,R2,LSL #3”的作用是( C )。

A.R0=R1+(R2>>3)   B. R0=(R1<<3)+R2 

C.R0=R1+(R2<<3)   D.(R2<<3)= R0-R1

25.在三级存储结构中,CPU不能直接访问的存储器是(C  )。

    A. cache                B. 内存  

C.硬盘   D. 以上都不是

26.以下关于SRAM和DRAM的区别不对的是( A   )。

A. SRAM比DRAM慢                   B. SRAM比DRAM耗电多

C. DRAM存储密度比SRAM高得多     D. DRM需要周期性刷新

27. 在CPSR中当ALU中产生运算结果为负数的时候,哪一位自动置1(A )。

            A. N          B. Z      C. C      D. V

28.下列关于ARM处理器异常向量表的描述中正确的是( A  )。

    A. 异常向量表放的是跳转指令,执行该指令进入相应中断服务子程序

B. 异常向量表放的是中断服务子程序的入口地址

    C. 异常向量表放的就是中断服务子程序 

D. 以上都是

29.当处理器在执行THUMB指令集时,处理器每执行完一条指令后PC的值自增(B )。

A. 1       B. 2        C. 4       D. 32

30. 在IRQ模式下,当前程序的运行状态是由哪个寄存器来决定(B )

A.IRQ模式下的SPSR   B. CPSR   C. FIQ模式下的SPSR   D.以上都不是

31.I2C总线的通信方式属于( B)。

A.单工     B.半双工     C.全双工   D.以上全是

32.在指令系统的各种寻址方式中,获取操作数最快的方式是(  B   )。

A. 变址寻址     B. 立即寻址    C. 寄存器寻址    D. 间接寻址

33.假设R1=0x31,R2=0x1  则执行指令ADD R0,R1,R2 LSL #3 后,R0的值是(   C  )。

A. 0x33              B. 0x34              C. 0x39                         D. 0x38

34. ATPCS协议中规定,栈使用(D)栈

            A.空增  B.空减  C.满增  D.满减

35. ARM的工作状态包括( D )。

  A. 测试状态和运行状态   B. 挂起和就绪状态   C. 就绪状态和运行状态  D. ARM状态和Thumb状态。

36.以下哪种方式不属于文件系统的格式      (C)。

A. FAT32                       B. JFFS        C. cmd                        D. Ext2

39. 关于硬件抽象层,以下描述中错误的是 (A)。

A. 硬件抽象层包括操作系统内核和驱动程序

B. 硬件抽象层将操作系统与硬件平台隔开

C. 硬件抽象层是一种软件

D. 硬件抽象层有利于系统的模块化设计

40. 关于ARM汇编和C语言混合编程下列正确的是(D)。

A. C语言中可以直接嵌入某些汇编指令          

B. C语言中不可以调用汇编的子程序         

C. 汇编程序中不可以调用C语言的函数     

D. C语言嵌入的汇编指令时,不可使用C的变量

41. 一个任务被唤醒,意味着(D)。

A.该任务重新占有了CPU      B.其优先级变为最大

C.其任务移至等待队列队首               D.任务变为就绪状态

42. 嵌入式系统由硬件部分和软件部分构成,以下(B)不属于嵌入式系统软件。

A. 驱动程序      B. BSP     C. JAVA         D. 内核

43.在C语言中,将变量声明为volatile类型,其作用为(D)。

A. 设为静态变量 B. 节约存储空间 C.设为全局变量 D. 让编译器不再对该变量进行优化

44.实时操作系统必须在(B)处理来自外部的事件。

A、一个机器周期                     B、被控制对象规定的时间   

C、周转时间                         D、时间片

45.  在三级流水线机制下,一条指令执行的顺序是( A )。  

A. 取指-译码-执行     B. 取指--执行-译码

C. 译码-取指-执行     D. 译码-执行-取指

46.  下面哪一种工作模式ARM9不具备,而属于ARM CortexA8/A9的特有模式是( B  ) 。

A. 系统模式                   B.         安全监控模式     C.软中断模式                             D.FIQ模式

47. 关于 ARM 处理器的异常的描述不正确的是( D  )。

A. 复位属于异常          B. 除数为零会引起异常

C. 外部中断会引起异常    D. 所有异常都要返回

48.RISC指令系统描述不正确的是  D    

A、指令条数多   B、指令长度固定C、指令格式种类少   D、寻址方式种类少 

填空:

1. VFS具有两个针对文件系统对象的缓存:inode 索引节点对象、dentry目录项对象它们缓存最近使用过的文件系统对象。

2.根据开发目标平台的不同,ARM提供不同的工具解决方案。 最常见的是MDK-ARM、RVDS和 ARM DS5

3. Linux内核中解决并发控制最常用的方法是自旋锁  信号量

4. 字符设备是以字符为单位传输数据的设备,块设备的特点是对设备的读写是以 为单位的,并且对设备的访问是随机的。网络设备驱动通常是通过套接字等接口来实现操作。

5. ARM体系结构中以字为单位,按4字节对齐,地址最末两位为00。

6. 每个块组依包括超级块、块组描述符、节点位图、数据块区、块位图inode表。

7. 在linux2.6内核中,主从设备被定义为一个dev-t类型的32位数。

2.从模块结构来看,嵌入式系统由三大部分组成,分别是: 硬件       软件     开发平台 

3.从层次角度来看,嵌入式系统由四大部分组成,分别是:应用软件层,操作系统层,硬件抽象层和硬件层    .

4.嵌入式产品的主要度量指标包括上市时间、设计成本、产品质量

5.嵌入式系统的设计过程包括  (1)需求分析(2)规格说明(3)体系结构设计(4)设计硬件构件和软件构件(5)系统集成(6)系统测试                   

6. ARM7微处理器采用.诺依曼总线架构 ARM9微处理器采用哈佛

7. 1.ARM CortexA8/A9处理器内部共有40 32 位处理器,其中33个用过通用寄存器,7个用作状态寄存器。CPSR寄存器中文名称是当前状态寄存器

8.BootLoader的作用是  初始化相关硬件设备、建立内存空间映射关系,配置内核正确运行环境。

9.Linux内核源码目录中,Linux支持的文件系统代码放置在  fs   目录。

10. 大多数Bootloader都包含两种不同的操作模式,分别是: 启动加载模式         下载模式     

11. U-Boot的环境变量中最重要的两个变量是:   bootcmd  和  bootargs 

12.若内存按字节编址,用存储容量为8K*8比特的存储器芯片构成地址编号10000H~4FFFFH的内存空间,则至少需要  32   片。

14.进程是 系统资源分配   基本单位,而线程是  程序独立运行   的基本单位。

15.嵌入式微处理器按指令系统分类可分为RISC和    CISC        

16.根据内核的核心功能,Linux内核具有5个主要的子系统,分别负责如下的功能:进程管理,内存管理,虚拟文件系统,进程间通信和网络接口

17.Linux内核中解决并发控制最常用的方法是  自旋锁  信号量  

18.内核将进程、线程和内核线程一视同仁,即内核使用唯一的数据结构task-structure来分别表示它们;使用同一个函数  do-fork()来分别创建这三种执行线程。

名称解释:

看门狗是嵌入式系统中常用的保证系统可靠性的技术下列情况下会产生看门狗中断的是看门狗定时超时

Cmd不属于文件系统的格式            临界区是一段程序

嵌入式系统由硬件部分和软件部分构成,以下JAVA不属于嵌入式系统软件。

能够实现自动编译的是make

在C语言中,将变量声明为volatile类型,其作用为让编译器不再对该变量进行优化            设备中机械硬盘设备是块设备。

实时操作系统必须在被控制对象规定的时间 处理来自外部的事件。

简答:

1、简述驱动程序中file结构体、file operations结构体和inode结构体之间的关系。

File_operations为用户态应用程序提供接口,是系统调用和驱动程序关联的重要数据结构。File 结构体在内核代码 include/linux/fs.h 中定义,表示一个抽象的打开的文件,file_operations 结构体就是 file 结构的一个成员。Inode 结构表示一个文件,而 file 结构表示一个打开的文件。这正是二者间最重要的关系。

2、 下面的声明都是什么意思?

const int pn;   pn是一个常整型数

int const pn;   pn是一个常整型数

const int *pn;  pn是一个指向常整型数的指针(整型数是不可修改的,但指针可以)。

int * const pn;  pn是一个指向整型数的常指针(指针指向的整型数是可以修改的,但指针是不可修改的)

int const * pn const;  pn是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的)4

3、 嵌入式微处理器一般分为哪几种类型,各有什么特点?

答:分为四种类型:嵌入式微控制器(MCU)嵌入式微处理器(MPU)嵌入式数字信号处理器(DSP)嵌入式片上系统(SOC)

特点:MCU单片化,体积小,功耗和成本低、可靠性提高,是目前嵌入式系统工业的主流。

MPU体积小、重量轻、成本低、可靠性高,但是在电路板上必须包括ROM、RAM、总线接口、各种外设等器件,系统的可靠性和技术保密性差。

DSP适合于执行DSP算法,编译效率较高,指令执行速度也较高。

SOC应用系统电路板简洁,体积和功耗小、可靠性非常高。

4、什么是嵌入式系统? 

答:嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件,是嵌入式系统极为重要的组成部分。通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面等。具有通用操作系统的基本特点:能够有效管理越来越复杂的系统资源,能够把硬件虚拟化,简化的驱动程序移植和维护,能够提供库函数、驱动程序、工具集以及应用程序。

5、文件系统的概念、功能及配置的目录。

文件系统:文件系统是操作系统用于确认磁盘或分区上的文件的方法和数据结构。文件系统是负责存取和管理文件信息的机构,用于对数据、文件以及设备的存取控制,它提供对文件和目录的分层组织形式、数据缓冲以及对文件存取权限的控制功能。

文件系统具有以下主要功能:对文件存储设备进行管理,分别记录空闲区和被占用区,以便于用户创建、改以及删除文件时对空间的操作;对文件和目录的按名访问、分层组织功能;创建、删除及修改文件功能;数据保护功能;文件共享功能。

6、嵌入式操作系统所支持的文件系统应该具备哪些特点?

答:嵌入式操作系统所支持的文件系统自下而上主要由硬件层、驱动层、内核层和用户层组成。嵌入式文件系统具有结构紧凑、使用简单便捷、安全可靠及支持多种存储设备、可伸缩、可剪裁、可移植等特点。

7、进程、线程、内核线程之间的区别及轻量级进程的概念。

进程是处于执行期的程序以及它所管理的资源的总称。进程是系统资源分配的基本单位

线程是程序独立运行的基本单位。

内核线程永远都运行在内核态,只能调用内核函数无法使用用户空间的函数。

轻量级进程通常共享父进程的内存地址空间、父进程所在文件系统的根目录以及工作目录信息、父进程当前打开的文件以及父进程所拥有的信号处理函数。

8、Linux设备驱动程序的类型。
驱动程序分为三大类,字符设备、块设备、网络设备。

字符设备:按字节读取,提供连续的数据流,一般不支持随机读取

块设备:可以访问任意位置数据,读取位置和大小由程序决定,支持随机读取,网络设备:是虚拟的,用于不同主机间的数据包传输

9、简述Linux系统中断响应的详细过程。

答:第一步,CPU收到中断信号后会把ESP、CS等能恢复当前执行状态流的寄存器数据保存到内核栈上。第二步,获取中断向量号。每一个中断信号都有一个中断向量号,中断向量号是一个整数。CPU收到一个中断信号会根据这个信号的中断的向量号去查询中断向量表,再调用向量表相应的处理函数。

第三步,根据中断向量号从中断向量表中找到对应的门描述符,对描述符做一番安全检查之后,CPU就开始执行中断处理函数(就是门描述符中的段偏移)。中断处理函数的最末尾执行IRET指令,这个指令会根据前面保存在栈上的数据跳回到原来的指令继续执行。

10、嵌入式操作系统按实时性分为几种类型,各有什么特点?

1)具有强实时特点的嵌入式操作系统。在实时系统中,如果系统在指定的时间内未能实现某个确定的任务,会导致系统的全面失败,这样的系统被称为强实时系统或硬实时系统。强实时系统响应时间一般在毫秒或微秒级,如核反应堆处理装置、飞机控制器和数控机床控制器等。一个强实时系统往往在硬件上需 要添加专门用于时间和优先级管理的控制芯片。

2)具有弱实时特点的嵌入式操作系统。在弱实时系统中,虽然响应时间同样重要,但是超时却不会发 生致命的错误。设计软实时系统时,也需要考虑系统可接受的超时限的次数和延迟。目前大多数实时操作 系统都是弱实时系统,它则主要是在软件方面通过编程实现现实的管理。

3)没有实时特点的嵌入式操作系统。

11、ARM处理器的数据类型。

支持多种数据类型:字节(Byte):8位;半字(Half word):16位;字(Word):  32位;双字(Double word):64位。

12、简述哈弗结构与冯诺依曼结构的区别。

冯诺依曼结构和哈佛结构区别为:存储器结构不同、总线不同、执行效率不同。

13、half  word B=218与word C=218在内存中的存放方式有何不同?请分大端和小端两种情况说明。

Cortex-A8处理器支持大端(Big-endian)和小端(Little-endian)两种存储模式。大端模式是被存放字数据的高字节存储在存储系统的低地址中,而被存放的字数据的低字节则存放在存储系统的高地址中。小端模式中,存储系统的低地址中存放的是被放字数据中的低字节内容,存储系统的高地址存放的是被存字数据中的高字节内容。

14、S5PV210的外部时钟源有哪几种?它们分别为芯片的那些外设提供所需的时钟信号?

S5PV210的时钟系统包括三个时钟域(Domain),分别是主系统时钟域 (MSYS)、显示相关的时钟域(DSYS)、外围设备的时钟域(PSYS)。

MSYS:用来给CORTEX-A8处理器、DRAM控制器、3D、内部存储器(IRAM和IROM)、芯片配置界面(SPERI)、中断控制器等提供时钟。

DSYS:用来给显示相关的部件提供时钟,包括FIMC、FIMD、JPEG、IPS多媒体等。

PSYS:用来给外围设备(I2S、SPI、I2C、UART等)、安全子系统、低功率音频播放等提供时钟。

每个总线系统操作在200MHz(最大)、166MHz和133MHz,分别由异步总线桥梁(BRG)连接两个不同的域。

15、什么是内核?内核的主要组成部分有哪些?

答:“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件,一个内核不是一套完整的操作系统。Linux内核具有5个主要的子系统:进程管理、内存管理、虚拟文件系统、进程间通信和网络接口。

16、进程、线程和内核线程之间的主要区别是什么?什么是轻量级进程?

答:进程是处于执行期的程序以及它所管理的资源的总称。进程是系统资源分配的基本单位,线程是程序独立运行的基本单位。内核线程永远都运行在内核态,只能调用内核函数无法使用用户空间的函数。轻量级进程通常共享父进程的内存地址空间、父进程所在文件系统的根目录以及工作目录信息、父进程当前打开的文件以及父进程所拥有的信号处理函数。

17、下面的声明都是什么意思?

const int noa;

int const noa;

const int * noa ;

int * const noa;

int const * noa const;

答:const int noa;   noa是一个常整型数

int const noa;   noa是一个常整型数

const int *noa;  noa是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。

int * const noa;  noa是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)

int const * noa const;  noa是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)

18、BootLoader的功能是什么?它的主要组成部分有哪些?

答:BootLoader是在操作系统内核运行之前运行的一小段程序,可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个适合的状态,以便为最终调用操作系统内核准备好正确的环境。第一阶段主要包含依赖于CPU的体系结构硬件初始化的代码,通常都用汇编语言来实现。第二阶段通常用C语言完成,以便实现更复杂的功能,也使程序有更好的可读性和可移植性。

19、什么是交叉编译工具链?工具链的构建方法有哪些?

答:交叉编译是在一个平台上生成另一个平台上执行代码。交叉编译环境是由一个编译器、连接器和解释器组成的综合开发环境。交叉编译工具主要包括针对目标系统的编译器、目标系统的二进制工具、目标系统的标准库和目标系统的内核头文件。在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译链接源代码,最终生成可在目标平台上运行的程序。通常构建交叉工具链有如下三种方法:方法一:分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。该方法相对比较困难,适合想深入学习构建交叉工具链的读者及用户。如果只是想使用交叉工具链,建议使用下列的方法二构建交叉工具链。方法二:通过Crosstool脚本工具来实现一次编译,生成交叉编译工具链,该方法相对于方法一要简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。方法三:直接通过网上下载已经制作好的交叉编译工具链。该方法的优点是简单可靠,缺点也比较明显,扩展性不足,对特定目标没有针对性,而且也存在许多未知错误的可能,建议读者慎用此方法。 

20、简要说明嵌入式Linux系统移植过程。

答:首先构建嵌入式 Linux 开发环境,包括硬件环境和软件环境;其次,移植引导加载程序BootLoader;

然后,移植 Linux 内核和构建根文件系统;

最后,一般还要移植或开发设备驱动程序。

内核移植的过程。

答:1、内核配置

(1)修改Makefile

(2)设置NAND Flash分区

(3)配置内核选项,得到.config文件

2、内核编译

(1)清除冗余文件  # make clean

(2)编译内核映像和模块 make zImage

(3)安装模块 # make modules_install

3、内核下载

21、U-Boot的移植过程主要包括那几个步骤?

答:U-Boot的启动过程分为两个阶段:第一阶段主要由汇编代码实现,负责对CPU及底层硬件资源的初始化;第二阶段用C语言实现,负责使能Flash、网卡等重要硬件资源和引导操作系统等。

U-Boot 的移植过程主要包括以下四个步骤:1. 下载U-Boot源码;2. 修改相应的文件代码 ;3. 编译U-Boot;4. 烧写到开发板上,运行和调试。

22、作为Linux内核的重要组成部分,设备驱动程序主要完成哪些功能?

答:设备驱动程序是应用程序和硬件设备之间的一个软件层,它向下负责和硬件设备的交互,向上通过一个通用的接口挂接到文件系统上,从而使用户或应用程序可以无需考虑具体的硬件实现环节。作为Linux内核的重要组成部分,设备驱动程序主要完成以下的功能:(1) 对设备初始化和释放。(2) 把数据从内核传送到硬件和从硬件读取数据。(3) 读取应用程序传送给设备文件的数据和回送应用程序请求的数据。(4) 检测错误和处理中断。

23、设备驱动程序的主要构成单元是什么?

答:Linux 设备驱动程序可以分为两个主要组成部分:(1)对子程序进行自动配置和初始化,检测驱动的硬件设备是否正常,能否正常工作。(2)设备服务子程序和中断服务子程序,这两者分别是驱动程序的上下两部分。驱动上部分即设备服务子程序的执行是系统调用的结果,并且伴随着用户态向核心态的演变,在此过程中还可以调用与进程运行环境有关的函数,比如 sleep()函数。驱动程序的下半部分即中断服务子程序。

24、Linux设备驱动程序分类有哪些?

答:字符设备:传输数据以字符为单位进行的设备,字符设备驱动程序通常实现open、close、read和write等系统调用函数,常见的字符设备有键盘、串口、控制台等。块设备:对其信息的存取以“块”为单位。如常见的光盘、硬磁盘、软磁盘、磁带等,块长大小通常取512B、1024B或4096B等。网络设备驱动:通常通过套接字(Socket)等接口来实现操作。任何网络事务处理都可以通过接口来完成和其他宿主机数据的交换。

25、Linux的设备驱动程序可以分为那些部分?

答:Linux的设备驱动程序可以分为以下部分:(1)驱动程序与内核的接口,这是通过关键数据结构file_operations来完成的;(2)驱动程序与系统引导的接口,这部分利用驱动程序对设备进行初始化;(3)驱动程序与设备的接口,这部分描述了驱动程序如何与设备进行交互,这与具体设备密切相关。

26、嵌入式数据库系统的主要特点是什么?

答:嵌入式数据库系统是指支持移动计算或某种特定计算模式的数据库管理系统,它通常与操作系统和具体应用集成在一起,运行在智能型嵌入式设备或移动设备上。由于嵌入式数据库系统总是与移动计算相结合,所以通常情况下嵌入式数据库也被称为嵌入式移动数据库。嵌入式数据库系统具备了如下主要特点:嵌入性;移植性;安全性;实时性;可靠性;主动性。

27、简要叙述常见的基于Linux的嵌入式数据库。

答:基于Linux平台的数据库非常多,大型的商用数据库有Oracle、Sybase、Informix、Informix、IBM DB2等;中小型的有PostgreSQL、MySQL、mSQL、Berkeley DB和SQLite数据库。

28、简要叙述SQLite数据库的主要特点。

答:SQLite是一个开源的、内嵌式的关系型数据库。它是D. Richard Hipp采用C语言开发出来的完全独立的,不具有外部依赖性的嵌入式数据库引擎。Sqlite主要特点有:支持ACID事务;零配置,即无需安装和管理配置;储存在单一磁盘文件中的一个完整的数据库;数据文件可在不同字节顺序的机器间自由共享;支持数据库大小至2TB;程序体积小,全部C语言代码约3万行(核心软件,包括库和工具),250KB大小;相对于目前其他嵌入式数据库具有更快捷的数据操作;支持事务功能和并发处理;程序完全独立,不具有外部依赖性;支持多种硬件平台,如arm/ Linux、SPARC/Solaris等。

大题-程序题:

1、Linux系统BootLoader的配置与移植时,假设当前目录是/home,在此目录下创建arm子目录,解压u-boot-1.3.4.tar.bz2,并完成配置并编译内核。

1)写出创建子目录及解压命令;

#cd Desktop

#mkdir arm

#cd arm

解压u-boot-1.3.4.tar.bz2:

#tar -jxvf u-boot-1.3.4.tar.bz2

2)完成配置和编译步骤;

#cd ~/Desktop/arm/u-boot-1.3.4/include

#cd configs

#cp -fr smdk2410.h mike2410.h

#cd u-boot-1.3.4

#make distclean

#make mike2410_config

#make CROSS_COMPILE=arm-linux-

如果编译正确,将在 u-boot-1.3.4目录下生成 u-boot、u-boot.bin和 u-boot.srec三个映像文件。

3)u-boot使用网络需设置哪些环境变量,且需要注意哪些问题。

答:ipaddr和serverip;需要注意:ipaddr 和serverip 需在同一⽹段,即服务器serverip和Ubuntuip⼀致。

2、当前目录有main.c,main.h,listen.c,play.c, visit.c,study.c, watch.c等文件,实现周一至周五分别输出“listen english today!”、"play football today!"、"visit friend today!"、"study computer today!"、"watch TV today!",否则输出“Nothing to do!”的功能。请写出play.c,main.c的源码,编写相应的Makefile文件并用clean操作删除上次编译结果,最后编译生成可执行程序并运行。

play.c

#include<stdio.h>

void play()

{

      printf("play football today\n");

}

main.c

#include<stdio.h>

main()

{

        int i;

 printf("please input the value of i from 1 to 5:\n");

        scanf("%d",&i);

        if(i==1)

               listen();

        else  if(i==2)

                play();

        else  if(i==3)

                visit();

        else  if(i==4)

                study();

        else  if(i==5)

                watch();

        else

                printf("nothing to do\n");

        printf("This is a woderful day\n");

}

Makefile

CC=gcc

TARGET=All

OBJECTS= m.o visit.o listen.o watch.o study.o play.o

$(TARGET):$(OBJECTS)

$(CC)  $(OBJECTS) -o m

main.o:main.c main.h

$(CC) -c m.c -o m.o

visit.o:visit.c

$(CC) -c visit.c -o visit.o

listen.o:listen.c

$(CC) -c listen.c -o listen.o

watch.o:watch.c

$(CC) -c watch.c -o watch.o

study.o:study.c

$(CC) -c study.c -o study.o

play.o:play.c

$(CC) -c play.c -o play.o

clean:

rm *.o

make

./main

3、假设目标机ARM开发板的IP地址为192.168.1.166,主机IP地址为192.168.1.10,请首先在主机上编写程序实现对10个整数由大到小进行排序(请写出完整源码)。然后简述该程序编译、下载至目标机、修改文件权限以及执行该程序的过程。

1. #include <stdio.h>

void main()

{ void sort(int x[ ],int n);  

   int *p,i,a[10];

   p=a;

   for(i=0;i<10;i++)  scanf(“%d”,p++);

   p=a;

   sort(p,10);

   for(p=a,i=0;i<10;i++)

   { printf(“%d ”,*p);   p++;   }

   printf("\n"); }

void sort(int x[],int n) 

{ int i,j,k,t;

   for(i=0;i<n-1;i++)

   { k=i;

      for(j=i+1;j<n;j++)

        if(x[j]>x[k]) k=j;

           if(k!=i)                   { t=x[i];x[i]=x[k];x[k]=t; }  } }

然后在linux环境下当前路径使用命令

arm-linux-gcc –o hello hello.c生成hello文件

然后采用TFTP服务器实现程序下载TFTP –r hello –g 192.168.1.166

通过超级终端登录到目标机,使用命令Chmod 777 hello修改属性

最后通过命令./hello执行该程序。

4、下段代码是一段简单的C循环函数,在循环中含有数组指针调用。

CodeA

  void increment(int *restrict b,    int *restrict c)

  {          int i;

             for(i = 0; i < 100; i++)

             {

                         c[i] = b[i] + 1;

             }

  }

5、请改写上述代码段,以实现如下功能:

――循环100次变成了循环50次(loop unrolling),减少了跳转次数;

  ――数组变成了指针,减少每次计算数组偏移量的指令;

  ――微调了不同代码操作的执行顺序,减少了流水线stall的情况;

  ――循环从++循环变成了――循环。这样可以使用ARM指令的条件位,为每次循环减少了一条判断指令。

答:void increment(int *b, int *c)

  {int i;

  int *pb, *pc;

  int b3, b4;

  pb = b - 1;

  pc = c - 1;

  b3 = pb[1];

  for (i = (100 / 2); i != 0; i--)

  {b4 = *(pb += 2);

  pc[1] = b3 + 1;

  b3 = pb[1];

*(pc += 2) = b4 + 1; }}

6、请按要求写出一个makefile文件,要求包括:采用arm-linux-gcc交叉编译器,源文件为led8.c,目标文件为led8,使用led8.h头文件,使用相应宏变量。

CC             = arm-linux-gcc

INSTALL                  = install

TARGET                  = led8

all : $(TARGET)

$(TARGET): led8.c led8.h

      $(CC) -static $< -o $@

clean :

      rm -rf *.o $(TARGET) *~

7、设指令由取指、分析、执行3个子部件完成,每个子部件的工作周期均为Dt,采用常规标量单流水线处理机。若连续执行30条指令,则共需时间多少Dt? 顺序执行时,每条指令都需三步才能执行完,没有重叠。

所以连续执行30条指令后,共需时间为2+30=32Dt

8. 若内存按字节编址,用存储容量为8K*8比特的存储器芯片构成地址编号A0000H~DFFFFH的内存空间,则至少需要多少片。

给定起、止地址码的内存容量=终止地址起始地址+1

将终止地址加1等于E0000H,再减去起始地址,即E0000HA0000H=40000H。十六进制的(40000)16=218

组成内存储器的芯片数量=内存储器的容量/单个芯片的容量。

218/(8*210)=218/213=25

9、 下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码。

__interrupt double xyz (double r)
{
double xyz= PI * r * r;
printf("\nArea = %f", xyz);
return xyz;
}

ISR 不能返回一个值。

ISR 不能传递参数。

在ISR中做浮点运算是不明智的。

printf()经常有重入和性能上的问题

10、 在某工程中,要求设置一绝对地址为0x987a的整型变量的值为0x3434。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。

int *ptr;

ptr = (int *)0x987a;

*ptr = 0x3434;

11、假设某系统的一个绝对地址为0x9527的整型变量的值为0x1633。请编写代码实现这一操作

int *ptr;

ptr = (int *)0x9527;

*ptr = 0x1633;

12、请写出对应C代码的ARM 指令。

C代码:

if(a>b)

a++;

else

b++;

ARM 指令:

CMP R0,#d

ADDEQ R0,R1,#1

ADDNE R0,R1,#1

13、请写出下列ARM 指令的功能。

MOV R1,#0x10; 将0x10存入R1

MOV R0,R1; 将R1内的数据存入R0

MOVS R3,R1,LSL #2; 将R1内的数据左移两位后存入R3

MOV PC,LR;  将LR 的值复制到 PC

14、使用ARM汇编语言指令编写一个实现冒泡排序功能的程序段。

AREA Sort,CODE,READONLY   ; 声明代码段

AREA Array,DATA,READWRITE ;   声明数据段

src  DCD 2,4,10,8,14,1,20; 定义一个字节单元src

len  EQU 7*4                                  ; 获取数据的长度

ENTRY                                ; 标识程序入口

CODE32                  ;声明32位ARM指令

start                                   ;主程序标志

MOV R4,#0                          ;R4清零

LDR R6,=src             ; R6指向数据的开头

ADD R6,R6,#len        ; R6指向数据的末尾

outer                                  ;oute循环开始

LDR R1,=src             ; R1指向数据的开头

inner                                  ;inner循环开始

LDR R2,[R1]              ; 获取R1地址中的数字

LDR R3,[R1,#4]; 获取R1下一个地址中的数字

CMP R2,R3               ; 比较R2,R3

STRGT R3,[R1]          ;如果R2 >R3

STRGT R2,[R1,#4]      ; 交换两个数字的位置

ADD R1,R1,#4                      ;R1后移一位

CMP R1,R6               ;比较当前位置和结束位置

BLT inner     ; 如果没结束继续inner循环

ADD R4,R4,#4                      ; 全局计数器+1

CMP R4,#len            ; 比较当前位置

SUBLE R6,R6,#4;如果不是结束if not meet the ending

BLE outer                 ; 跳转到outer

MOV   PC,LR       ;子程序返回

END                                   ; 程序结束

15、编写一个实现数组排序的C语言程序,调用第6题中用汇编语言编写的冒泡排序程序段。

int i, j, tmp;

int b[]={18,24,12,59,101,96,34};

for(i = 0; i < 6; i++)

{

for(j = i + 1; j < 7 ; j++)

{

if(b[i] > b[j])

{

tmp = b[i];

b[i] = b[j];

b[j] = tmp;

}

}

}

i = 0;

while(i++ < 7)

printf("%d ", b[i - 1]);

C语言调用汇编

#include<stdio.h>

extern viod Sort(int b[]);

int main()

{

   int b[]={18,24,12,59,101,96,34};

   Sort(int b[])

}

16、嵌入式系统中经常要用到无限循环,怎么样用C语言编写死循环呢?

while(1){}

for(;;){}

Loop:

...

goto Loop;

17、求两个数的和

AREA          Buf, DETE,READWRITE      ;声明数据段Buf

Count  DEC  20          ;定义一个字节单元Count=20

AREAExample1,CODE,READONLY ;声明代码段Example1

ENTRY                    ;标识程序入口

CODE32      声明32位ARM指令

START 

        LDRB R0, Count            

   ;R0= Count=20

MOV          R1,#10                            ;将10传送给R1  MOVS  R2,R1,LSL #3     ;将寄存器R1的值左移3位后传送给R2并影响标志位

LOOP            BL  ADD_SUB            ;调用子程序ADD_SUB

            B LOOP  ;跳转到LOOP

ADD_SUB         

            ADDS      R0,R0,R2                   ;R0 = R0 + R2

            MOV       PC,LR         ;子程序返回

            END          ;文件结束

 

18、 请在横线处说明该横线对应的指令的功能。

AREA  Example, CODE, READONLY     ;        声明代码段Example                                          

ENTRY                               ;         标识程序入口                      

CODE32

START

MOV  R0,#2

MOV  R1,#5

LOOP  

BL  ADD_SUB                       ;         调用子程序ADD_SUB                 

B   LOOP

ADD_SUB

ADDS  R0,R0,R1                   ;         R0=R0+R1                   

MOV   PC,LR                       ;         子程序返回                    

END

2. 请在横线处写出该横线对应的指令的运行后寄存器的值。

MOV R0,#0x2000               ;    R0=0x00002000                       

MOV R1,#0x800

3. 假设目前处理器处于刚刚上电的状态,想实现将CPSR的模式修改为svc模式并禁止IRQ中断,开FIQ中断,请在横线处写出该注释对应的指令。(6分)

AREA ABC,CODE,READONLY

                   ENTRY                                                                          ;程序入口

    CODE32                                                                      ;声明32位ARM指令

START

  MRS R0,CPSR           ;读状态寄存器CPSR的数据到R0中

  BIC R0,R0,#0x1F         ;对R0低5位进行清0,清除模式位

  ORR R0,R0,#0x93       ;低8位或(10010011), 设为管理(svc32)模式, 禁止IRQ中断,开FIQ中断

  MSR CPSR,R0          ;写入状态寄存器CPSR,更新

END

19、请按要求写出一个Makefile文件,要求包括:采用arm-linux-gcc交叉编译器,源文件为led8.c,目标文件为led8,使用led8.h头文件,使用相应宏变量。

CC            = arm-linux-gcc

INSTALL= install

TARGET=led8

all : $(TARGET)

$(TARGET):led8.c led8.h

                  $(CC) -static $< -o $@

20、假设目标机ARM开发板的IP地址为192.168.1.166,想要输出一个字符串,请完成下面过程。

1)在主机上编写程序实现“Hello World!”的输出(请写出完整源码);

2)完成该程序编译并下载到目标机;

3)完成文件权限修改并执行该程序。

答:#include <stdio.h>   

int main()          

{

  printf(“Hello World!\n”); 

  return 0;

}

首先在linux环境下当前路径使用命令

arm-linux-gcc –o hello hello.c生成hello文件

然后采用TFTP服务器实现程序下载TFTP –r hello –g 192.168.1.166

通过超级终端登录到目标机,使用命令Chmod 777 hello修改属性

最后通过命令./hello执行该程序

21、Linux内核移植时,假设当前目录是/home/book,在此目录下创建kernel子目录,解压Linux-3.14.tar.xz,然后完成配置并编译内核。完成下面过程。

1)写出创建子目录及解压命令;

$mkdir /home/kernel

$cd kernel

$tar -xvf linux-3.14-tar.xz

  1. 完成配置和编译步骤;

$cd linux-3.14

$vim Makefile   // arch ?= arm,    cross_compile ?= arm-none-linux-gnueabi-

$ cp arch/arm/configs/exynos_defconfig  .config

$make menuconfig

$make uImage

3) u-boot使用网络需设置哪些环境变量,且需要注意哪些问题

ipaddr和serverip;

需要注意的为:ipaddr 和serverip 需在同一⽹段,即服务器serverip和Ubuntuip⼀致。

22、某计算机系统由下图所示的部件构成,假定每个部件的千小时可靠度R均为0.85,则该系统的千小时可靠度约为?(保留小数点后四位)

 

串联部件的可靠度=各部件的可靠度的乘积。

并联部件的可靠度=1 – 各部件失效率的乘积。

题目中给出的系统由三个部件串联组成,其中第二、第三部件又分别由两个部件并联构成,因此整个系统的可靠度为

0.85 *(1 – (1 – 0.85)* (1 – 0.85)) * (1 – (1 – 0.85) * (1 – 0.85)) ≈ 0.8122

23、请写一段代码,要求使用cdev_alloc()函数动态分配一个新的cdev结构体并初始化。

struct cdev * my_cdev=cdev_alloc();

my_cdev->owner=THIS_ MODULE;

my_cdev->ops=&fops;

5. a,b是如下counter类的两个实例。

#include <QObject>

class Counter : public QObject

{

    Q_OBJECT

public:

    Counter() { m_value = 0; }

    int value() const { return m_value; }

public slots:

    void setValue(int value);

signals:

    void valueChanged(int newValue);

private:

    int m_value;

};

当实现如下操作后,

Counter a, b;

    QObject::connect(&a, &Counter::valueChanged,

                     &b, &Counter::setValue);

a.setValue(19);   

b.setValue(40);   

请分别写出a.value(), b.value()的值

a.setValue(19); a.value()=19, b.value()=19

b.setValue(40); a.value()=19,b.value()=40

24、假设某系统的一个绝对地址为0x9527的整型变量的值为0x1314。请编写代码实现这一操作。

(C语言或者汇编语言皆可)

int *ptr;

ptr = (int *)0x9527;

*ptr = 0x1314;

25、假设某处理机的流水线指令由7个子部件完成,每个子部件的工作周期均为t,采用常规标量单流水线处理机。若连续执行20条指令,则共需时间多少t?

顺序执行时,每条指令都需7步才能执行完,没有重叠。

N级流水线执行,在单标量情况下,执行时间=(N-1)+指令数量

所以连续执行20条指令后,共需时间为(7-1) + 20=26Dt

2.请按要求写出一个makefile文件,要求包括:采用arm-linux-gcc交叉编译器,源文件为led8.c,目标文件为led8,使用led8.h头文件,使用相应宏变量。

CC= arm-linux-gcc

INSTALL= install

TARGET= led8

all : $(TARGET)

$(TARGET): led8.c led8.h

$(CC) -static $< -o $@

clean :

                  rm -rf *.o $(TARGET) *

26、假设目标机ARM开发板的IP地址为192.168.1.165,请首先在主机上编写程序实现对10个整数由大到小进行排序(请写出完整源码),然后简述将该程序编译、下载至目标机、修改文件权限以及执行该程序的过程。

#include <stdio.h>

void main()

{ void sort(int x[ ],int n);  

   int *p,i,a[10];

   p=a;

   for(i=0;i<10;i++)  scanf(“%d”,p++);

   p=a;

   sort(p,10);

   for(p=a,i=0;i<10;i++)

   { printf(“%d ”,*p);   p++;   }

   printf("\n"); }

void sort(int x[],int n) 

{ int i,j,k,t;

   for(i=0;i<n-1;i++)

   { k=i;

      for(j=i+1;j<n;j++)

        if(x[j]>x[k]) k=j;

           if(k!=i)

                                       { t=x[i];x[i]=x[k];x[k]=t; }  } } ------2分

然后在linux环境下当前路径使用命令

arm-linux-gcc –o hello hello.c生成hello文件(1分)

然后采用TFTP服务器实现程序下载

TFTP –r hello –g 192.168.1.165(1分)

通过超级终端登录到目标机,使用命令

Chmod 777 hello修改属性(1分)

最后通过命令

./hello执行该程序(1分)

27、请编写一个函数,实现对含有1000个整型元素的数组testa进行每个元素加1然后赋值给新数组testb的操作。并且该代码段有如下要求:循环次数为500次;每次循环减少一条判断指令;流水线阻塞减少。

void increment(int *b, int *c)

  {int i;

  int *pb, *pc;

  int b3, b4;

  pb = b - 1;

  pc = c - 1;

  b3 = pb[1];

  for (i = (100 / 2); i != 0; i--)

  {b4 = *(pb += 2);

  pc[1] = b3 + 1;

  b3 = pb[1];

  *(pc += 2) = b4 + 1; }}

程序评价视完成目标及代码流畅度决定。

------完成程序给2分

――循环次数压缩(1分)

――数组变成了指针;(1分)

――循环从++循环变成了――循环。

28、某计算机中断系统有4级中断I1、I2、I3、I4,中断响应的优先次序为I1>I2>I3>I4。每一级中断对应一个屏蔽码,屏蔽码中某位是“1”表示禁止中断(关中断),若为“0”则表示允许中断(开中断)。各级中断处理程序与屏蔽码的关系如下表所示。

中断处理程序

屏蔽码

I1级

I2级

I3级

I4级

I1级

1

1

1

1

I2级

0

1

1

1

I3级

0

0

1

1

I4级

0

0

0

1

若将中断优先次序设置为I1>I4>I3>I2,即响应I1,再响应I4,然后是I3,最后是I2。请重新设置各级的屏蔽码。

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值