嵌入式操作系统的特点
- 可装卸性。开放性、可伸缩的系统结构
- 强实时性
- 统一的接口。提供各种设备驱动接口
- 操作方便简单,提供友好的GUI图形界面
- 提供强大的网络功能。
- 强稳定性,弱交互性。
- 固化代码。应用软件被固化在系统的rom中。
- 良好的移植性。
嵌入式软件的基本特点
- 软件要求固态化存储
- 实时处理多任务
- 许多应用要求系统软件有实时处理能力
- 多任务操作系统是知识集成的平台和走向工业标准化道路的基础
- 用c语言最佳选择
嵌入式系统开发需要考虑的主要因素
- 软硬件协同设计
- 嵌入式处理器的选择
- 嵌入式操作系统的选择
- 嵌入式开发环境和调试
嵌入式交叉开发环境
为什么:
嵌入式操作系统是一个资源受限的系统,直接在嵌入式操作系统上开发应用程序十分困难甚至是不可能的,因此需要交叉开发环境
什么是
在通用计算机上编辑编译程序,生成能够在目标平台上运行的二进制代码指令,最后再下载在目标平台上进行调试
ARM微处理器的技术特点
- 功耗低、成本低、性能高
- 使用Thumb(16位)和ARM(32位)双指令集,兼容大多数8/16位程序
- 大量使用寄存器,几乎所有数据操作都在寄存器完成
- 寻址方式灵活简单、执行效率高
- 有专门的载入和存储指令访问存储器
- 指令长度固定
RISC指令集
- 设计指令系统时,一般只选用使用频度最高的那些指令,外加一些对系统有用的指令,是指令的条数大大减少一般不多于100条。
- 限制寻址方式,一般不超过两种。限制指令格式一般也不超过两种。
- 所有指令都能在一个机器周期内完成
- 扩展寄存器个数,一般不小于32个,只有存(STORE)取(LOAD)指令能够访存,其他操作均在寄存器内完成
- 为了提高指令执行速度,大部分指令采取硬联控制实现,少数指令采用微程序实现。
- CPU硬件设计更为简单,更少的电路,面积小,功耗更低
- 数据线和指令线分离,采用哈佛结构
- 指令多为单字节,程序存储器空间利用率大大降低,能够实现超小型化
CISC
- 具有大量指令和寻址方式
- 8/2原则:80%的程序只是用20%的指令
- 大多数程序只需要少量的指令就能运行
- cpu设计复杂功能强面积大功耗高
- 数据线和指令线分时复用是冯诺依曼结构
七种工作模式
ARM为了系统资源的调度和保护设计了7种工作模式
用户模式
arm微处理的正常运行模式,通常用来执行一般的应用程序
- 用户程序的工作模式
- 运行在操作系统的状态上
- 没有权限操作其他硬件资源
- 无法切换到其他模式,只能通过软中断(SWI)或产生异常访问其他硬件资源
快速中断模式
(FIQ)用于响应快速中断请求,由外部触发FIQ引脚, 用于高速数据传输或通道处理。
- 用于处理时间要求比较紧急的中断请求
- 主要用于告诉数据传输以及通道处理中
外部中断模式
(IRQ)用于响应一般外部中断请求,由外部触发IRQ引脚
- 用于处理一般的外部中断请求
- 一般由硬件产生中断信号后自动进入该模式
- 运行在特权模式,可以自由访问系统硬件资源
管理模式(SVC)
操作系统的保护模式
- CPU上电后的默认模式
- 用于系统的初始化
- 软中断的处理也处在该模式,用户模式发出硬件请求后通过软中断进入该模式
- 中断模式后会快速进入管理模式
中止模式(ABT)
当数据或指令预取中止时进入该模式,可用于实现虚拟存储或存储保护
- 用户程序访问非法地址,没有权限读取内存地址时进入该模式
- linux下编程出现segment fault就是在该模式下返回的
系统模式(SYS)
运行具有特权的操作系统任务
- 系统模式不受用户模式控制
- 和用户模式共用一套寄存器
- 操作系统可以在系统模式下访问用户模式的寄存器,而操作系统的一些特权任务可以使用这个模式运行一些受控的资源
未定义模式(UND)
当未定义指令进入该模式时可以支持硬件协处理器进行软件仿真
CPU在指令的译码阶段不能识别指令的操作时会进入该模式
monitor
cortex-A9的第八种工作模式
为了安全而扩展出的为了执行安全监控代码的模式
是一种特权模式
类别
除了用户模式外都是特权模式
除了用户模式和系统模式外都是异常模式
模式转换
- 复位后进入管理模式
- 通过软件改变
- 通过系统调用
- 中断改变:IRQ\FIQ
- 异常处理:位于CPU内部
ARM寄存器
37个32位寄存器,其中由31个通用寄存器,6个状态寄存器,状态寄存器只使用了其中的12位
通用寄存器
分为三类:
- 不分组寄存器:R0~R7
所有模式下,每个未分组寄存器指向一个物理寄存器
中断或异常工作模式转换,不同模式使用相同物理寄存器可能导致数据损坏
- 分组寄存器:R8~R14
R8~R12每个寄存器对应两个不同的物理寄存器,当FIQ模式时是R8_flq-R12_flq,其他模式是R8_usr~R12_usr
R13-R14每个寄存器对应6个不同的物理寄存器,其中一个是用户模式和系统模式共用的,其余对应5个不同的工作模式
R13_\<mode>、R14\_\<mode>
mode:usr flq irq svc abt und
R13常用作堆栈指针SP,习惯用法
R14寄存器也叫做LR链接寄存器
当执行BL子程序调用时,R14得到R15(PC)的备份
当发生中断或异常时,对应的R14寄存器R14_\<irq,flq,svc,abt,tmd>用于保存R15的返回值
程序计数器:R15(PC)
pc总是指向当前执行指令之后的指令的地址
工作状态
一种为ARM状态,执行32位字对齐的arm指令。
一种为Thumb状态,执行16位半字对齐的Thumb指令。
工作状态的转换
- 在程序执行过程中可以随时转变工作状态
- 处理器工作状态的转换不会处理器的工作模式和相应寄存器中的内容
- ARM处理器在开始执行代码时总是处于arm状态
- 也就是复位后进行arm状态
转换的方法
可以采用执行BX指令的方法
BX \<reg>通过这条指令使处理器跳转到寄存器所包含的地址,并根据reg中地址的最低位是0是1决定是进入arm模式还是thumb模式
最低位是0则进入arm模式执行arm指令
最低位是1则进入thumb模式,跳转到去掉最低位后的实际地址执行thumb指令
此外从thumb状态进入异常,则在返回时自动进入thumb状态
所有的异常处理都在arm状态下执行
操作数寄存器状态
arm指令4字节对齐,thumb指令2字节对齐,因此无论是在arm状态下还是在thumb状态下,操作数寄存器的最低位都应该为0,以确保对齐,避免未对齐产生内存访问错误
程序状态寄存器
ARM体系结构包含一个当前状态寄存器(CPSR)和五个备份状态寄存器(SPSR)
CPSR:可以在任何模式下被访问,包含条件标志位、中断禁止位、当前处理器模式标志位和一些其他相关控制和状态标志位。
异常模式下有一个专门的物理寄存器SPSR
当异常发生时,SPSR备份CPSR中的值,当从异常状态中退出时,由SPSR恢复CPSR的值
用户状态和系统状态不是异常状态没有SPSR
程序状态寄存器的功能:
- 保存ALU中当前操作信息
- 控制允许和禁止中断
- 设置处理器工作模式
条件标志位
N,Z,C,V为条件标志位
可以由算数或者逻辑运算的结果所改变,并且可以决定某条指令是否被执行
在arm状态中,绝大多数指令都是有条件执行
在Thumb状态中,除了分支指令B指令时有条件执行,其他指令都是无条件执行
N:补码带符号数进行运算,结尾为负N=1,结果非负N=0。
Z:Z=1表示运算结果为0,Z=0表示运算结果非0.
C:
- 加法指令(包括比较指令CMN),运算结果产生进位(无符号数溢出),C=1否则C=0
- 减法指令(包括比较指令CMP),运算结果产生借位(无符号数溢出),C=1否则C=0
- 对于包括移位操作的非加减运算指令,C为移出值的最后一位。
- 对于其他非加减指令,C的值不受影响
V:
- 对于加减运算指令,当运算数和结果值为二进制补码表示的带符号数时,V=1表示符号位溢出
- 其他指令通常不会影响V
Q(27位):在v5及以上的E系列处理器中做标志位,通常标志DSP运算溢出
工作模式位
M[4:0] | 处理器模式 | 可访问的寄存器 |
---|---|---|
0b10000 | 用户模式 | PC、CPSR、R0~R14 |
0b10001 | FIQ模式 | PC、CPSR、SPSR_fiq、R14_fiq~R8_fiq、R7~R0 |
0b10010 | IRQ模式 | PC、CPSR、SPSR_irq、R13_irq、R14_irq、R12~R0 |
0b10011 | 管理模式 | PC、CPSR、SPSR_svc、R13_svc、R14_svc、R12~R0 |
0b10111 | 中止模式 | PC、CPSR、SPSR_abt、R13_abt、R14_abt、R12~R0 |
0b11011 | 未定义模式 | PC、CPSR、SPSR_und、R13_und、R14_und、R12~R0 |
0b11111 | 系统模式 | PC、CPSR(v4及以上版本),R14~R0 |
thumb状态下的寄存器组织
thumb状态下的寄存器集是arm状态下的一个子集
程序可以直接访问:
8个通用寄存器R0~R7
程序寄存器PC
堆栈寄存器SP
链接寄存器LR
CPSR
SPSR
I/O端口的访问方式
I/O端口访问,arm使用存储映射方式也叫统一编址方式。
对存储器映射的I/O地址进行读取操作时写入操作。
对存储器映射的I/O地址进行写入操作既是输出。