嵌入式系统的概念?
传统定义(狭义嵌入式):以应用为中心,以计算机技术为基础,软件、硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗等要求的专用计算机系统。
当前客观定义(泛嵌入式):除PC之外的一切计算机系统都可以叫嵌入式系统。典型代表如:智能手机、工业机器人、车载电子、航空航天、安防监控等。
嵌入式系统的三要素?
嵌入+专用+计算机
典型的EOS有哪些?
嵌入式Linux,VxWorks,QNX,Windows Embedded,UC/OS-II,Delta OS ,Android,IOS
嵌入式应用软件有哪些?
车辆机器人,移动电话,掌上电脑,视听设备,医疗设备,交通管理,应用设备
实时系统概念?
实时系统(Real Time System)是指产生系统输入的时间对系统至关重要的系统。从输入到输出的滞后时间必须足够小到一个可接受的时限内。因此,实时逻辑的正确性不仅依赖于计算结果的正确性,还取决于输出结果的时间。
实时系统是一个能够在指定或者确定的时间内完成系统功能以及对外部或内部事件在同步或异步时间内做出响应的系统。
实时系统的衡量指标?
响应时间(Response Time):指计算机从识别一个外部事件到做出响应的时间。
生存时间(Survival Time):指数据的有效等待时间,在这段时间里数据是有效的。
吞吐量(Throughput):指在一段给定时间内,系统可以处理事件的总数。
实时系统的分类?
冯诺依曼结构与哈佛体系的区别?
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。冯·诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。
哈佛结构与冯·诺依曼结构的最大区别在于冯·诺依曼结构的计算机采用代码与数据的统一编址,而哈佛结构是独立编址的,代码空间与数据空间完全分开。
与冯.诺伊曼结构处理器比较,哈佛结构处理器有两个明显的特点:
使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联。
交叉编译与交叉调试(远程调试)?
交叉编译:在一个平台上生成另一个平台上的可执行代码。
交叉调试:就是宿主机(一般是电脑)与目标机(嵌入式系统)之间跨平台进行调试(一个是x86架构处理器,一个是ARM或其他嵌入式微处理器),这种跨平台的调试就叫交叉调试。
写出下列英文缩写的英文原文以及中文含义。
MPU: Microprocessor Unit
微处理器
MCU: Microcontroller Unit
微控制单元
H/W: HardWare
硬件
S/W:software
软件
AI: artificial intelligence
人工智能
RAM: random-access memory
随机访问内存或者随机存取存储器
ROM: read only memory
只读存储器
EPROM: Electrically Programmable Read-Only-Memory
电可编程序只读存储器,可擦可编程只读存储器
EEPROM: Electrically Erasable Programmable Read - Only Memory
电可擦只读存储器
RTOS: Real Time Operating System
实时操作系统
SOC: System on a Chip
片上系统
SOPC: system-on-a-programmable-chip
可编程片上系统
IP:
知识产权
API: Application Program Interface
应用程序界面
OS: Operating System
操作系统
HAL: Hardware Abstraction Layer
硬件抽象层
BSP: Blog Services Provider
blog服务提供商
MIPS:
一款CPU
IrDA:Infrared Data Association
红外数据通讯
SPI: Single Program Initiation
单个程序启动
UART: Universal Asynchronous Receiver/Transmitter
通用非同步收发传输器
PCMCIA: Personal Computer Memory Card International Association
个人计算机存储卡国际协会
MMU: Memory Management Unit
存储器管理单元
IDE: integrated development environment
集成开发环境
OCD: Off-Chip Driver
离线驱动调整
ICD: Interface Control Document
界面控制文件
BDM: Binary Digital Multiplier
二进制数字乘法器
IIS:
集成音频接口
嵌入式系统的组成结构包括哪些部分?
嵌入式计算机系统和执行装置
什么是实时系统?实时系统的性能指标有哪些?
实时系统:实时系统的正确性不仅依赖系统计算的逻辑结果,还依赖于产生这个结果的时间。实时系统能够在指定或者确定的时间内完成系统功能和外部或内部、同步或异步时间做出响应的系统。因此实时系统应该在事先先定义的时间范围内识别和处理离散事件的能力;系统能够处理和储存控制系统所需要的大量数据。
性能指标:响应时间、生存时间、吞吐量
哈佛结构的计算机有什么优缺点?
优点:
数据Cache和指令Cache区分开来,消除了数据引用与指令之间的冲突,使得取指令与取数据可以同时进行:而且允许独立地选择和优化各个Cache的大小、行大小和相联度
缺点:
(1)如果程序通过写指令而修改本程序的自身代码,则这些新指令将被写入到数据Cache,在程序能够执行这些指令前,两个Cache都必须被刷新,并且修改了的指令必须被写入存储器以便Cache能从中取得指令
(2)不允许大幅度地调节指令Cache和数据Cache的容量分配比例
写出交叉编译和平台的定义
交叉编译:就是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
平台:平台包含两个概念体系结构(Architecture)、操作系统(Operating System)
需要软硬件交叉开发环境和工具?
嵌入式系统调试方式?
都有哪些调试技术?
映像文件概念?
映像文件(image)是一个计算机上的可执行文件,在执行之前被加载到计算机的存储器中。
通常,一个映像文件中包含多个线程。
一个映像文件的内部包含若干个执行域,而每一个执行域包含自己的代码段和数据段。段的内部存储排列方式符合国际或行业的技术标准以及操作系统的内存管理要求,能够按照操作系统指定的浮动地址装入目标机存储器,之后由操作系统调度执行。
ADS下文件目标文件和映像,.bin文件与.axf文件的区别?
ARM处理器的映像文件是.axf文件或者.bin文件。
.axf文件
包含有调试信息和注释信息
.bin文件
不包含有调试信息和注释信息
编译器输出的ARM映像文件以.axf文件为主。
通过fromelf工具,可以把AXF文件转换成.bin文件。
实际下载到系统板的映像文件多数是.bin格式文件。
映像文件的组成?
ARM映像文件内部组织具有层次结构的性质,含三种成分:
注意:以下讲解ARM映像文件内部成分时,不光考虑了链接视图,还考虑了加载视图和执行视图的描述,所以对英文术语“section”统称为中文术语“段”。
域、输出端和输入段之间的关系?
各成分的关系如下:各输入段包含了目标文件中的代码和数据。连接器读入并处理若干个由程序员指定的输入段,而后输出一个映像文件。一个映像文件由一个或多个域组成,每个域包含1~3个输出段,每个输出段包含一个或多个输入段。
1.在搭建嵌入式系统交叉开发环境时,宿主机与目标板(或目标机)有哪几种连接方式?
串口通信、以太网、JTAG
2.什么是BootLoader?它有什么作用
在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。
作用:
可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序
3.什么是嵌入式交叉调试?交叉调试的方式有哪几种?
就是宿主机(一般是电脑)与目标机(嵌入式系统)之间跨平台进行调试(一个是x86架构处理器,一个是ARM或其他嵌入式微处理器),这种跨平台的调试就叫交叉调试。
方法:基于JTAG的片上调试方法,基于调试代理的远程调试方法
4.ARM仿真器的作用是什么?
ARM仿真器是用于调试基于ARM内核的硬件模块
5.何谓半主机方式?
半主机是这么一种机制,它使得在ARM目标上跑的代码,如果主机电脑运行了调试器,那么该代码可以使用该主机电脑的输入输出设备
6.什么是映像文件?什么是映像文件的加载视图和执行视图。
是一个计算机上的可执行文件,在执行之前被加载到计算机的存储器中。 通常,一个映像文件中包含多个线程。 一个映像文件的内部包含若干个执行域,而每一个执行域包含自己的代码段和数据段。段的内部存储排列方式符合国际或行业的技术标准以及操作系统的内存管理要求,能够按照操作系统指定的浮动地址装入目标机存储器,之后由操作系统调度执行。
加载视图:根据映像文件装载到存储器时的地址描述每一个域和段,该视图是映像文件开始执行前它的域和段的位置视图。
执行视图:该视图根据映像文件在执行时每一个域和段的地址描述映像的各个组成部分。
流水线问题?
ARM7流水线架构图:
ARM9流水线架构图:
ARM的7种工作模式
ARM的2种工作状态
(1)ARM状态
机器指令为32位的ARM指令集,字对齐取指执行ARM指令。
(2)Thumb状态
机器指令为16位的Thumb指令集,半字对齐取指执行Thumb指令。
寄存器R0~R3(a0~a3):传递参数。被调用的子程序在返回前无需恢复寄存器R0~R3的内容。
寄存器R4~R11(v1~v8):保存局部变量。如果在子程序中使用了寄存器v1~v8中的某些寄存器,则子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。
寄存器R12(IP):中间临时寄存器。在子程序之间的连接代码段中常常有这种使用规则。
寄存器R13(SP):堆栈指针。在子程序中寄存器R13不能用作其他用途。寄存器SP在进人子程序时的值和退出子程序时的值必须相等。
寄存器R14(LR):连接寄存器。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。
寄存器R15(PC):程序计数器。它不能用作其它用途。
存储体系(大端序)
字数据的高位字节存储在低地址中
字数据的低字节则存放在高地址中
寻址方式 — 基址寻址
基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下:
LDR R2,[R3,#0x0C]
读取R3+0x0C地址上的存储单元的内容,放入R2。
STR R1,[R0,#-4]!
;[R0-4]←[R1],R0=R0-4,符号“!”表明指令在完成数据传送后应该更新基址寄存器,否则不更新;属前索引。
Load/Store指令
Load/Store指令用于在存储器和处理器之间传输数据。Load用于把内存中的数据装载到寄存器,Store指令用于把寄存器中的数据存入内存。
共有3种类型的Load/Store指令:
数据处理指令
ARM数据处理指令大致分为以下6种类型。
伪指令
ARM伪指令不是ARM指令集中的指令,只是为了编程方便编译器定义了伪指令。可以像其它ARM指令一样使用伪指令,但在编译时这些指令将被等效的ARM指令代替。
ARM伪指令有4条,分别为ADR伪指令、ADRL伪指令、LDR伪指令和NOP伪指令。
异常有哪几类?
ARM异常按照起因的不同分为3类:
1.指令执行引起的直接异常
2.指令执行引起的间接异常
3.外部产生的与指令流无关的异常
中断向量表
中断向量表中存放了各个异常中断以及处理程序的对应关系。
在ARM体系结构中,异常中断向量表的大小只有32个字节。其中,每个异常中断向量占4个字节。系统初始化时,中断向量表从0号存储单元开始存放。
异常处理过程
1.将CPSR的内容保存到将要执行的异常中断模式的SPSR中,主要包括当前模式、中断掩码和条件标记。
例如:如果异常类型是FIQ,则SPSR_FIQ=CPSR
2.设置当前程序状态寄存器CPSR中的模式字段位。
3.将异常发生时程序的下一条指令地址保存到新的异常模式的R14寄存器。
4.强制对程序计数器赋值。使程序从异常所对应的向量地址开始执行中断服务子程序。
1.ARM处理器工作模式有几种?各种工作模式下分别有什么特点?
7种
用户模式,特点:不能访问某些受操作系统保护的资源,也不能改变工作模式。
6种特权模式:(特点:能访问全部资源,能 改变工作模式)
2.ARM处理器总共有多少个寄存器,这些寄存器按其在用户编程中的功能是如何划分的?这些寄存器在使用中各有何特殊之处?
37个
寄存器R0~R3(a0~a3):传递参数。被调用的子程序在返回前无需恢复寄存器R0~R3的内容。
寄存器R4~R11(v1~v8):保存局部变量。如果在子程序中使用了寄存器v1~v8中的某些寄存器,则子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。
寄存器R12(IP):中间临时寄存器。在子程序之间的连接代码段中常常有这种使用规则。
寄存器R13(SP):堆栈指针。在子程序中寄存器R13不能用作其他用途。寄存器SP在进人子程序时的值和退出子程序时的值必须相等。
寄存器R14(LR):连接寄存器。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。
寄存器R15(PC):程序计数器。它不能用作其它用途。
3.假设R0的内容为0x8000,寄存器R1、R2内容分别为0x01与0x10,存储器内容为空,执行下述指令后,说明PC如何变化?存储器及寄存器的内容如何变化?
STMIB R0! , {R1 , R2}
LDMIA R0! , {R1 , R2}
4.什么是ARM处理器的影子寄存器?
即专用寄存器
5.请阐述ARM异常中断向量表的结构
中断向量表中存放了各个异常中断以及处理程序的对应关系,有中断向量地址、异常中断类型、异常中断模式、优先级(6级最低)
6.异常处理结束后,CPU是如何返回到主程序断点的?
7.ARM异常中断的返回有哪几种情况?对应的中断服务子程序分别要做哪些处理?
8.就ARM处理器而言,相对寻址时的基准地址是什么?
相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。
9.数据块传送指令与堆栈指令有何不同?
最基本的数据传送 一、通用数据传送指令 1.MOV指令 格式:MOV 目的操作数,源操作数 功能:将源操作数传送到目的操作数空间,源操作数不变。 使用要求: 源操作数和目的操作数不能同为存储器操作数,所有双操作数指令都应遵循这一语法要求。
10.如何区别前索引偏移和后索引偏移?
前索引偏移:
LDR
Rd, [Rn, #0x04]! ;将Rn+0x04之后的内存地址中的数据加载到Rd中;
然后更新Rn的值Rn= Rn + 0x04
上面的例子中如果没有!那么最后Rn的值将得不到更新
后索引偏移
LDR Rd, [Rn], #0x04;将Rn中的地址指向的内存中的数据加载到Rd中;
然后将Rn更新Rn = Rn + 0x04
前索引偏移就是在索引前偏移,看有无!决定时候更新寄存器的内容。后索引偏移就是在索引后偏移,索引时并不偏移,索引后更新寄存器内容。
11.如何辨别LDR指令是ARM机器指令,还是伪指令。请你各举出3条数据传送LDR指令的例子和3条LDR伪指令的例子
两者相比较,伪指令LDR的参数前面有“=”符号
ARM机器指令
LDR R2,[R3,#0x0C]
LDR R1,[R0,R3,LSL#1]
LDR R0,[LR,#-4]
LDR伪指令
LDR R0,=0x12345678
LDR r0,=DATA_BUF+60
LDR R1,[R0]
12.LDR和STR指令有前变址、后变址和回写前变址三种变址模式,请你举例说明之。
前变址
LDR R0, [R1,#4]
回写前变址
LDR R0,[R1,#4]!
后变址
LDR R0,[R1],#4
堆栈名与子程序名
ATPCS规定堆栈为FD类型,即满递减堆栈,并且对堆栈的操作是8字节对齐。
对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足下列条件:
(1)外部接口的堆栈必须是8字节对齐的。
(2)在汇编程序中使用PRESERVE8伪指令告诉连接器,本汇编程序数据是8字节对齐的。
子程序中结果返回的规则如下:
1.子程序或者过程调用时,如果参数超过4个,如何编程实现正确地参数传递。
当参数个数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用堆栈来传递参数。在传递参数时,将所有参数看作是存放在连续的内存字单元的字数据。然后,依次将各字数据传递到寄存器R0,R1,R2和R3中。如果参数多于4个,则将剩余的字数据传递到堆栈中。入栈的顺序与参数传递顺序相反,即最后一个字数据先入栈。对于参数个数可变的子程序,当参数个数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用堆栈来传递参数。在传递参数时,将所有参数看作是存放在连续的内存字单元的字数据。然后,依次将各字数据传递到寄存器R0,R1,R2和R3中。如果参数多于4个,则将剩余的字数据传递到堆栈中。入栈的顺序与参数传递顺序相反,即最后一个字数据先入栈。