嵌入式操作系统复习总结

第一讲:嵌入式系统基础

1.1 绪论

嵌入式系统的概念?
传统定义(狭义嵌入式):以应用为中心,以计算机技术为基础,软件、硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗等要求的专用计算机系统。
当前客观定义(泛嵌入式):除PC之外的一切计算机系统都可以叫嵌入式系统。典型代表如:智能手机、工业机器人、车载电子、航空航天、安防监控等。

嵌入式系统的三要素?
嵌入+专用+计算机

典型的EOS有哪些?
嵌入式Linux,VxWorks,QNX,Windows Embedded,UC/OS-II,Delta OS ,Android,IOS

嵌入式应用软件有哪些?
车辆机器人,移动电话,掌上电脑,视听设备,医疗设备,交通管理,应用设备

1.2 实时系统

实时系统概念?
实时系统(Real Time System)是指产生系统输入的时间对系统至关重要的系统。从输入到输出的滞后时间必须足够小到一个可接受的时限内。因此,实时逻辑的正确性不仅依赖于计算结果的正确性,还取决于输出结果的时间。
实时系统是一个能够在指定或者确定的时间内完成系统功能以及对外部或内部事件在同步或异步时间内做出响应的系统。

实时系统的衡量指标?
响应时间(Response Time):指计算机从识别一个外部事件到做出响应的时间。
生存时间(Survival Time):指数据的有效等待时间,在这段时间里数据是有效的。
吞吐量(Throughput):指在一段给定时间内,系统可以处理事件的总数。

实时系统的分类?

  • 根据响应时间分类
    • 强实时系统:强实时系统中,各任务不仅要保证执行过程和结果的正确,同时还要保证在系统能够允许的时间内完成任务。它的响应时间在毫秒或微秒数量级上。这对于关系到安全、军事领域的软硬件系统来说至关重要。
    • 弱实时系统:弱实时系统中,各个任务运行得越快越好,但并没有严格限定某一任务必须在多长时间内完成。弱实时系统更多地关注软件运行出结果与否,而对任务执行时间的要求相对宽松。一般它的响应时间可以是数十秒或更长,可能随着系统的负载轻重而有所变化。
    • 一般实时系统:一般实时系统是弱实时系统和强实时系统的一种折衷。它的响应时间可以在秒的数量级上,可广泛应用于许多消费电子设备中。如PDA、手机等都属于一般实时系统。
  • 根据确定性分类
    • 硬实时:硬实时指系统对系统响应时间有严格的要求。如果系统响应时间不能满足,就会引起系统崩溃或出现致命的错误。
      必须遇上一个硬时限。
      如果任何硬时限在任何时候被错过了,那么这个系统是不合适的。
      需要一种方法来确认遇上时限。
      硬实时系统:一个实时系统,其时限都是硬时限。
      举例:
      核电站的控制
      飞行的控制
    • 软实时:软实时指系统对系统响应时间有要求。但是如果系统响应时间不能满足,它并不会导致系统出现致命的错误或崩溃。
      一个软时限可能偶然地错过。
      软实时系统:一个实时系统,其一些时限是软时限。
      举例:
      电话交换
      多媒体应用

1.3 重要概念

冯诺依曼结构与哈佛体系的区别?
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。冯·诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。
哈佛结构与冯·诺依曼结构的最大区别在于冯·诺依曼结构的计算机采用代码与数据的统一编址,而哈佛结构是独立编址的,代码空间与数据空间完全分开。
与冯.诺伊曼结构处理器比较,哈佛结构处理器有两个明显的特点:
使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联。

交叉编译与交叉调试(远程调试)?
交叉编译:在一个平台上生成另一个平台上的可执行代码。
交叉调试:就是宿主机(一般是电脑)与目标机(嵌入式系统)之间跨平台进行调试(一个是x86架构处理器,一个是ARM或其他嵌入式微处理器),这种跨平台的调试就叫交叉调试。

练习题

  1. 写出下列英文缩写的英文原文以及中文含义。
    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:
    集成音频接口

  2. 嵌入式系统的组成结构包括哪些部分?
    嵌入式计算机系统和执行装置

  3. 什么是实时系统?实时系统的性能指标有哪些?
    实时系统:实时系统的正确性不仅依赖系统计算的逻辑结果,还依赖于产生这个结果的时间。实时系统能够在指定或者确定的时间内完成系统功能和外部或内部、同步或异步时间做出响应的系统。因此实时系统应该在事先先定义的时间范围内识别和处理离散事件的能力;系统能够处理和储存控制系统所需要的大量数据。
    性能指标:响应时间、生存时间、吞吐量

  4. 哈佛结构的计算机有什么优缺点?
    优点:
    数据Cache和指令Cache区分开来,消除了数据引用与指令之间的冲突,使得取指令与取数据可以同时进行:而且允许独立地选择和优化各个Cache的大小、行大小和相联度
    缺点:
    (1)如果程序通过写指令而修改本程序的自身代码,则这些新指令将被写入到数据Cache,在程序能够执行这些指令前,两个Cache都必须被刷新,并且修改了的指令必须被写入存储器以便Cache能从中取得指令
    (2)不允许大幅度地调节指令Cache和数据Cache的容量分配比例

  5. 写出交叉编译和平台的定义
    交叉编译:就是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
    平台:平台包含两个概念体系结构(Architecture)、操作系统(Operating System)

第二讲:嵌入式系统开发的过程

2.1 嵌入式系统开发的特点

需要软硬件交叉开发环境和工具?

  • 上位机:宿主机(HOST)
    编辑、编译、链接和调试程序
    通用计算机,一般是PC,也称为宿主机。
    特点:软硬件资源比较丰富
    OS:如Windows和Linux
    各种开发工具:Tornado、GNU开发套件
    编辑、编译、链接和调试应用程序代码
  • 下位机:目标机、目标班(TARGET)
    运行程序
    也称为目标机
    体积较小,集成度高
    软硬件配置恰到好处
    硬件资源有限
    软件可裁剪、配置
    应用软件和操作系统绑定在一起运行
    运行嵌入式应用软件
  • 主机和目标机之间调试管道
    主机往往和目标机的体系结构不同。因此,需要有通信转换器对调试信息进行转换
  • 交叉软件开发工具包
    • 工程管理器
    • 源程序编辑器
    • 交叉编译器
    • 交叉链接器
    • 交叉调试器

2.2 嵌入式系统调试技术

嵌入式系统调试方式?

  • 本地调试
    调试器和被调试程序都运行在下位机。
    通用计算平台调试、嵌入式平台调试
  • 远程调试(交叉调试)
    调试器程序运行在上位机
    被调试程序运行在下位机
    上位机和下位机通过通信信道连接起来
    嵌入式平台调试。

都有哪些调试技术?

  • 指令集模拟器(ISS)
  • ROM仿真器
  • 实时在线仿真器
  • 偏上 调试与背景调试
  • 基于Angel的调试
  • 基于JTAG的调试
  • 版主及调试
  • 常用ARM调试工具

2.3 ARM开发工具

映像文件概念?
映像文件(image)是一个计算机上的可执行文件,在执行之前被加载到计算机的存储器中。
通常,一个映像文件中包含多个线程。
一个映像文件的内部包含若干个执行域,而每一个执行域包含自己的代码段和数据段。段的内部存储排列方式符合国际或行业的技术标准以及操作系统的内存管理要求,能够按照操作系统指定的浮动地址装入目标机存储器,之后由操作系统调度执行。

ADS下文件目标文件和映像,.bin文件与.axf文件的区别?
ARM处理器的映像文件是.axf文件或者.bin文件。
.axf文件
包含有调试信息和注释信息
.bin文件
不包含有调试信息和注释信息
编译器输出的ARM映像文件以.axf文件为主。
通过fromelf工具,可以把AXF文件转换成.bin文件。
实际下载到系统板的映像文件多数是.bin格式文件。

映像文件的组成?
ARM映像文件内部组织具有层次结构的性质,含三种成分:

  • 域(region)
  • 输出段(output section)
  • 输入段(input section)。

注意:以下讲解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.什么是映像文件?什么是映像文件的加载视图和执行视图。
是一个计算机上的可执行文件,在执行之前被加载到计算机的存储器中。 通常,一个映像文件中包含多个线程。 一个映像文件的内部包含若干个执行域,而每一个执行域包含自己的代码段和数据段。段的内部存储排列方式符合国际或行业的技术标准以及操作系统的内存管理要求,能够按照操作系统指定的浮动地址装入目标机存储器,之后由操作系统调度执行。
加载视图:根据映像文件装载到存储器时的地址描述每一个域和段,该视图是映像文件开始执行前它的域和段的位置视图。
执行视图:该视图根据映像文件在执行时每一个域和段的地址描述映像的各个组成部分。

第三讲:ARM体系结构分析

3.1 ARM处理器的特征及流水线

流水线问题?
ARM7流水线架构图:

嵌入式操作系统复习总结_第1张图片

ARM9流水线架构图:

嵌入式操作系统复习总结_第2张图片

3.2 ARM的工作模式和工作状态

ARM的7种工作模式

嵌入式操作系统复习总结_第3张图片

ARM的2种工作状态
(1)ARM状态
机器指令为32位的ARM指令集,字对齐取指执行ARM指令。
(2)Thumb状态
机器指令为16位的Thumb指令集,半字对齐取指执行Thumb指令。

3.3 ARM的寄存器组织

ARM的寄存器分布情况
嵌入式操作系统复习总结_第4张图片

寄存器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.4 存储体系与数据类型

存储体系(大端序)
字数据的高位字节存储在低地址中
字数据的低字节则存放在高地址中

3.5 ARM的指令集及寻址方式

指令码表
嵌入式操作系统复习总结_第5张图片
嵌入式操作系统复习总结_第6张图片

寻址方式 — 基址寻址
基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下:
LDR R2,[R3,#0x0C]
读取R3+0x0C地址上的存储单元的内容,放入R2。
STR R1,[R0,#-4]!
;[R0-4]←[R1],R0=R0-4,符号“!”表明指令在完成数据传送后应该更新基址寄存器,否则不更新;属前索引。

3.6 ARM的指令解析

Load/Store指令
Load/Store指令用于在存储器和处理器之间传输数据。Load用于把内存中的数据装载到寄存器,Store指令用于把寄存器中的数据存入内存。
共有3种类型的Load/Store指令:

  • 单寄存器传输指令
  • 多寄存器传输指令
  • 交换指令

数据处理指令
ARM数据处理指令大致分为以下6种类型。

  • 数据传送指令(MOV、MVN)
  • 算术运算指令(ADD、ADC、SUB、RSB、SBC、RSC)
  • 逻辑运算指令(AND、ORR、EOR)
  • 比较指令(CMP、CMN)
  • 测试指令(TST、TEQ)
  • 乘法指令(MUL、MLA、UMULL、UMLAL、SMULL、SMLAL)

伪指令
ARM伪指令不是ARM指令集中的指令,只是为了编程方便编译器定义了伪指令。可以像其它ARM指令一样使用伪指令,但在编译时这些指令将被等效的ARM指令代替。
ARM伪指令有4条,分别为ADR伪指令、ADRL伪指令、LDR伪指令和NOP伪指令。

3.7 ARM的异常处理

异常有哪几类?

ARM异常按照起因的不同分为3类:
1.指令执行引起的直接异常

  • 软件中断(SWI)
  • 未定义指令(UND)
  • 预取指令中止(ABT)

2.指令执行引起的间接异常

  • 数据中止(在读取和存储数据时的存储器故障)(ABT)

3.外部产生的与指令流无关的异常

  • 复位
  • IRQ
  • FIQ

中断向量表
中断向量表中存放了各个异常中断以及处理程序的对应关系。
在ARM体系结构中,异常中断向量表的大小只有32个字节。其中,每个异常中断向量占4个字节。系统初始化时,中断向量表从0号存储单元开始存放。
嵌入式操作系统复习总结_第7张图片

异常处理过程

1.将CPSR的内容保存到将要执行的异常中断模式的SPSR中,主要包括当前模式、中断掩码和条件标记。
例如:如果异常类型是FIQ,则SPSR_FIQ=CPSR
2.设置当前程序状态寄存器CPSR中的模式字段位。
3.将异常发生时程序的下一条指令地址保存到新的异常模式的R14寄存器。
4.强制对程序计数器赋值。使程序从异常所对应的向量地址开始执行中断服务子程序。

练习题

1.ARM处理器工作模式有几种?各种工作模式下分别有什么特点?
7种
用户模式,特点:不能访问某些受操作系统保护的资源,也不能改变工作模式。
6种特权模式:(特点:能访问全部资源,能 改变工作模式)

  • 系统模式
  • 5种异常模式
    • 管理(SVC):操作系统内核代码运行的模式
    • 普通中断(IRQ)、快速中断(FIQ):微处理器收到中断信号后强制处理器进入的模式,用于中断处理。
    • 中止(ABT)、未定义(UND):是真正意义上的“异常”,一旦出现就要进入对应的异常中断服务子程序进行处理。

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是如何返回到主程序断点的?

  • 将所有修改过的用户寄存器从处理程序的保护栈中恢复。
  • 将SPSR复制回CPSR中,将连接寄存器LR的值减去相应的偏移量后送到PC中。
  • 若在进入异常处理时设置了中断禁止位,要在此清除。复位异常处理程序不需要返回。

7.ARM异常中断的返回有哪几种情况?对应的中断服务子程序分别要做哪些处理?
嵌入式操作系统复习总结_第8张图片

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

第四讲:ARM的嵌入式程序设计

4.1 ARM会变程序指示符

  • ARM汇编语言源程序中语句由指令、指示符和宏指令组成。
  • 在ARM中将directive称做指示符
    • ARM的指示符指令相当于x86的伪指令
  • 在ARM中pseudo-instruction被称为伪指令
    • ARM指令集中只有4条伪指令
  • 而宏指令则是通过指示符定义的。
    • 使用MACRO和 MEND指示符

4.2 ARM过程调用标准

堆栈名与子程序名
ATPCS规定堆栈为FD类型,即满递减堆栈,并且对堆栈的操作是8字节对齐。
对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足下列条件:
(1)外部接口的堆栈必须是8字节对齐的。
(2)在汇编程序中使用PRESERVE8伪指令告诉连接器,本汇编程序数据是8字节对齐的。

子程序中结果返回的规则如下:

  • 结果为一个32位整数时,可以通过寄存器R0返回;
  • 结果为一个64位整数时,可以通过寄存器R0和Rl返回;
  • 结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或s0来返回;
  • 结果为复合型浮点数(如复数)时,可以通过寄存器f0~fn或d0~dn来返回;
  • 对于位数更多的结果,需要通过内存来传递。

练习题

1.子程序或者过程调用时,如果参数超过4个,如何编程实现正确地参数传递。
当参数个数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用堆栈来传递参数。在传递参数时,将所有参数看作是存放在连续的内存字单元的字数据。然后,依次将各字数据传递到寄存器R0,R1,R2和R3中。如果参数多于4个,则将剩余的字数据传递到堆栈中。入栈的顺序与参数传递顺序相反,即最后一个字数据先入栈。对于参数个数可变的子程序,当参数个数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用堆栈来传递参数。在传递参数时,将所有参数看作是存放在连续的内存字单元的字数据。然后,依次将各字数据传递到寄存器R0,R1,R2和R3中。如果参数多于4个,则将剩余的字数据传递到堆栈中。入栈的顺序与参数传递顺序相反,即最后一个字数据先入栈。

你可能感兴趣的:(嵌入式操作系统)