您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页ARM cotex-A8嵌入式原理与系统设计习题答案

ARM cotex-A8嵌入式原理与系统设计习题答案

来源:华佗小知识


第1章

1.1 什么是嵌入式系统?

嵌入式系统是以应用为中心、以计算机技术为基础、软/硬件可剪裁、适用于对系统功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。 1.2 嵌入式系统的应用领域有哪些? 列举一些生活中的嵌入式系统实例。

嵌入式系统的应用领域有交通管理、工控设备、智能仪器、汽车电子、环境监测、电子商务、医疗仪器、移动计算、网络设备、通信设备、军事电子、机器人、智能玩具、信息家电等;

①网络设备: 交换机、路由器、Modem 等。

②消费电子: 手机、MP3、PDA、可视电话、电视机顶盒、数字电视、数码照相机、数码摄像机、信息家电等。

③办公设备: 打印机、传真机、扫描仪等。

④汽车电子: ABS (防死锁制动系统)、供油喷射控制系统、车载 GPS 等。 ⑤工业控制: 各种自动控制设备 1.3 嵌入式系统的组成有哪些?

嵌入式系统一般由硬件层,中间层,软件层三层组成。 1.4 嵌入式系统的特点有哪些?

嵌入式系统有以下4个特点:系统内核小、专用性强、系统精简、实时性高。 1.5 简述嵌入式系统的发展。

嵌入式系统具有以下6个发展趋势:系统工程化、开源化、功能多样化、节能化、人性化、网络化。

1.6 常用的嵌入式处理器分为哪几类?

常见的嵌入式处理器有一下四类:嵌入式微处理器、嵌入式微控制器、嵌入式 DSP 处理器、嵌入式片上系统。

1.7 嵌入式操作系统的特点有哪些?

嵌入式操作系统有以下6个特点:系统内核小、专用性强、系统精简、高实时性、多任务的操作系统、需要专用开发工具和环境。

1.8 什么是实时操作系统? IEEE 实时 UNIX 分委会认为实时操作系统应具备哪些特点? 实时操作系统是指在限定的时间内能对过程调用产生正确的响应的操作系统。IEEE 的实时UNIX分委会认为实时操作系统应具备以下特点:异步的事件响应、切换时间和中断延迟时间确定、优先级中断和调度、抢占式调度、内存锁定、连续文件、同步。 1.9 常用的嵌入式操作系统有哪些? 它们各有什么特点?

操作系统 uCLinux Android Windows CE VxWorks Nucleus uC / OS II QNX Linux 特点 遵守GNU/ GPL,完全开源;移植性好;网络功能优秀;支持多文件系统;API接口丰富。 良好的平台开放性、可以实现个性化应用设定和与Google 应用的无缝结合。 与Windows 系列有较好的兼容性;能在多种处理器体系结构上运行;采用模块化设计;没有开放源代码;耗费内存。 支持多种处理器;具有先进的网络功能;具有良好的可靠性、卓越的实时性、高效的可裁剪性。 抢占式多任务操作系统内核;便于移植并且支持多种处理器;核心代码精简。 公开源代码;可移植性强;可固化、可裁剪;占先式、多任务;系统任务;中断管理;稳定性和可靠性都很强。 实时可拓展;内核精简;运行速度快。 开源的自由操作系统;真正的多用户多任务操作系统;内核可剪裁;实时性好;网络功能强大;支持目前多数的处理器;稳定性和可靠性都很强。

1.10 嵌入式系统工程设计的要点有哪些?

应用需求;硬件要求;实时性的实现;系统功耗;系统升级方式;调试方式;开发环境的选择等。

1.11 举出几个嵌入式系统应用的例子, 通过查资料和思考, 说明这些嵌入式系统产品主要由哪几部分组成,每个组成部分用于完成什么功能。

比较典型的例子:手机。 组成部分:

处理器:核心处理器;

内存:操作系统,程序运行的存储空间; 闪存:存放操作系统,文件等;

屏幕:显示,如果是触摸屏还有输入功能; 按键(非必须):输入。

第2章

2.1 ARM 微处理器及技术的应用领域及主要产品有哪些? 举一些生活中常用的 ARM 处理

器应用的例子。

ARM微处理器觉得应用领域有工业控制领域、无线通信领域、网络应用、消费类电子产品、成像和安全产品等。目前绝大多数的手机、平板采用的处理器都是ARM架构cortex-a系列的处理器,而其cortex-m系列在智能设备也得到广泛应用,小米手环2就是用的cortex-m4的核。

2.2 采用 RISC 架构的 ARM 微处理器有哪些特点?

体积小、低功耗、低成本、高性能;支持Thumb (16 位) / ARM (32 位)双指令集, 能很好地兼容8位/16位器件;大量使用寄存器;指令执行速度更快;大多数数据操作都在寄存器中完成;寻址方式灵活简单,执行效率高;指令长度固定。 2.3 ARM内核基本版本有哪些? 每个版本都有哪些基本的性能?

内核基本版本 V1 版本 基本的性能 基本的数据处理指令 (无乘法);基于字节、半字和字的 Load / Store 指令;转移指令, 包括子程序调用及链接指令;供操作系统使用的软件中断指令 SWI;寻址空间: MB。 V2 版本 V3 版本 乘法和乘加指令;支持协处理器操作指令;快速中断模式;SWP/ SWPB 的最基本存储器与寄存器交换指令;寻址空间: MB。 寻址空间增至 32 位 (4 GB);当前程序状态信息从原来的 R15 寄存器移到当前程序状态寄存器CPSR (Current Program Status Register)中;增加了程序状态保存寄存器 SPSR (Saved Program Status Register);增加了两种异常模式,使操作系统代码可方便地使用数据访问中止异常、指令预取中止异常和未定义指令异常;增加了 MRS/ MSR 指令, 以访问新增的 CPSR/ SPSR 寄存器;增加了从异常处理返回的指令功能。 V4 版本 有符号和无符号半字及有符号字节的存/ 取指令;增加了 T 变种, 处理器可工作在 Thumb 状态, 增加了 16 位 Thumb 指令集;完善了软件中断 SWI 指令的功能;处理器系统模式引进方式时使用用户寄存器操作;把一些未使用的指令空间捕获为未定义指令。 V5 版本 新增带有链接和交换的转移 BLX 指令;新增计数前导零 CLZ 指令;新增BRK 中断指令;增加了数字信号处理指令 (V5TE 版);为协处理器增加更多可选择的指令;改进了ARM/ Thumb状态之间的切换效率; V6 版本 ThumbTM: 35% 代码压缩;DSP 扩充: 高性能定点 DSP 功能;JazelleTM: Java 性能优化, 可提高 8 倍;Media 扩充: 音 / 视频性能优化, 可提高 4 倍。 V7 版本 首次采用了强大的信号处理扩展集;采用了Thumb-2技术;采用了 NEON技术;支持改良的浮点运算。 2.4 ARM 微处理器有哪些系列? 它们有什么特点?

微处理器系列 ARM7微处理器系列 特点 调试开发方便;功耗极低;能够提供0.9MIPS/ MHz的三级流水线结构;代码密度高并兼容16的Thumb指令集;对操作系统的支持广泛;指令系统与ARM9系列、ARM9E系列和 ARM10E系列兼容,便于用户的产品升级换代;主频最高可达130MIPS。 ARM9微处理器系列 5级整数流水线, 指令执行效率更高;提供1.1MIPS/ MHz 的哈佛结构;支持32位 ARM指令集和16位Thumb指令集;支持32位的高速AMBA总线接口;全性能的MMU支持多种主流嵌入式操作系统;MPU支持实时操作系统;

支持数据Cache和指令Cache,具有更高的指令和数据处理能力 ARM9E微处理器系列 支持DSP指令集;5级整数流水线;支持32位ARM指令集和16位Thumb指令集;支持32位的高速AMBA总线接口;支持VFP9浮点处理协处理器;全性能的MMU支持多种主流嵌入式操作系统;MPU支持实时操作系统;支持数据Cache和指令Cache,具有更高的指令和数据处理能力;主频最高可达300MIPS。 支持DSP指令集;6级整数流水线;支持32位ARM指令集和16 位Thumb指令集;支持32位的高速AMBA总线接口;支持VFP10浮点处理协处理器;全性能的MMU,支持多种主流嵌入式操作系统;支持数据Cache和指令Cache, 具有更高的指令和数据处理能力;主频最高可达 400MIPS;内嵌并行读/写操作部件 ARM10E微处理器系列 SecurCore微处理器系列 带有灵活的保护单元, 以确保操作系统和应用数据的安全;采用软内核技术, 防止外部对其进行扫描探测;可集成用户自己的安全特性和其他协处理器。 StrongARM微处理器系列 Xscale处理器 Cortex系列处理器 集成度高;在软件上兼容ARMv4体系结构 全性能、高性价比、低功耗;支持16位的Thumb指令和 DSP指令集。 分为Cortex-M、Cortex-R和Cortex-A三类;Cortex-M系列针对微控制器, 在该领域中需要进行快速且具有高确定性的中断管理, 同时需将门数和可能功耗控制在最低;Cortex-R系列针对实时系统, 面向深层的嵌入式实时应用;Cortex-A面向尖端的基于虚拟内存的操作系统和用户应用, 也叫应用程序处理器 2.5 在选择ARM微处理器时要考虑哪些因素?

处理器的基本架构与内核版本;处理器的性能,功耗;处理器的兼容性;处理器的价格;支持的指令格式;处理器支持的操作系统等因素。

2.6 Cortex-A8内核结构有哪些组成部分?每个部分各完成什么功能?

Cortex-A8内核有以下结构组成:

指令读取单元完成对指令流进行预测;指令解码单元对所有ARM指令,Thumb-2指令进行译码排序;指令执行单元执行所有整数 ALl 运算和乘法运算, 并影响标志位,根据要求产生用于存取的虚拟地址以及基本回写值,将要存放的数据格式化, 并将数据和标志向前发送,处理分支及其他指令流变化, 并评估指令条件码;数据存取单元包含了全部 L1 数据存储系统和整数存取流水线;L2 Cache单元包含L2 Cache和缓冲接口单元BIU;NEON单元单元包含一个10段 NEON流水线, 用于译码和执行高级SIMD多媒体指令集;ETM单元是一个非侵入跟踪宏单元,可以对指令和数据进行跟踪, 并能对跟踪信息进行过滤和压缩;处理器外部接口。

2.7 三星S5PV210处理器是基于哪种架构的?它主要有哪些特点?

三星S5PV210处理器基于ARM架构,采用基于ARM V7的Cortex-A8核;有如下特点:

低功耗,高性能;主频可达1GHz,具有/32位内部总线结构,32/32KB的数据/指令一级缓存,512KB二级缓存,运算能力可以达到2000DMIPS;支持LPDDR1,LPDDR2,DDR2类型RAM;Nandflash,Norflash,OneNand等类型Flash;支持存储空间最大32G(ROM),最大支持32G的TF卡;包含强大的硬件编解码功能,内建MFC,支持多种格式视频编解码;支持IIS、AC97和PCM音频接口;外部总线模块支持4路UART串口,3路IIC总线,2路SPI总线。 2.8 ARM集成开发环境RVDS包含哪几个模块?这些模块各有什么特点?

RVDS包含4个模块: IDE、 RVCT、RVD和RVISS;

IDE:将软件开发与ARM RealView工具的编译和调试技术结合在一起。可以用作项目管理器, 为ARM目标创建、生成、调试、监视和管理项目。

RVCT:业界最优秀的编译器,支持全系列的ARM和XSCALE架构,支持汇编、C和C++ 语言,支持二次编译和代码数据压缩技术,能够生成更小的可执行文件,节省ROM空间。

RVD:RVD是RVDS中的调试软件,功能强大,支持Flash烧写和多核调试,支持多种调试手段,快速错误定位

RVISS:RVISS是指令集仿真器,支持外设虚拟,可以使软件开发和硬件开发同步进行,同时可以分析代码性能,加快软件开发速度。

2.9 ARM集成开发环境RVDS支持哪些处理器和模拟器?

RVDS支持以下处理器:ARM7,ARM9,ARM10,ARM11处理器系列;ARM11 MPCore多核处理器;Cortex系列处理器;RealView Debugger中的SecurCore、SC100和SC200 处理器;RVCT 中的SecurCore SC300处理器;RealView Debugger中支持Faraday FA526、FA626和FA626TE处理器;Marvell Feroceon 88FR101和88FR111处理器。

RVDS支持以下模拟器:RealView ARMulator指令集模拟器(RVISS);指令集系统模型 (ISSM);RTSM;SoC Designer。

2.10 什么是嵌入式系统的交叉开发环境?

嵌入式系统充当程序的运行环境而非开发环境,因此为了能够开发出适合在嵌入式系统运行的程序,就要使用交叉开发环境。在一个平台上开发出来在另一个平台运行的程序就是交叉开发。交叉开发环境就是用来在宿主机(通用计算机,通常为PC或工作站)上面生成可以在目标机(嵌入式系统)运行的程序的开发环境。

2.11 GCC 交叉编译器的编译流程和执行过程有哪些? GCC 编译常见的错误类型有哪些? GCC交叉编译的流程如下:源文件(*.c,*.s等)->预处理(*.i)->编译(*.S)->汇编(*.o)->链接(elf可执行文件)->转换(bin文件)

GCC编译常见的错误类型有:语法错误;头文件错误,找不到代码中使用的头文件;内建函数使用错误;档案库错误,找不到库文件;未定义的符号错误等 2.12 嵌入式系统的交叉开发环境下有哪些调试方法?

有以下调试方法:ROM仿真、在线仿真、在系统编程、JTAG调试、软件仿真器等。 2.13 Eclipse for ARM 开发环境搭建的步骤是什么? 根据本书介绍搭建 Eclipse for ARM 开发环境。

安装YAGARTO GCC编译工具;安装YAGARTO工具;安装JRE;安装Eclipse for ARM;安装仿真器驱动和仿真器工具软件。

2.14 在Eclipse for ARM开发环境下构建一个工程并且编译调试工程,学会Eclipse for ARM的使用。

根据教材内容自行操作。

第3章

3.1 简述Cortex - A8微处理器的几种工作模式。

Cortex-A8处理器有8种模式:用户模式(usr);系统模式(sys);管理模式(svc);中止模式(abt);未定义模式(und);通用中断模式(irq);快速中断模式(fiq);监控模式(mon)。 3.2 举例说明Cortex - A8微处理器的存储格式。

Cortex - A8处理器支持小端格式和字节不变的大端格式。此外,处理器还支持混合大小端格式(既有大端格式又有小端格式)和非对齐数据访问。对指令的读取,则总是以小端格式操作。

3.3 简述机器指令LDR与汇编伪指令的区别。

机器指令LDR用于将存储器中的32位的字数据传送到目标寄存器中,使用格式为:

LDR{条件}目的寄存器<存储器地址>

而LDR伪指令的作用是将一个值加载到目标寄存器中,使用格式为:

LDR目的寄存器=<立即数>

两者的本质的区别是一个是加载地址中的数据,一个是加载一个立即数。LDR伪指令补充了MOV指令加载立即数的不足。 3.4 简述CPSR状态寄存器中各有效位的含义。

条件标志位(N、Z、C、V);Q标志位(定用于指示增强的DAP指令是否发生了溢出);IT块(用于对thumb指令集中if-then-else这一类语句块的控制);J位用于表示处理器是否处于ThumbEE状态;GE[3:0](该位用于表示在SIMD指令集中的大于、等于标志);E位(控制存取操作的字节顺序);A位(表示异步异常禁止);控制位(中断禁止位,T位和模式位)。 3.5 简述Cortex - A8微处理器的异常类型。

异常类型 说明 当复位信号产生时,复位发生处理器放弃正在执行的指令 FIQ异常支持快速中断 复位异常 快速中断异常FIQ 中断异常IRQ 中止异常 软件中断 监控异常 未定义指令异常 发生中断,在快速中断过程中中断异常不发生 中止是一种异常,用于告知操作系统:与某个值关联的内存访问失效。 进入管理模式 当处理器执行SMC指令时, 内核进入监控模式请求监控功能 遇到一条处理器或系统协处理器无法处理的指令时进入 3.6 什么是寻址? 简述Cortex - A8微处理器的寻址方式。

寻址是根据指令中给出的地址码字段来寻找真实操作数地址的方式;Cortex-A8支持的寻址方式有以下几种:寄存器寻址(取出寄存器中的值作为操作数)、立即数寻址(操作数为明确数值)、寄存器移位寻址(对操作数进行移位操作)、寄存器间接寻址(将寄存器中的值作为地址,去改地址中保存的值作为操作数)、变址寻址(在基址寄存器的基础上加上偏移量,然后将该值作为地址取其地址中的值作为操作数)、多寄存器寻址(一次操作传送多寄存器的值)、堆栈寻址(堆栈是一种按特定顺序进行存取)、块拷贝寻址(把一块数据从存储器的某一位置复制到另一位置)、相对寻址(变址寻址的一种变通,由程序计数器(PC)提供基地址,指令中的地址码字段作为偏移量,两者相加后得到操作数的有效地址)等。 3.7 编程实现位加法、位减法、位求负数功能,结果放在R1、R0寄存器中。

@位加法:

@R2,R3存放第一个位数据 @R4,R5存放第二个位数据 ADDS R0, R2, R4 :加低32位字 ADC R1, R3, R5 :加高32位字

@位减法

@R2,R3存放第一个位数据(被减数) @R4,R5存放第二个位数据(减数) SUBS R0, R2, R4 SBC R1, R3, R5

@位求负数 RSB R0, R2, #0 RSC R1, R3, #0

3.8 B指令、BL指令、BLX指令和BX指令用于实现程序流程的跳转,有何异同?

B指令只是做简单的跳转;BL指令在跳转之前会将当前PC寄存器的值保存在R14寄存器(LR)中,通过LDR PC,LR 语句可以返回跳转前的位置;BLX指令与BL区别在于跳转的时候切换处理器工作状态,在ARM状态和Thumb状态间切换。 3.9 简述汇编语言的程序结构。

汇编语言的程序结构由段(section)构成;段又分为代码段和数据段;每个汇编程序至少包含一个代码段,零个或多个包含初值的数据段,零个或多个不包含初值的数据段。 3.10 ALIGN伪操作的指令的作用是什么?什么情况下需要伪操作?在AREA伪操作中有ALIGN属性,它与单独的ALIGN伪操作有什么不同?

定义代码段和数据段的对齐方式。当某代码段的地址不是4的整数倍的时候需要该伪操作。在AREA伪操作中ALIGN属性的作用范围只限定于AREA申请的区域,而单独的ALIGN作用范围为该伪操作后面的所有代码。

3.11 如何在C语言程序中内嵌汇编程序?如何在汇编程序中访问C程序变量?

在C语言中使用以下格式来嵌套汇编代码

__asm{ /*汇编1*/ /*汇编2*/ ………... }

在汇编程序中访问C程序变量方式如下:

1) 使用IMPORT 伪指令声明这个全局变量;

2) 使用LDR 指令读取该全局变量的内存地址,通常该全局变量的内存地址存放在程序的数据缓冲池中;

3) 根据该数据类型, 使用相应的LDR 指令读取该全局变量的值,使用相应的STR 指令修改该全局变量的值。

3.12 程序设计:使用LDR指令读取0x40003100上的数据,将数据加1,若结果小于10则使用STR指令把结果写回原地址,若结果大于等于10,则把0写回原地址。然后再次读取0x40003100上的数据,将数据加1,判断结果是否小于10……周而复始循环。

程序设计如下: _START: MAIN:

LDR R0, =0X40003100 LDR R1, [R0] ADD R1, R1, #1 MOV R2, #10 SUBS R3, R1, R2 MOVLT R3,#0 STR R3, [R0] B MAIN

第4章

4.1 S5PV210微处理器是哪种封装形式?这种封装有什么优缺点?

S5PV210芯片是584引脚的FCFBGA封装,引脚间距0.65mm,体积为17x17mm。 FCFBGA封装既能容纳较多的管脚,又能保证管脚间距,具有良好的电气性能。但是对焊装的要求很高,无法手工焊装。

4.2S5PV210微处理器有多少个GPIO端口?有多少GPIO引脚?

S5PV210微处理器有35组GPIO端口,237个GPIO引脚。 4.3如何对复用的GPIO引脚进行配置?

通过设置该引脚所属组的端口控制寄存器的相应位进行配置其功能,例如GPA0组的第一个端口作为输入端口则只需要将GPA0CON的0-3位设置为0000即可。寄存器具体地址以及相应位可以查询芯片手册。

4.4 端口上拉寄存器的功能是什么?何种情况下需要上拉?

端口上拉寄存器控制了每个端口的上拉电阻的允许/禁止;当引脚端口作为输入端口时,需要上拉,用于检测低电平信号。

4.5 如何在C程序中给32位的寄存器中的某几位置1而不影响其他位的值?

用位或和移位操作实现,例如将32位整型数据的a位、b位(a、b为整常量)置1,可参考以下代码:

x |= (1<用位与和移位操作实现,例如将32位整型数据的a位、b位(a、b为整常量)置0,可参考以下代码:

x &= ~(1<可以通过位与操作判断,例如判断a位是否为1示例如下: x &= (1<{/*该位为1*/} else

{/*该位为0*/}

4.8 如何在C程序中编程检测32位寄存器中的某位是否为0?

可以通过位与操作判断,例如判断a位是否为0示例如下: x &= (1<{/*该位为0*/} else

{/*该位为1*/}

第5章

5.1 随机存储器和只读存储器有何区别?

随机存储器数据掉电易丢失;随机存储器读写时可以从存储器任意地址处进行。 只读存储器数据掉电不丢失。 5.2 请解释 SRAM、 DRAM 和 SDRAM。

SRAM(Static Random Access Memory)静态随机存储器;DRAM(Dynamic Random Access Memory)动态随机存储器;SDRAM(Synchronous Dynamic Random Access Memory)同步动态随机存储器。

5.3 简述内存管理单元的作用。

地址存储单元(MMU)主要有两个作用:①实现虚拟地址向物理地址的映射,即管理地址重定位;②管理访问权限。

5.4 试描述ARM存储器管理的分页功能和处理流程。

ARM存储管理器将物理地址和虚拟地址都划分一块块的小空间,这种划分成为分页;CPU访问的地址空间为虚拟地址空间,而存储器对应的是物理地址空间。当CPU去访问一个虚拟地址空间的时候,如下图所示,MMU会找到该虚拟地址空间的所属页,然后根据预先设置好的对应规则去寻找相应的物理地址的所属页,在物理页的基础上加上偏移量从而完成虚拟地址向物理地址的映射。一般情况下虚拟地址空间大于物理地址空间,所以有可能多块虚拟地址映射到同一物理地址,也有可能没有映射到物理地址,当用到该虚拟地址时才得到映射。

找到该虚拟地址所在页CPU操作虚拟地址映射至物理地址页物理地址加偏移量 MMU处理流程

5.5 嵌入式系统的初始化过程包括哪些步骤?

嵌入式系统初始化包括两大步:初始化运行环境,初始化应用程序。 在初始化运行环境的时候应该完成以下工作:标识初始化代码的入口;设置异常向量表、

中断向量表; 初始化存储器系统; 初始化堆栈指针; 初始化一些关键的I/O口; 初始化中断系统需要的RAM变量;使能中断;如果需要,切换处理器模式;如果需要,切换处理器状态。

在初始化应用程序的时候应该完成以下工作:通过复制初始化数据到可写数据段来初始

化非0 可写数据;对ZI数据段清零;存储器初始化后,程序控制权交给应用程序的入口,如C运行时库。

5.6 简述S5PV210微处理器进行内存映射的机制。

S5PV210的虚拟地址由虚拟页号和页内偏移量两部分组成。MMU根据虚拟页号查找Translation Table找到虚拟页号对应的物理页,然后加上页内偏移量即可得到虚拟地址对应的物理地址。例如如果虚拟地址的页内偏移量为4K,则需要12位来表示,即虚拟地址的低12位表示页内偏移量,其余高20位保存着映射关系的信息(如段式转化,粗细页转化,细页转化等转化方式,以及虚拟地址的页信息,映射方式,访问控制位等信息)。这些信息可以查阅cortex-a8的手册。 5.7 读以下程序, 说明程序功能

.text

.global _start _start:

ldr r0, = 0xE2700000 mov r1, #0 str r1, [r0]

ldr sp, = 0xD0037D80 ;设置栈,以便调用 c 函数 ldr r0, = main

ldr r1, = 0xD0030000 ;0xd0030000 目标地址

ldr r2, = redirt_end cmp r0, r1 beq run_on_dram copy_loop:

ldr r3, [r0], #4 ;源 str r3, [r1], #4 ;目的 cmp r0, r2 bne copy_loop run_on_dram:

ldr pc, = 0xD0030008 ;跳转 halt: b halt

该段代码完成的功能是代码的复制以及重定位:将以标号main开始到redirt_end这段地址空间的代码复制到以0xD0030000(RAM 起始地址)为起始地址的存储区域。如果标号main的地址恰好等于0xD0030000就跳过复制,直接到RAM中去执行。

5.8 读以下电路图, 说明该内存单元应该如何和 S5PV210 微处理器进行硬件连接? 如何进行虚拟内存地址映射?(图略)

第6章

6.1 简述嵌入式系统通过查询方式和中断方式获取数据的特点。

程序查询方式:操作简单,但因为处理器一直查询I/O端口或部件的状态,所以处理器的效率非常低。

中断方式:CPU在中断信号到来时决定是否处理该中断,处理完成后返回中断前的程序,继续执行效率高,但实现相对于查询方式复杂。 6.2 请阐述ARM的异常向量表的结构。

在ARM体系中,有7种异常处理。当异常发生时,处理器会把PC设置为一个特定的存储器地址。这一地址被放在异常向量表中。异常向量表包含一系列不能修改的指令,用以跳转到各异常的响应程序。ARM的异常向量表由异常类型对应的跳转指令构成。 6.3 软中断指令中的中断号可以通过哪几种方式获取?

软中断指令中的中断号可以通过以下两种方式获取:①SWI指令后的24位立即数;②SWI指令后的24位立即数被忽略,中断号保存在R0寄存器中。 6.4 IRQ中断和FIQ中断发生时, 处理器进行哪些工作?

IRQ中断和FIQ中断发生时的处理步骤如下:

1)初始化微处理器中断有关的寄存器,开放中断;

2)I/O端口或部件完成数据操作后产生中断请求信号;

3)当中断请求信号有效时,微处理器可能处在不可中断状态,等微处理器允许中断时保存当前状态,停止它现行的操作并开始进行中断源的识别;

4)在识别出优先级最高的中断源后,微处理器转到对应的中断服务例程入口,并应答中断,I/O端口或部件收到应答信号后,撤销其中断请求;

5)微处理器读入或写出数据,当中断服务例程结束后,返回到原来的被中断程序处继续执行。

6.5 中断处理完毕后,处理器是如何回到原来的程序断点处的?

中断处理程序中首先应该保存现场(中断之前的现场,包括程序状态寄存器(CPSR),PC的指向等);在中断服务程序执行完毕之后,就要恢复现场,即重新加载PC,寄存器等。从而回到原来的程序断点处。

事实上,当异常发生时,分组寄存器R14和SPSR用于保存处理器状态,异常返回时,SPSR内容恢复到CPSR,连接寄存器R14恢复到程序计数器PC。 6.6 什么是向量中断控制器?其主要工作是什么?

向量中断控制器(Vectored Interrupt Controller),是中断控制器的组成部分。S5PV210的中断控制器有4个向量中断控制器(VIC)。向量中断控制器的主要工作是:支持93个向量IRQ 中断;配置中断优先级;硬件中断优先级屏蔽;产生 IRQ与FIQ;产生软件中断;访问模式等。

6.7 请解释中断优先级仲裁。

若嵌入式系统中有多个中断源,则这些中断源必须要进行中断优先级的排列。所谓优先级仲裁,指的是以下两层含义:

1)若有2个及2个以上的中断源同时提出中断请求,微处理器先响应哪个中断源,后响应哪个中断源。

2)若1个中断源提出中断请求,得到响应后,又有1个中断源提出中断请求,后来的中断源能否中断前一个中断源的中断服务程序。

6.8 在对图6-1所示硬件电路进行中断编程时,如果没有在start.s中定义异常向量表,那么中断能够正常被响应吗? 为什么?

不能。如果为未定义异常向量表,则CPU跳转到向量入口地址之后不知道接下该执行哪里的代码,无法正确跳转到中断服务程序中,因此不能正常响应。

第7章

7.1 简述通用定时器工作原理。

通用定时器内部工作原理:以一个N位的加1或减1计数器为核心,计数器的初始值由初始化编程设置,计数脉冲的来源有系统时钟或外部事件脉冲。若编程设置定时/ 计数器为定时工作方式时,则N 位计数器的计数脉冲来源于内部系统时钟,并经过M 分频。每个计数脉冲使计数器加1 或减1,当N 位计数器里的数加到0 或减到0 时, 则会产生一个“回0 信号”,该信号有效时表示N 位计数器里的当前值是0。因为系统时钟的频率是固定的, 其M 分频后所得到的计数脉冲频率也就是固定的,因此通过对该频率脉冲的计数就转换为定

时,实现了定时功能。若编程设置定时/ 计数器为计数方式时,则N 位计数器的计数脉冲来源于外部事件产生的脉冲信号。有一个外部事件脉冲,则计数器加1 或减1,直到N 位计数器中的值为0,产生“回0信号”。 7.2 什么是ARM的脉宽调制定时器?

S5PV210有5个32位双缓冲脉冲宽度调制定时器。配合定时器计数缓冲寄存器TCNTBn和定时器比较缓冲寄存器TCMPBn,可以很方便地实现脉宽调制功能,所以被称为脉宽调制定时器。

7.3 如何对S5PV210微处理器的定时器时钟进行分频? 定时时间如何计算?

定时器0和1共用一个可编程8位分频器,该分频器为PCLK提供第一层分频,定时器2,3,4共用一个不同的8位分频器。每个定时器都有自己的专用时钟分频器提供第二层分频(又称分割器,可提供1,2,4,8,16分频)。定时时间=计数器初值*定时器时钟频率。 7.4 试编写定时器控制蜂鸣器鸣叫频率和占空比的程序。

参考代码如下:(篇幅有限,在此只给出核心代码供参考)

void timer_init(unsigned long utimer,unsigned long uprescaler,unsigned long udivider,unsigned long utcntb,unsigned long utcmpb) {

unsigned long temp0;

// 定时器的输入时钟 = PCLK / ( {prescaler value + 1} ) / {divider value} = PCLK/(65+1)/16=62500hz //设置预分频系数为66 temp0 = TCFG0;

temp0 = (temp0 & (~(0xff00ff))) | ((uprescaler-1)<<0); TCFG0 = temp0; // 16分频 temp0 = TCFG1;

temp0 = (temp0 & (~(0xf<<4*utimer))& (~(1<<20))) |(udivider<<4*utimer); TCFG1 = temp0; // 1s = 62500hz TCNTB0 = utcntb; TCMPB0 = utcmpb; // 手动更新 TCON |= 1<<1; // 清手动更新位 TCON &= ~(1<<1); // 自动加载和启动timer0 TCON |= (1<<0)|(1<<3); // 使能timer0中断 temp0 = TINT_CSTAT;

temp0 = (temp0 & (~(1<//中断处理函数 void irs_timer()

{ unsigned long uTmp;

//清timer0的中断状态寄存器 uTmp = TINT_CSTAT; TINT_CSTAT = uTmp; }

int main(void) {

system_initexception();

intc_setvectaddr(NUM_TIMER0, irs_timer); intc_enable(NUM_TIMER0); timer_init(0, 65, 4, 62500, 31250); while(1); return 0; }

7.5 嵌入式系统为什么需要看门狗?

嵌入式系统对可靠性有严格要求。为保证系统能够长期可靠地运行,需要加入看门狗,在程序发生错误时自动重新启动系统,避免系统死锁。 7.6 简述看门狗定时器工作原理。

看门狗定时器是一个特殊的定时器,它既能引起中断,也能发送一个系统重启信号。看门狗定时器被使能之后,需要在一定周期内(小于看门狗定时器产生的时间间隔)执行重置看门狗的动作(喂狗)。如果在看门狗定时器产生的时间间隔内没有喂狗操作,定时器将会发送一个重启信号,系统将重新启动。 7.7 编写 0.1s看门狗复位的程序。

参考代码如下:(篇幅有限,在此只给出核心的设置看门狗的代码供参考)(设PCLK为32MHz)

void enable_watchdog() {

//允许输出重置信号,允许中断生成,128分频,预分频78 rWTCON = ((1<<0)|(1<<2)|(0b11<<3)|(0x4E<<8)); rWTDAT = 0x8000;

rWTCON = 1 << 5; //启动看门狗 }

void feed_dog() {

rWTCNT = 0x8000; }

7.8 为什么嵌入式系统使用RTC定时器获取时间, 而不用普通定时器?

普通定时器在系统关机状态下无法工作,而实时时钟单元即使在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),为系统提供可靠的时钟,包括时、分、秒和年、

月、日。

7.9 读以下程序, 试述各语句的作用和该段程序的功能。

year = (((year / 100) << 8) + (((year / 10)% 10) << 4) + (year% 10));//将year转换为BCD码 month = (((month/10)<<4) + (month% 10)); //将month转换为BCD码 date = (((date / 10) << 4) + (date% 10)); //将date转换为BCD码 weekday = (weekday% 10); //将weekday转换为BCD码 hour = (((hour / 10) << 4) + (hour% 10)); //将hour转换为BCD码 min = (((min / 10) << 4) + (min% 10)); //将min转换为BCD码 sec = (((sec / 10) << 4) + (sec% 10)); //将sec转换为BCD码 rtc_enable(true); //保存

BCDSEC = sec; //将秒钟保存到BCD秒钟寄存器 BCDMIN = min; //将分钟保存到BCD分钟寄存器 BCDHOUR = hour; //将小时保存到BCD小时寄存器 BCDDATE = date; //将日期保存到BCD日期寄存器 BCDDAY = weekday; //将星期保存到BCD星期寄存器 BCDMON = month; //将月份保存到BCD月寄存器 BCDYEAR = year; //将年份保存到BCD年寄存器 rtc_enable(false);

该段程序的功能是将年月日,时分秒转换为BCD码然后保存到RTC相应寄存器中。即设置RTC时钟初始值。

第8章

8.1 什么是模拟量?什么是数字量?请分别举例说明。

在时间和幅度上都是连续的物理量称为模拟量,例如如温度、压力、位移、图像等;在时间和幅度上离散的物理量称为数字量。

8.2 在A-D转换过程中,模拟量和输出的数字量应该满足怎样的关系?

输出的数字量与模拟量应满足线性关系;采样频率应高于模拟量最大频率的2.5倍。 8.3 什么是A-D转换的分辨率?其与转换位数之间是什么关系?

分辨率用来表明A-D转换器对模拟信号的分辨能力,由它确定能被A-D转换器辨别的最小模拟量变化。一般来说,A-D转换器的位数越多,其分辨率则越高。 8.4 满量程电压为33V且位数为12位的A-D转换器的量化误差是多少?

计算如下:

q33212

量化误差为0.008V。

8.5 A-D转换器的转换过程分为哪四个步骤?分别完成什么功能?

采样,保持,量化,编码四个步骤。采样与保持:将模拟量转换为在时间上离散的时间离散量。量化与编码:将采样得到的时间离散量的幅度转化为离散幅度并进行编码得到数字量。

8.6 A-D转换器有哪几种类型?其优缺点分别是什么?

类型 积分型 逐次比较型 并行/串并行比较型 Σ-Δ(Sigma - delta)调制型 电容阵列逐次比较型 压频变换型 优缺点 优点是电路简单,缺点转换速率低 优点是速度较高、功耗低,在低分辨率(<12位)时价格便宜,但高精度(>12位)时价格很高 优点是转换速率极高,缺点是电路规模大,价格高 电路的数字部分基本上容易单片化,容易做到高分辨率 逐次比较型的改进,用低廉的成本制成高精度单片A-D转换器 其优点是分辨率高、功耗低、价格低,但是需要外部计数电路 8.7 如何设置S5PV210微处理器的A-D转换时钟?若系统主频为100MHz,且预分频比为 65, 则 A-D转换的时钟频率为多少?

A-D转换频率 = 100MHz/(65+1) ≈ 1.52MHz

8.8 TSDATXn寄存器是多少位的寄存器?若所使用的A-D配置为12位,如何取出转换完成的12 位A-D输出数值?

TSDATXn寄存器是16位寄存器。将TSDATXn的值读出来然后位与操作取值,例如:

return(TSDATXn&0xfff);

将AD转换的12位数据以返回值形式返回。

8.9 第8.4节中的实例,若改为10位A-D转换,应如何修改程序?

修改read_adc函数: int read_adc(int ch) {

//使能预分频功能,设置 A - D 转换器的时钟 = PCLK/ (65 + 1) TSADCCON0 = (0 << 16)| (1 << 14)| (65 << 6); //修改1:设置为使用10位ADC //清除位[2],设为普通转换模式,禁止 read start TSADCCON0 & = ~ ((1 << 2) |(1 << 1)); //选择通道 ADCMUX = 0;

//设置位[0]为 1,启动 A - D 转换 TSADCCON0 = (1 << 0);

//当 A - D 转换真正开始时,位[0]会自动清零 while (TSADCCON0 &(1 << 0));

//检测位[15],当它为 1 时表示转换结束 while (!(TSADCCON0 &(1 << 15))); //读取数据

return (TSDATX0 & 0x3ff); //修改2:改为返回TSDATX0寄存器低10位

}

8.10 如果外部待测模拟信号电压数值超过A-D转换器满量程电压, 请问软件和硬件应如何修改?

提供以下参考方案:在硬件电路设计的时候外接分压电阻,将被测量的一部分电压接入AD测量(例如分压1/2),在软件中将读出的转换结果乘以分压倍数即可。

第9章

9.1 简述DMA的工作原理。

DMA传输将数据从一个地址空间复制到另外一个地址空间,传输操作本身是由DMA控制器来实行和完成的。DMA操作并不依赖于微处理器,微处理器可以去处理其他的工作。因此可以提高系统运行效率。

9.2 S5PV210支持几种DMA工作方式?有什么区别?

S5PV210支持2种DMA工作方式,分别为DMA_mem和DMA_peri。前者为存储器转移DMA,由一个PL330组成,用于内存到内存的数据传输;后者为外围设备转移DMA,由两个PL330组成,用于外围设备数据的转移。

9.3 如何对S5PV210微处理器进行peri_DMA编程?如何进行M2M_DMA编程?二者有何区别?

可以通过将PL330的指令编码写进某一地址,然后将地址写进DMD_peri或者DMA_mem的相关寄存器进行编程。区别在于DMD_peri只在非安全模式下运行,DMA_mem只在安全模式下运行。

9.4 请查阅PL330数据手册,简述PL330的指令集。 指令 DMAMOV DMALD DMAST DMARMB DMAWMB DMALP DMALPEND DMASEV DMAEND 指令简述 数据转移指令,可以移动一个32位数到原地址寄存器,目标地址寄存器与通道控制寄存器中 DMAC装载指令,从源数据地址取出数据到MFIFO中 与DMALD对应,讲MFIFO中的数据加载到目标地址 读内存屏障指令,可以使当前所有读处理全部被强制取消 写内存屏障指令,可以使写处理全部被强制取消 循环指令,该指令用来指定某个指令段的开始位置 循环终止指令, 事件发送指令,可以产生一个事件信号 DMA结束指令,用来通知DMAC结束一次操作集合 9.5 在9.6节所示的实例中,数组instr_seq的作用是什么?

用于保存PL330的指令,作为指令缓存区。 9.6 模仿9.6节,编程实现UART_DMA数据传输。

#define MAX 100 #define Inp(addr)

(*(volatile unsigned int *)(addr)) (*(volatile unsigned int *)(addr) = (data))

#define Outp(addr, data)

#define VIC0ADDR (*((volatile unsigned int *)0xF2000F00)) #define VIC0INTENCLEAR (*((volatile unsigned int *)0xF2000014)) #define VIC0INTENABLE (*((volatile unsigned int *)0xF2000010)) #define VIC0VECTADDR18 ( *((volatile unsigned long *)0xF2000148)) #define DMA_INTEN 0xFA200020 #define DMA_DBGSTATUS 0xFA200D00 #define DMA_DBGCMD 0xFA200D04 #define DMA_DBGINST0 0xFA200D08 #define DMA_DBGINST1 0xFA200D0C

#define UTBR (*(voiatile unsigned long))0xE2900020

char dma_src[48] = \"dma_src data1234567\"; char dma_dst[48] = \"dma_dst\"; volatile char instr_seq[MAX];

void dma_start() { }

//dma初始化

void dma_init(unsigned int source, unsigned int destination;) {

int size = 0, x; int loopstart, loopnum; unsigned int start;

/*1.先打印没有启动DMAC之前的dam_dst*/ printf(\"\\r\\nThis is first printf dam_dst:\\r\\n\"); printf(\"%s\\r\\n\

/*2.DMAMOV SAR0设置源地址寄存器*/ source = (unsigned int)dma_src; instr_seq[size + 0] = (char)(0xbc); instr_seq[size + 1] = (char)(0x0);

instr_seq[size + 2] = (char)((source>>0) & 0xff); instr_seq[size + 3] = (char)((source>>8) & 0xff);

//clear DMA_mem INTCLR清除DMA的中断标志(DMA除了隶属于VIC0以外有自己的一个中断机制控制) //Outp(0xFA200000+0x2C, 0x2);

//取消对DMA_mem的使能,即不在响应DMA_mem中断请求

//和之前为开启DMA的时候作对比,到这里已经在没有CPU干预的情况下, //利用DMA将dma_src的数据搬运到dma_dst里面了 printf(\"This is second print dam_dst\\r\\n\"); printf(\"%s\\r\\n\printf(\"\\r\\nDMA Ending!\\r\\n\");

instr_seq[size + 4] = (char)((source>>16) & 0xff); instr_seq[size + 5] = (char)((source>>24) & 0xff); size += 6;

/*3.DMAMOV DAR0设置目的地址寄存器*/ destination = (unsigned int)dma_dst; instr_seq[size + 0] = (char)(0xbc); instr_seq[size + 1] = (char)(0x2);

instr_seq[size + 2] = (char)((destination>>0) & 0xff); instr_seq[size + 3] = (char)((destination>>8) & 0xff); instr_seq[size + 4] = (char)((destination>>16) & 0xff); instr_seq[size + 5] = (char)((destination>>24) & 0xff); size += 6;

/*4.DMAMOV CC0. burst_size 8byte, burst_len 2设置通道0控制寄存器,源地址和目的地址在搬运完一次以后

都自动增加,每次搬运8*2=16个字节,都是挂载到AXI接口,因为是内存之间的访问*/

//0000 000 0,00 0001 01,1 1 000 000, 0001 011 1 instr_seq[size + 0] = (char)(0xbc);

instr_seq[size + 1] = (char)(0x1);//CCR寄存器

instr_seq[size + 2] = (char)(0x17);//源地址递增,每次读8个字节,每次2个数据传输

instr_seq[size + 3] = (char)(0xc0);//ARPROT[0:2]=0b000,ARCACHE[0:2]=0b000,目标地址递增,每次写8字节 instr_seq[size + 4] = (char)(0x5);//每次2个数据传输,AWPROT[0:2]=0b000 instr_seq[size + 5] = (char)(0x0); //AWCACHE[0:1,3] =0b000,不交换8位数据 size += 6;

/*5.DMALP LC0设置要搬运得次数,开始循环搬运数据。数组大小是48字节(dam_src[48]),所以要搬运48

除以16等于3次*/

loopnum = 3;

instr_seq[size + 0] = (char)(0x20); //lc=0

instr_seq[size + 1] = (char)(loopnum - 1);// 循环次数 size += 2;

loopstart = size;//需要循环执行的起始位置

/*6.DMALD装载源地址的数据到MFIFO数据缓冲区*/ instr_seq[size + 0] = (char)(0x04); size += 1;

/*7.DMAST将MFIFO的数据存入目的地址*/ instr_seq[size + 0] = (char)(0x08); size += 1;

/*8.DMALPEND 0循环搬运的代码块结束*/ instr_seq[size + 0] = (char)(0x38);

instr_seq[size + 1] = (char)(size - loopstart); //记录循环结束的位置 size += 2;

/*9.做一个简单的延时*/ /*9.1 DMALP LC0循环开始*/ instr_seq[size + 0] = (char)(0x20); instr_seq[size + 1] = (char)(250); size += 2;

loopstart = size;

/*9.2 DMANOP循环执行的内容,空操作*/ instr_seq[size + 0] = (char)(0x18); size += 1;

/*9.3 DMALPEND 0循环结束*/ instr_seq[size + 0] = (char)(0x38); instr_seq[size + 1] = (char)(size - loopstart); size += 2;

/*10.DMASEV 产生一个中断源,这里要和下面Outp(0xFA200020, 0x2);一致*/ instr_seq[size + 0] = (char)(0x34);

instr_seq[size + 1] = (char)(1<<3); //irq<1> size += 2;

/*11.DMAEND 结束DMAC的控制,这里是存放结束指令,并非真的结束,他只是存放一条结束指令到

instr_seq[MAX]这个数组*/

instr_seq[size + 0] = (char)(0x0); size += 1;

/*12.enable irq注意选对是DMA——mem的中断向量,隶属于VICO组的18号中断*/ VIC0VECTADDR18 = (unsigned int)dma_start; //MDMA在vic0的18位 VIC0INTENABLE |= 1<<18;//使能该中断源 //因为上面使用irq<1>所以得使能event_1

Outp(DMA_INTEN, 0x2);//enable DMA_mem 的1号中断 /*13.DMAGO开始真正的DMA控制---搬运数据*/ do{

x = Inp(DMA_DBGSTATUS);//check DMA_mem DBGSTATUS读取状态寄存器

} while ((x&0x1)==0x1);

Outp(DMA_DBGINST0, (0<<24)|(0xa0<<16)|(1<<8)|(0<<0));//DMA_mem DBGINST0选择通道0,执行DMA的

DMAGO命令

start = (unsigned int)instr_seq;

Outp(DMA_DBGINST1, start);//DMA_mem DBGINST1存放了DMAGO命令执行的起始地址start,透过DMAGO来

执行上面的脚本

} int main() {

unsigned long data[10]; dma_init(data,UTBR) dma_start(); return 0; }

Outp(DMA_DBGCMD, 0);//DMA_mem DBGCMD执行 DBGINST0和DBGINST1中的命令

第10章

10.1 用图示和文字的方式说明异步串行通信协议中所规定的数据格式。

异步串行通信协议的数据规定有:空闲位、起始位、资料位、奇偶校验位、停止位。如下图所示:

起始位:先发出一个逻辑0信号, 表示传输字符的开始。 资料位:紧接着起始位之后。 奇偶校验位:资料位加上这一位后,使得1 的位数应为偶数 (偶校验) 或奇数 (奇校验) 停止位:它是一个字符数据的结束标志。

空闲位:处于逻辑1状态,表示当前线路上没有资料传输。

10.2 什么叫波特率? S5PV210微处理器的UART部件的波特率如何计算? 写出波特率计算公式。

波特率是衡量资料传输速率的指针。表示每秒钟传输的二进制位数。波特率时钟是把源时钟(即PCLK系统时钟或UCLK外部时钟)和UART的波特率分频寄存器(UBRDIVn)产生的除数相除产生的。计算公式:

UBRDIVn = [PCLK / (波特率/16)] - 1 10.3 RS-232C接口信号的特性是如何规定的?

RS-232C标准采用EIA电平,规定在信号线上1的逻辑电平在-3~-15 V之间,0的逻辑电平在+ 3~+15V之间。

10.4 若需要利用S5PV210的UART0进行异步串行通信,系统PCLK = 66MHz, 且要求数据位为8位,偶校验,1位停止位,写出初始化程序。

#define ULCON0 ( *((volatile unsigned long *)0xE2900000) ) #define UCON0 ( *((volatile unsigned long *)0xE2900004) ) #define UFCON0 ( *((volatile unsigned long *)0xE2900008) ) #define UMCON0 ( *((volatile unsigned long *)0xE290000C) )

#define UART_UBRDIV_VAL 35

void uart_init() { // 使能fifo UFCON0 = 0x1; // 无流控 UMCON0 = 0x0; // 数据位:8, 无校验, 停止位: 1 ULCON0 = ((0b11<<0) | (0<<2) | (0b101<<3) | (0<<6)); // 时钟:PCLK,禁止中断,使能UART发送、接收

}

UCON0 = 0x5;

// 设置波特率

UBRDIV0 = UART_UBRDIV_VAL;

10.5 SPI接口的4根信号线是如何定义的?

MOSI: Master Out Slave In主出/从入。 MISO: Master In Slave Out主入/从出。 SCK: Serial Clock串行时钟。 SS: Slave Select从属选择。

10.6 S5PV210微处理器的SPI接口支持哪4种不同的数据传输格式? 分别是如何工作的? S5PV210支持4种不同的数据传输格式,由CPOL和CPHA决定。

CPOL(Clock Polarity)时钟极性控制位指定串行时钟是高电平有效还是低电平有效,此控制位对传输格式没有重大的影响。CPOL = 0时,表示SCLK空闲的时候为低电平;CPOL = 1 时,表示SCLK空闲的时候为高电平。

CPHA(Clock Phase)时钟相位控制位选择两个不同的基础传输格式中的一种,CPHA表示数据采样的时刻,如果数据采样时刻对应是SCLK的第一个跳变沿,则CPHA = 0;如果数据采样时刻对应是SCLK的第二个跳变沿,则CPHA = 1。 10.7 I2C总线有几根信号线和时钟线? 分别如何定义?

有1根信号线(SDA)和1根时钟线(SCL)。 10.8 I2C总线的上拉电阻和总线速率有何关系?

上拉电阻影响着总线的上升时间,如果上升电阻过大,会造成时间常数过大,从而增大了总线的上升时间,降低了总线速率。

10.9 S5PV210微处理器的I2C控制器支持哪4种操作模式? 如何编程实现这4种操作模式? 主机发送模式,主机接收模式,从机发送模式,从机接收模式。多主机I2C总线状态寄存器I2CSTATn的6:7两位用于设置操作模式。

10.10 请查阅I2C总线接口EEPROM芯片AT24C04的数据手册, 编程实现S5PV210微处理器对AT24C04的读数据与写数据的操作。

自行查阅手册编程。

第11章

11.1 简述LCD控制器的主要作用。

LCD控制器的主要作用,是将定位在系统存储器的显示缓冲区中的LCD图像数据传输到外部LCD驱动器,并产生必要的控制信号,例如行同步信号RGB_VSYNC、帧同步信号 RGB_HSYNC和像素时钟信号RGB_VCLK等。

11.2 S5PV210微处理器的LCD控制器如何传送16M色和K色的图像颜色值?

16M(24bpp)色的显示模式:用24位的数据来表示一个像素的颜色,每种颜色使用8位。 LCD控制器从内存中获得某个像素的24位颜色值后,直接通过VD[23:0]数据线发送给LCD;在内存中,使用4个字节(32位)来表示一个像素,其中的3个字节从高到低分别表示红、绿、蓝,剩余的1个字节无效。

K(16bpp)色的显示模式:用16位的数据来表示一个像素的颜色,格式又分为两种。5 /6/5使用5位来表示红色,6位表示绿色,5位表示蓝色;5/5/5/1使用5位来表示红、绿、蓝,最后一位表示透明度。

11.3 简述LCD控制器相关的主要寄存器及其作用。

寄存器 VIDCON0 VIDCON1 VIDCON2 VIDCON3 I80IFCONx ITUIFCON VIDTCONx WINCONx VIDOSDxA VIDOSDxC,D 作用&说明 配置视频输出格式, 显示使能 RGB接口控制信号 输出数据格式控制 图像增强控制 i80接口控制信号 ITU接口控制信号 配置视频输出时序及显示大小 每个窗口特性设置 窗口位置设置 OSD大小设置 11.4 S5PV210微处理器的键盘接口支持最大多少的矩阵键盘?其相关端口定义是怎样的? GPIO复用的端口提供14行8列键盘支持,使用键盘接口port0和port1实现。port0映射8×8按键接口,而port1映射14×8按键接口,也可以使用自定义的映射,进行port0和port1的混合。

11.5 简述键盘扫描过程。

在初始状态下,所有的列线(输出)是低电平,但是列数据输出三态使能位为高,因此,不使用三态使能模式时,这些位应写入零。如果状态是没有按任何键,所有的行线(输入)置高。任何键被按下时,相应的行线和列线被短路在一起,相应的行线被列线拉低,产生一个键盘中断。通过设置KEYIFCO、LEN、KEYIFCOL和KEYIFCOL寄存器,CPU通过软件在一个列线上输出低电平,在其他线上输出高电平,CPU通过读取KEYIFROW寄存器的值可以检测相应列线的键是否按下。因为行线被拉高,除了被按下的键的行,其余的对应KEYIFROW位将被读取数值为高。因此,当在扫描过程结束时,按下的键(单键或多键)都可以被检测。 11.6 如何实现组合按键(两个按键同时按下)的编程响应?

根据键盘扫描过程,两个按键同时按下时,相应的行线被拉高,产生键盘中断,同时可以在KEYIFROW寄存器中读取两个按键的键值,实现组合按键的响应。

第12章

12.1 请介绍Windows CE的体系结构及特点。

Windows CE的体系结构包括应用层(Applition layer),操作系统层(Operation System layer),OEM层(OEM layer)和硬件层。Windows CE是一种采用模块化设计的、压缩的、具有高效的、可升级的32位操作系统,具有多线性、多任务、全优先等特点。 12.2 基于Windows CE嵌入式应用程序的开发流程是怎样的?

硬件设计->运行Windows CE->定制操作系统->应用程序开发。 12.3 BSP和CSP的全称是什么? 各有什么作用?

BSP:Board Support Package 板级支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板。

CSP: Chip support package芯片级支持包,包含了芯片特有的软件,使操作系统更好的运行于芯片。

12.4 Platform Builder的主要功能是什么?

它是用于开发WindowsCE程序并产生自定义操作系统映像OS的工具。在WindowsCE所有早期版本中,PlatformBuilder工具都是于操作系统的工具,专门支持WindowsCE相关的开发。WindowsCE6.0版本中,PlatformBuilder是一个安装于VisualStudio2005(VS2005)的插件。这个插件可以构建BSP(板级支持包)、创建设备驱动程序、生成WindowsCE6.0操作系统映像,并导出SDK来支持应用程序开发。

12.5 Bootloader的主要作用是什么?它是如何完成这些作用的?

Bootloader的主要作用分为3类:

1)初始化硬件设备,包括内存、中断控制器和MMU等。

2)通过串口打印整个Bootloader运行过程中的输出信息,并提供与用户交互的接口,用户可选择启动过程和配置相关参数。

3)下载并执行操作系统镜像。

Bootloader位于目标设备的非易失性存储设备中,并且在系统加电或重启时自动执行。 12.6 什么是SDK? 为什么Windows CE不能像桌面Windows一样有一个统一的SDK? SDK: Software Development Kit软件开发工具包。SDK是为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。Windows CE为嵌入式操作系统,其硬件平台不统一,因此不能Windows CE不能像桌面Windows一样有一个统一的SDK。 12.7 简述Windows CE下中断处理的流程。

接受并提交中断 ->在中断处理程序结束之前禁止该中断 ->调用ISR来响应中断->接受ISR返回值并判断 ->唤醒中断服务线程并激活该线程–>处理相应中断–>中断结束后通知内核 ->内核调用OMEInterruptDone完成整个中断并使能所有中断。 12.8 在Visio Studio开发环境下创建自己的第一个Windows CE应用程序。

第13章

13.1 什么是嵌入式实时操作系统?Android操作系统属于嵌入式实时操作系统吗?

嵌入式实时操作系统(Embedded Real-timeOperation System,RTOS)并不是指它是一种速度很快的操作系统,而是指操作系统必须在限定的时间内,对过程调用产生正确的响应。Android操作系统属于嵌入式实时操作系统。

13.2 Android基本框架的4大部分是什么?它们有什么具体作用?

Android系统架构采用分层结构,从上至下分为4个层次,分别为应用程序层(Applications)、应用程序框架层(Application Framework)、系统运行库层(Libraries&Android Runtime)和Linux核心层(Linux Kernel)。

应用程序层:Android装备一个核心应用程序集合

应用程序框架层:通过提供开放的开发平台,Android使开发者能够编制丰富和新颖的应用程序。

系统运行库层:包括程序库、运行时库、

Linux核心层提供核心系统服务,提供核心系统服务。 13.3 Android操作系统有哪些版本?目前最新的版本是什么?

安卓版本有1.1、1.5、1.6、2.0、2.3.x、3.0、3.1、3.2、4.0、4.1、4.2、4.4、5.0、6.0、7.0。目前最新的版本为安卓7.0.

13.4 简述Android操作系统移植的方法和步骤。

移植boot-loader和linux2.6内核 ->修改内核配置文件,打开Android必须的驱动 ->采用ramdisk ->对nand flash进行重新分区 ->修改内核启动参数 ->修改android源代码system/core/rootdir目录下的init.rc文件 ->完成后编译内核。

13.5 Android操作系统下的应用程序开发环境有哪些?分别基于哪种语言编程?

JDK(JDK 包括 Java 运行环境、工具和基础的类库,基于java语言);EclipseIDE(是基于Java的可扩展开源开发平台); ADT;AndroidSDK。 13.6 简称SDK是什么意思?具体作用是什么?简称API是什么意思?具体作用是什么? SDK是软件开发工具包。SDK是为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。API(Application Programming Interface),应用程序编程接口。能够提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

13.7 Activity有哪些启动方法?什么是Activity的生命周期?

Activity有4启动方法,分别为standard、singleTop、singleTask、singleInstance。 Activity的生命周期也是它所在进程的生命周期,即该进程从创建到终止的周期。

13.8 请介绍Android中常用的几种布局。

FrameLayout:所有东西依次都放在左上角

LinearLayout:线性布局,每一个LinearLayout里面又可分为垂直布局和水平布局 AbsoluteLayout:绝对布局用X,Y坐标来指定元素的位置

RelativeLayout:相对布局可以理解为某一个元素为参照物,来定位的布局方式

TableLayout:表格布局,每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素。

13.9 什么是APK?如何生成APK文件?如何调试运行APK文件?

APK是AndroidPackage的缩写,即Android安装包(apk)。把android sdk编译的工程打包成一个安装程序文件,格式为apk。可以使用Eclipse来运行调试APK文件。

13.10 创建自己的第一个Android应用程序,添加文本框、按钮控件,编写代码实现自定 义功能,并在模拟器上运行、调试。

13.11 如何在Android手机上调试所编写的应用程序?将上题中编写好的应用程序在智能手机上进行调试。

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务