资源描述
第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
遵守GNU/ GPL,完全开源;移植性好;网络功能先进;支持多文献系统;API接口丰富。
Android
良好平台开放性、可以实现个性化应用设定和与Google 应用无缝结合。
Windows CE
与Windows 系列有较好兼容性;能在各种解决器体系构造上运营;采用模块化设计;没有开放源代码;耗费内存。
VxWorks
支持各种解决器;具备先进网络功能;具备良好可靠性、卓越实时性、高效可裁剪性。
Nucleus
抢占式多任务操作系统内核;便于移植并且支持各种解决器;核心代码精简。
uC / OS II
公开源代码;可移植性强;可固化、可裁剪;占先式、多任务;系统任务;中断管理;稳定性和可靠性都很强。
QNX
实时可拓展;内核精简;运营速度快。
Linux
开源自由操作系统;真正多顾客多任务操作系统;内核可剪裁;实时性好;网络功能强大;支持当前多数解决器;稳定性和可靠性都很强。
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;寻址空间:64 MB。
V2 版本
乘法和乘加指令;支持协解决器操作指令;迅速中断模式;SWP/ SWPB 最基本存储器与寄存器互换指令;寻址空间:64 MB。
V3 版本
寻址空间增至 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三级流水线构造;代码密度高并兼容16Thumb指令集;对操作系统支持广泛;指令系统与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。
ARM10E微解决器系列
支持DSP指令集;6级整数流水线;支持32位ARM指令集和16 位Thumb指令集;支持32位高速AMBA总线接口;支持VFP10浮点解决协解决器;全性能MMU,支持各种主流嵌入式操作系统;支持数据Cache和指令Cache,具备更高指令和数据解决能力;主频最高可达 400MIPS;内嵌并行读/写操作部件
SecurCore微解决器系列
带有灵活保护单元,以保证操作系统和应用数据安全;采用软内核技术,防止外部对其进行扫描探测;可集成顾客自己安全特性和其她协解决器。
StrongARM微解决器系列
集成度高;在软件上兼容ARMv4体系构造
Xscale解决器
全性能、高性价比、低功耗;支持16位Thumb指令和 DSP指令集。
Cortex系列解决器
分为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 V7Cortex-A8核;有如下特点:低功耗,高性能;主频可达1GHz,具备64/32位内部总线构造,32/32KB数据/指令一级缓存,512KB二级缓存,运算能力可以达到DMIPS;支持LPDDR1,LPDDR2,DDR2类型RAM;Nandflash,Norflash,OneNand等类型Flash;支持存储空间最大32G(ROM),最大支持32GTF卡;包括强大硬件编解码功能,内建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 编程实现64位加法、64位减法、64位求负数功能,成果放在R1、R0寄存器中。
@64位加法:
@R2,R3存储第一种64位数据
@R4,R5存储第二个64位数据
ADDS R0,R2,R4 :加低32位字
ADC R1,R3,R5 :加高32位字
@64位减法
@R2,R3存储第一种64位数据(被减数)
@R4,R5存储第二个64位数据(减数)
SUBS R0,R2,R4
SBC R1,R3,R5
@64位求负数
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组第一种端口作为输入端口则只需要将GPA0CON0-3位设立为0000即可。寄存器详细地址以及相应位可以查询芯片手册。
4.4 端口上拉寄存器功能是什么?何种状况下需要上拉?
端口上拉寄存器控制了每个端口上拉电阻容许/禁止;当引脚端口作为输入端口时,需要上拉,用于检测低电平信号。
4.5 如何在C程序中给32位寄存器中某几位置1而不影响其她位值?
用位或和移位操作实现,例如将32位整型数据a位、b位(a、b为整常量)置1,可参照如下代码:
x |= (1<<a | 1<<b);
4.6 如何在C程序中给32位寄存器中某几位置0而不影响其她位值?
用位与和移位操作实现,例如将32位整型数据a位、b位(a、b为整常量)置0,可参照如下代码:
x &= ~(1<<a | 1<<b);
4.7 如何在C程序中编程检测32位寄存器中某位与否为1?
可以通过位与操作判断,例如判断a位与否为1示例如下:
x &= (1<<a);
if(x)
{/*该位为1*/}
else
{/*该位为0*/}
4.8 如何在C程序中编程检测32位寄存器中某位与否为0?
可以通过位与操作判断,例如判断a位与否为0示例如下:
x &= (1<<a);
if(!x)
{/*该位为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会找到该虚拟地址空间所属页,然后依照预先设立好相应规则去寻找相应物理地址所属页,在物理页基本上加上偏移量从而完毕虚拟地址向物理地址映射。普通状况下虚拟地址空间不不大于物理地址空间,因此有也许多块虚拟地址映射到同一物理地址,也有也许没有映射到物理地址,当用到该虚拟地址时才得到映射。
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<<utimer)))|(1<<(utimer));
TINT_CSTAT = temp0;
}
//中断解决函数
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% 1
展开阅读全文