嵌入式系统概述
嵌入式系统组成
IEEE:嵌入式系统是以应用为中心,计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
特征 | 通用计算机 | 嵌入式系统 |
---|---|---|
形式和类型 | •看得见的计算机。 •按其体系结构、运算速度 和结构规模等因素分为大 、中、小型机和微机。 | •看不见的计算机。 •形式多样,应用领域广 泛,按应用来分。 |
组成 | •通用处理器、标准总线和 外设。 •软件和硬件相对独立。 | •面向应用的嵌入式微处理器,总线和外部接口多集成在处理器内部。 •软件与硬件是紧密集成在一起的。 |
开发方式 | •开发平台和运行平台都是 通用计算机 | •采用交叉开发方式,开发平台一般是通用计算机,运行平台是嵌入式 系统。 |
二次开发性 | •应用程序可重新编制 | •一般不能再编程 |
一般由嵌入式硬件和软件组成。
硬件:以包含微处理器的SoC为核心继承存储器和系统专用的IO设备
软件:初始化代码及驱动、嵌入式操作系统和应用程序等,这些软件有机的结合在一起,形成系统特定的一体化软件。
嵌入式发展历程
- 出现和兴起1960-1970
- 走向繁荣,软件和硬件日臻完善1971-1989
- 走向纵深1990-现在
嵌入式系统的特点(理解+掌握)
- 嵌入式系统通常是形式多 样,面向特定应用的
- 嵌入式系统得到多种类型的处 理器和处理器体系结构的支持
- 嵌入式系统通常极其关注成本
- 实时性和可靠性要求
- 嵌入式系统使用的操作系统一般是适应多种处理器、可剪裁、轻量型、实时可靠、可固化的 嵌入式操作系统
- 开发需要专门的工具和特殊的方法
嵌入式系统分类
- 按处理器位数划分:4、8、64位嵌入式系统
- 按应用划分:通信类,信息家电类、移动终端类、汽车电子类、工业控制类。
- 按实时性划分:硬实时、软实时、非实时
- 按软件结构划分:循环轮询系统、有限状态机系统、前后台、单处理器多任务、多处理器多任务
嵌入式硬件系统
基本组成
嵌入式系统的硬件是以包含嵌入式微处理器的SoC 为核心,主要由SoC、总线、存储器、输入/输出接口和设备组成。
结构
冯诺伊曼结构:数据和指令存放在同一存储器中,统一编址,指令和数据通过同一总线访问。
哈佛结构:并行体系结构,程序和数据存储在不同的存储空间,每个存储器独立编址,独立访问,设置两条总线(程序总线和数据总线)——>数据吞吐量提高了一倍。
指令集
CISC 复杂指令集系统 | RISC 精简指令集系统 | |
---|---|---|
价格 | 由硬件完成部分软件功能,硬件复杂性增加,芯片成本高 | 由软件完成部分硬件功能,软件复杂性增加,芯片成本低 |
性能 | 减少代码尺寸,增加指令的执行周期数 | 使用流水线降低指令的执行周期数, 增加代码尺寸 |
指令集 | 大量的混杂型指令集,有简单快速的指令,也有复杂的多周 期指令,符合HLL(high level language) | 简单的单周期指令,在汇编指令方面有相应的CISC微代码指令 |
高级语言支持 | 硬件完成 | 软件完成 |
寻址模式 | 复杂的寻址模式,支持内存到 内存寻址 | 简单的寻址模式,仅允许LOAD和 STORE指令存取内存,其它所有的 操作都基于寄存器到寄存器 |
控制单元 | 微码 | 直接执行 |
寄存器数目 | 寄存器较少 | 寄存器较多 |
主流嵌入式微处理器
主流嵌入式微处理器由:ARM、MIPS、PowerPC、Super H
ARM处理器:从Cortex(ARMv7)开始有三代处理器:A(应用处理器)、R(实时控制处理器)、M(微控制器)
总线
AMBA总线
AMBA主机接口(AHB):作为总线的核心组件,AHB提供了高性能的总线传输,支持多个主从设备的连接。它使用多层的信号控制和优先级控制来协调设备之间的数据传输。构成:主单元、从单元、仲裁器、译码器。
ASB(Advanced System Bus):也用于高性能系统模块的连接,现多由 AHB总线替代。
AMBA流水线接口(APB):APB是一种低功耗、低带宽的总线接口,用于连接低速外设。它支持简单的控制和配置寄存器的读写操作。由两部分构成:APB桥(唯一的主单元)和APB从单元
AMBA高速接口(AXI):AXI是一种高性能、低延迟的总线接口,适用于连接高带宽的设备或者高速存储器。它提供了高度灵活的数据传输和地址映射机制,支持多个主设备和从设备的并行操作。
UART
UART是一种通用异步串行收发器,可以实现全双工传输。
I2C
是一个同步串行收发器
I2C总线是由数据线SDA和时钟线SCL构成的同步串行总线,支持双向传送。总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器)。
I2C通信过程:
起始条件(Start Condition):主设备发送一个起始条件来开始I2C通信。起始条件是将SCL(时钟线)从高电平拉低,接着拉低SDA(数据线)。
地址和读写位传输:主设备将目标设备的地址和读写位传输到总线上,指定要与哪个设备进行通信(读或写)。地址由7位或10位组成,用于唯一标识每个设备。
寻址确认:接收到其地址的设备向主设备发送确认(ACK)信号,表示设备已被成功寻址。
数据传输:主设备和目标设备之间进行数据传输。每次数据传输可以是一个字节或多个字节,取决于应用需求。
确认传输:接收方在接收到每个字节后会发送一个确认信号(ACK)给发送方,表示数据已正确接收。
停止条件(Stop Condition):主设备发送停止条件来结束I2C通信。停止条件是将SCL从低电平拉高,接着拉高SDA。
嵌入式软件的独特性
1)规模小,但开发难度不一定小;
2)快速启动,直接运行;
3)实时性和可靠性要求高;
4)应用程序和操作系统一体化;
5)开发平台和运行平台不同。
ARM处理器体系结构
数据类型
字节(Byte):在ARM体系结构和8位/16位处理器体系结构中,字节的长度均为8位。
字(Word):在ARM体系结构中,字的长度为32位,而在8位/16位处理器体系结构中,字的长度一般为16位。 (注:字必须与4字节的边界对准。)
半字:在ARM体系结构中,半字的长度为16位,与8位/16位处理器体系结构中字的长度一致。(注:半字必须与2字节的边界对准。)
寻址空间
ARM是RISC体系,32位读取存储框架
线性存储地址,空间大小位4G
工作状态
ARM指令存储结构:32位
THUMB指令存储结构:16位
ARM微处理器的工作状态由两种:ARM状态和Thumb状态
优缺点
当系统具有32位的数据总线宽度时,ARM比THUMB有更好的性能表现
当系统的数据总线宽度小于32位时,THUMB比ARM性能更好(比如16的存储器,1条ARM指令需要两个存储器访问周期)
代码尺寸
同样一段C代码,用THUMB指令编译的结果,其长度只占ARM编译结果的65%左右
THUMB指令集在功能上只是ARM指令集的一个子集,某些功能只能在ARM状态下执行,如CPSR和协处理器的访问。进行异常响应时,处理器会自动进入ARM状态。即使是一个单纯的THUMB应用系统,必须加一个汇编的交互头程序,因为系统总是自动从ARM开始启动。
处理器状态切换
进入Thumb状态:当操作数寄存器的状态位(位[0])为1时,执行BX指令进入Thumb状态。如果处理器在Thumb状态进入异常,则当异常处理返回时,自动转换到Thumb状态。
进入ARM状态:当操作数寄存器的状态位(位[0])为0时执行BX指令进入ARM状态。当处理器进行异常处理时,进入ARM状态从异常向量地址处开始执行。
1 | ;从Arm状态切换到Thumb状态 |
存储格式
大端格式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
***小端格式:低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。 ***
处理器模式
八种处理器模式,除了用户模式都是特权模式,除了用户模式和系统模式都是异常模式。
特权模式:除用户模式外,其它模式均为特权模式。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。
异常模式:这六种模式称为异常模式。它们除了可以通过程序切换进入外,也可以由特定的异常进入。当特定的异常出现时,处理器进入相应的模式。每种异常模式都有一些独立的寄存器,以避免异常退出时用户模式的状态不可靠。
用户和系统模式:两种模式都不能由异常进入,而且它们使用完全相同的寄存器组。系统模式是特权模式,不受用户模式的限制。操作系统在该模式下访问用户模式的寄存器就比较方便,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。
模式切换:通过修改CPSR(Current Program Status Register)寄存器的特定位,可以实现处理器模式的切换。CPSR寄存器存储了处理器的状态信息,包括当前的处理器模式。
切换处理器模式的步骤如下:
将当前的CPSR寄存器的值读取到一个普通寄存器中,以保存当前的处理器模式。
修改普通寄存器中的对应位,以设置新的处理器模式。
将修改后的普通寄存器的值移动到CPSR寄存器中,从而切换到新的处理器模式。
寄存器组织
有40个物理寄存器,有18个可编程访问的寄存器。
R14寄存器与子程序调用:程序A执行过程中调用程序B;程序跳转至标号Lable,执行程序B。同时硬件将“BL Lable”指令的下一条指令所在地址存入R14;程序B执行最后,将R14寄存器的内容放入PC,返回程序A;
条件码 | 助记符后缀 | 标 志 | 含 义 |
---|---|---|---|
0000 | EQ | Z****置位 | 相等 |
0001 | NE | Z****清零 | 不相等 |
0010 | CS/HS | C****置位 | 无符号数大于或等于 |
0011 | CC/LO | C****清零 | 无符号数小于 |
0100 | MI | N****置位 | 负数 |
0101 | PL | N****清零 | 正数或零 |
0110 | VS | V****置位 | 溢出 |
0111 | VC | V****清零 | 未溢出 |
1000 | HI | C置位Z****清零 | 无符号数大于 |
1001 | LS | C清零Z****置位 | 无符号数小于或等于 |
1010 | GE | N等于V | 带符号数大于或等于 |
1011 | LT | N不等于V | 带符号数小于 |
1100 | GT | Z清零且(N等于V****) | 带符号数大于 |
1101 | LE | Z置位或(N不等于V****) | 带符号数小于或等于 |
1110 | AL | 忽略 | 无条件执行 |
异常
异常处理流程:系统执行完当前指令,将跳到相应的异常服务程序处执行,当异常服务程序执行完后,处理器返回到发生中断的指令的下一条指令处执行。
进入异常:在适当的LR中保存下一条指令的地址,当异常入口来自:
- ARM状态,那么ARM7TDMI将当前指令地址加4或加8复制(取决于异常的类型)到LR中;
- 为Thumb状态,那么ARM7TDMI将当前指令地址加4或加8 (取决于异常的类型)复制到LR中;异常处理器程序不必确定状态。
将CPSR复制到适当的SPSR中;
将CPSR模式位强制设置为与异常类型相对应的值;
强制PC从相关的异常向量处取。
ARM内核在中断异常时置位中断禁止标志,这样可以防止不受控制的异常嵌套。
注:异常总是在ARM状态中进行处理。当处理器处于Thumb状态时发生了异常,在异常向量地址装入PC时,会自动切换到ARM状态。
1 | 1) 说出ARM可以工作的模式名字。 |
ARM微处理器的指令系统
ARM寻址方式:寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有9种基本寻址方式。
(1).寄存器寻址;(2).立即寻址;(3).寄存器偏移寻址;(4).寄存器间接寻址;(5).基址寻址;(6).多寄存器寻址;(7).堆栈寻址;(8).块拷贝寻址;(9).相对寻址。
堆栈寻址
堆栈寻址:堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。
作业
编写一简单ARM汇编程序段,实现1+2+…+100的运算。
1 | .global main |
将存储器中0x40000000开始的200字的数据,传送到0x48000000开始的区域。
1 | .global main |
编写一程序,存储器中从0x40000000开始有一个64位数。(1)将取反,再存回原处;(2)求其补码,存放到0x40000008处 。
1 | .global main |
编写ARM汇编程序 ,函数指针的方法,实现字参数a和b“加”,“减”,“与”,“或”,“异或”五种函数运算。
1 | .global main |
用汇编语言设计程序实现10!(10的阶乘)。
1 | .global main |
实现字符串的逆序复制 TEXT1=”HELLO” =〉TEXT2=”OLLEH “。
1 | .global main |
用调用子程序的方法实现1!+2!+3!+…+10!。
1 | .global main |
什么是内联汇编?使用内嵌汇编时需要注意什么?
1 | 内联汇编(Inline Assembly)是一种将汇编语言代码嵌入到高级编程语言(如C、C++)源代码中的技术。这允许程序员在高级语言代码中直接嵌入汇编指令,以获得对底层硬件的更细粒度控制。内联汇编通常用于以下情况: |
C语言与汇编语言混合编程时的参数传递规则有哪些?
1 | 1、寄存器传递:ARM体系结构中的寄存器传递是一种常见的方式,其中前几个参数通常通过寄存器传递。在ARMv7-A架构中,前四个整数或指针参数通常分别使用R0至R3寄存器传递。在ARMv8-A(Aarch64)架构中,更多寄存器可用于参数传递,例如R0至R7。 |