雅安市网站建设_网站建设公司_jQuery_seo优化
2026/1/7 16:01:28 网站建设 项目流程

二、嵌入式处理器

1.嵌入式处理器的结构类型

  • 指令集:CISC(复杂)/RISC(精简)指令系统,包括:基本数据类型、寄存器、寻址模式、指令、中断以及外部I/O等。
  • 存储结构

2.典型嵌入式处理器简介

2-1.ARM处理器

主流为32位,特点为耗电省、成本低、功能强。

  • 单周期(RISC架构)
  • 只使用加载/存储指令访问内存
  • 指令长度固定
  • 三地址指令格式
  • 指令流水线技术
  • 低功耗设计
2-2.ARM指令集的比较
  • ARM指令集:全部是32位的指令,其基本指令主要进行8位、16位、32位整数的运算,可扩充浮点运算指令、数字信号处理指令等
  • Thumb指令集:从ARMv4T开始,全部是16位字长的指令,可看作ARM指令的压缩模式
  • Thumb-2指令集:混合的指令集,既有 16位又有32位
2-3.典型ARM处理器

分五类:经典ARM、ARM Cortex嵌入式处理器、ARM Cortex实时嵌入式处理器、ARM Cortex应用处理器、ARM专家处理器。

Cortex-A(Application)

应用处理器,面向高端

Cortex-R(Real time )

R4、R5、R7,实时嵌入式处理器,面向实时控制

Cortex-M(Microcontroller)

嵌入式处理器,面向微控制器,采用流水线,只支持Thumb-2

ARM7、ARM9、ARM11

经典ARM处理器

Cortex-R4:支持ARM/Thumb-2指令集,有可选的浮点数运算,可用于汽车电子

Cortex-A:常用于智能手机,除A50为64位,其他均为32位

Cortex-M嵌入式处理器

CM0、CM0+

成本低,简单,适合中低端应用,仅有56条Thumb-2指令

CM3

性能高,通用性好,适合工业控制及中高端应用,支持Thumb-2子集

CM4

数字信号处理

3.ARM处理器的工作状态及工作模式
3-1.ARM处理器的工作状态

(1)ARM状态:ARM处理器工作于32位指令的状态,所有指令均为32位宽度。

(2)Thumb状态:ARM处理器执行16位指令的状态,此时代码密度变大,占用内存空间减小。

(3)调试状态:处理器停机调试时进入调试状态。

1.除Cortex-M系列处理器外,所有ARM处理器复位后开始执行代码时总是处于ARM状态。

2.Cortex-M系列处理器因为只有Thumb-2指令集,所以只有Thumb状态和调试状态。

ARM和Thumb状态的切换:

(1)由ARM状态切换到Thumb状态

通过BX指令,将操作数寄存器的最低位设置为1即可将ARM状态切换到Thumb状态。如果R0[0]=1,则执行BX R0指令进入Thumb状态。如果Thumb状态进入异常处理(异常处理要在ARM状态下进行),当异常返回时,将自动切换到Thumb状态。

(2)由Thumb状态切换到ARM状态

通过BX指令,将操作数寄存器的最低位设置为0即可将Thumb状态切换到ARM状态。如果R0[0]=0,则执行BX R0指令进入ARM状态。如果进入异常处理,则从异常向量地址开始执行,将自动进入ARM状态。

3-2.ARM处理器的工作模式

ARM体系结构支持7种工作模式,取决于程序状态寄存器CPSR低5位的值。

工作模式

功能说明

可访问的寄存器

CPSR[M4:M0]

用户模式User

程序正常执行工作模式

PC,R14~R0,CPSR

10000

快速中断模式FIQ

处理高速中断,用于高速数据传输或通道处理

PC,R14_fiq~R8,R7~R0,CPSR,SPSR_fiq

10001

外部中断模式IRQ

用于普通中断处理

PC,R14_irq~R13_irq,R12~R0,CPSR,SPSR_irq

10010

管理模式SVC

操作系统的保护模式,处理软件中断SWI

PC,R14_svc~R13,R12~R0,CPSR,SPSR_svc

10011

中止模式ABT

处理存储器故障,实现虚存储器和存储保护

PC,R14_abt~R13_abt,R12~R0,CPSR,SPSR_abt

10111

未定义指令模式UND

处理未定义的指令陷阱,用于支持硬件协处理器仿真

PC,R14_und~R13_und,R12~R0,CPSR,SPSR_und

11011

系统模式SYS

运行特权级的操作系统任务

PC,R14~R0,CPSR

11111

ARM处理器工作模式之间可以相互转换,发生异常时,处理器自动改变CPSR[M4:M0]的值,从而改变模式。

4.ARM处理器的寄存器组织
4-1. ARM状态下的寄存器组织

ARM处理器在ARM状态下共有37个寄存器,其中31个为通用寄存器(包括PC),剩余6个为状态寄存器。

1)通用寄存器
  • 公共寄存器: R7-R0为所有工作模式公用的通用寄存器,R8-R14根据不同模式有分别。
  • PC寄存器: R15(PC)始终作为程序计数器使用,指向将要执行的下一条指令的地址。
  • CPSR寄存器: 当前程序状态寄存器,记录当前程序的状态。
  • SPSR寄存器:备份状态寄存器,对CPSR的备份,当从用户模式转到其他模式时,备份状态寄存器记录CPSR的状态,用于保护现场。

2)状态寄存器

程序寄存器(CPSR/SPSR)格式如下:前5位是条件码标志,后8位是控制位I、F、T、M4~M0。

NZCVQ标志位:

  • N: 符号标志,N=1表示运算结果为负数,N=0表示运算结果为正数。
  • Z: 零标志,运算结果为0时Z=1,否则Z=0。
  • C: 进借位标志,加法有进位时C=1,无进位时C=0;减法有借位时C=0,无借位时C=1。
  • V: 溢出标志,加减法运算结果有溢出时V=1,否则V=0。
  • Q: 增强的DSP运算指令溢出标志,溢出时Q=1,否则Q=0。

中断控制位:

  • I:禁止外部中断IRQ控制位,I=1禁止外部中断IRQ,I=0允许外部中断IRQ。
  • F: 禁止快速中断FIQ的控制位,F=1禁止FIQ中断,F=0允许FIQ中断。
  • T: ARM和Thumb指令切换位,T=1时执行Thumb指令,否则执行ARM指令。

模式选择位:M4~M0,决定控制器工作于何种模式。

4-2. Thumb状态下的寄存器组织

Thumb状态下的寄存器组是ARM状态下寄存器组的子集。R0-R7为低位寄存器,所有ARM处理器的不同状态均可使用,R8-R12在16位指令模式下不能使用,只有在32位指令状态下才可当作通用寄存器使用。R13 (SP)为堆栈指针,分为PSP(进程堆栈指针)和MSP(主堆栈指针);R14 (LR)为链接寄存器;R15 (PC)是程序计数器;状态寄存器为 xPSR(包括CPSR和SPSR)。

5.ARM处理器的异常

异常是指在程序正常执行过程中,由于内部或外部事件引起的请求,使处理器暂停当前工作,去处理其他事情,处理完毕后返回原程序继续执行。在操作系统或组成原理中,中断和异常通常被归为同一类概念。中断可视为异常的一种,用于处理内部或外部事件。

5-1. 异常的种类

ARM体系结构(除Cortex外)中共有7种异常,异常优先级分为6级,复位(RESET)优先级最高,未定义指令(UND)和软件中断(SWI)优先级相同且最低。每个异常中断向量占据4个字节,异常向量地址用于定位异常处理程序的入口。复位异常优先级最高,发生时PC无条件指向0x00000000,通常此处放置无条件转移指令,跳转到系统初始化程序。

异常类型

优先级

工作模式

异常向量地址

说明

复位(RESET)

1

管理模式SVC

0x00000000

RESET引脚有效时

未定义指令(UND)

6

中止模式ABT,未定义指令模式UND

0x00000004

协处理器认为当前指令未定义

软件中断(SWI)

6

管理模式SVC

0x00000008

用户定义的中断指令

指令预取中止(PABT)

5

中止模式ABT

0x00000000

当预取指令地址不存在或该地址不允许访问

数据访问中止(DABT)

2

中止模式ABT

0x00000010

当数据访问地址不存在或该地址不允许访问

外部中断请求(IRQ)

4

外部中断模式IRQ

0x00000018

有外部中断

快速中断请求(FIQ)

3

快速中断模式FIQ

0x00000010

有快速中断请求

5-2. 异常的中断响应过程

1)保护现场

将CPSR的值保存到将要执行的异常中断对应的SPSR中,以实现对处理器当前状态、中断屏蔽及各标志位的保护。

2)设置CPSR相应位

设置CPSR中的M4~M0位,进入相应工作模式;设置I=1禁止IRQ中断;若进入复位模式或FIQ模式,还需设置F=1禁止FIQ中断。

3)保存断点地址

将引起异常指令的下一条地址(断点地址)保存到新的异常工作模式的LR(R14)中,以便异常处理程序执行完后能正确返回原程序。每种异常模式对应两个寄存器SP(R13_mode)和LR(R14_mode),分别存放堆栈指针和断点地址。

4)给PC赋值

给程序计数器PC强制赋值,转入异常向量地址,以便执行相应的处理程序。

5)恢复用户寄存器(除复位)

将SPSR_mode寄存器值复制到CPSR中,恢复原先的CPSR状态,根据异常类型将PC值恢复成断点地址,继续执行用户原来运行着的程序。

6)清除中断禁止标志

清除CPSR中的中断禁止标志I和F,开放外部中断IRQ和快速中断FIQ。

6.ARM的存储器格式及数据类型

ARM存储器是从0x00000000地址开始的以字节为单位的线性阵列,每个数据字32位占4个字节的地址空间,按0号、1号、2号、3号字节排列 。ARM支持的最大寻址空间为4GB。

6-1.ARM的两种存储字的格式

(1)大端模式

在大端模式下,32位数据字的高字节存储在低地址中,低字节存放在高地址中。如32位数据字0x32145678存放在起始地址为0x30001000时,高字节32存放在低地址0x30001000,低字节78存放在高地址0x30001003。

(2)小端模式

在小端模式下,32位数据字的高字节存放在高地址,低字节存放在低地址。如32位数据字0x12345678存放在起始地址为0x30001000时,低字节78存放在低地址0x30001000,高字节12存放在高地址0x30001003。

6-2. 存储器的数据类型

除Cortex-A50外,32位ARM处理器支持字节(8位)、半字(16位)、字(32位)三种数据类型。字需要4字节对齐(地址的低两位为0),半字需要2字节对齐(地址的最低位为0)。每种数据类型又支持有符号数和无符号数,因此共有6种数据类型。ARM还支持其他类型的数据,如浮点数等数据类型。

7.ARM处理器中的MMU和MPU
7-1. MMU

1)MMU的功能

  • 虚拟地址到物理地址映射: ARM处理器产生的地址是虚拟地址,MMU负责将这些虚拟地址转换为物理地址,通过查找页表完成转换。页表存储在内存储器中,记录虚拟地址与物理地址的对应关系。
  • 存储器访问权限控制: 存储器的访问权限可以按块(页)为单位设置,包括不可访问、只读、可读/写等权限。访问具有不可访问权限的页时,会产生存储器异常信号通知ARM处理器。

2)存储器访问的顺序

(1)TLB查找: 执行加载/存储指令访问存储器时,MMU首先查找TLB(Translation Lookaside Buffer,转换后备缓冲器)中的转换表。

(2)页表查找: 如果TLB中没有找到对应项,则硬件自动查找主存储器内的页表,获取虚拟地址到物理地址的转换信息和访问权限信息。

(3)中断处理: 如果页表中也找不到转换信息,则产生中断(缺页中断),由操作系统(OS)进行处理。

7-2. MPU

MPU(Memory Protection Unit,存储器保护单元)是对存储器进行保护的可选组件。提供简单代替MMU的方法来管理存储器,通过定义域(区域)来控制指令内存和数据内存的访问。MPU允许ARM处理器的4GB地址空间定义8对域,分别控制8个指令区域和8个数据区域。每个域的首地址和界(或长度)均可编程。

8.ARM指令
8-1. ARM指令分类

ARM的指令集可分为分支指令、数据处理指令、程序状态寄存器(CPSR)处理指令、加载/存储指令、协处理器指令、异常产生指令六种。

  • 分支指令: 如B、BL、BLX、BX等,用于控制程序流程,实现跳转。
  • 数据处理指令: 如ADD、SUB、MUL等,用于进行算术和逻辑运算。
  • 程序状态寄存器(CPSR)处理指令: 如MSR、MRS等,用于操作程序状态寄存器。
  • 加载/存储指令: 如LDR、STR、LDM、STM等,用于数据在寄存器和存储器之间的传输。
  • 协处理器指令: 如CDP、MCR、MRC等,用于与协处理器进行交互。
  • 异常产生指令: 如SWI、BKPT等,用于产生异常或中断。

8-2. ARM指令格式

  • <opcode>: 指令的操作码,即助记符,如MOV、ADD、B等,用于指定指令的功能。
  • {cond}: 指令执行的条件码,如EQ、NE等,满足条件时指令才会执行。条件码共有16种,位于指令的最高4位。可省略。
  • {S}:指令执行时是否更新CPSR,可省略。
  • Rd:目的寄存器
  • Rn:第一个源操作数
  • op2:第二个源操作数

8-3.操作数符号

  • 立即数符号(#): 表示立即数,其后可以是十进制数或十六进制数。
  • 十六进制符号(0x): 表示其后的数据为十六进制数。
  • 更新基址寄存器符号(!): 指令完成后,将最后地址写入基址寄存器。
  • 复制SPSR到CPSR符号(^): 用于批量数据存储指令中放在寄存器后面当后缀,当其前面寄存器不包括PC时,该符号表示所用的寄存器是用户模式的寄存器;当其前面的寄存器包含PC时,该符号指示将SPSR的值复制到CPSR。
  • 寄存器列表范围符号(-): 表示多个连续寄存器,如R0-R7。
8-4.移位操作

移位操作类型包括LSL(逻辑左移)、ASL(算术左移)、LSR(逻辑右移)、ASR(算术右移)、ROR(循环右移)以及RRX(带扩展的循环右移)。移位操作格式:Rm, <opsh> #<shift>,其中Rm为要移位的通用寄存器,<opsh>为移位操作符,<shift>为移位次数(0~31)。

9.ARM指令的寻址方式

1. 立即寻址

立即寻址也称立即数寻址,操作数本身就在指令中给出,取出指令即取到操作数。立即数前带有“#”前缀,十六进制立即数还需在“#”后加“0x”。例: MOV R0,#0x11,ADC R0,#99。

2. 寄存器寻址

利用寄存器中的数值作为操作数。例: ADD R3,R1,R2,将R1和R2的数据相加后存入R3。

3. 寄存器间接寻址

寄存器中存储的是操作数所在内存地址,通过该地址访问操作数。寄存器名用中括号[]括起来表示间接寻址。例: LDR R0,[R1],将R1指向地址中的值加载到R0。

4. 基址加变址寻址

将基址寄存器的内容与指令中的地址偏移量相加,得到操作数的有效地址。常用于访问基地址附近的内存单元。例: LDR R0,[R1,#3],将R1+3地址中的值加载到R0。

5. 相对寻址

以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,相加后得到操作数的有效地址。主要用于跳转指令。例: BL Subroutine_A,跳转到子程序Subroutine_A处执行。

6. 堆栈寻址

堆栈是一种数据结构,按先进后出(FILO)方式工作,使用堆栈指针指示当前操作位置。分为递增堆栈和递减堆栈,各有满栈和空栈两种工作方式。例: 满递增堆栈,堆栈指针指向最后压入的数据,地址由低向高生成。

7. 块拷贝寻址

又称多寄存器寻址,一条指令可完成多个寄存器值的传送。最多可传送16个通用寄存器的值。例:LDMIA R0,[R1,R2,R5,R9],表示[R0]->R1;[R0+4]->R2;[R0+8]->R5;[R0+12]->R9。

10.ARM支持的伪指令

在ARM汇编语言程序中,有一些特殊指令助记符没有相对应的操作码,通常称为伪指令。ARM汇编的伪指令类型包括符号定义、数据定义、汇编控制、宏指令等

10-1.符号定义伪指令
  • 符号定义目的:定义符号,提供数据
  • 符号定义内容:变量名与表达式
  • 符号对应的地址:存储数据的地址,分为全局(global)和局部(local)
  • 符号定义的数据类型:数值(arithmetic)、逻辑(logic)、字符(string)
  • 符号赋值:使用set进行赋值,有初始化过程
10-2.数据定义伪指令

数据定义伪指令以d开头,b代表byte,即连续的字节;w代表半字,即每两个字节一组;d代表字;q代表双字,即连续的双字存储。示例:dcb表示定义连续的字节存储;dcw表示定义三个连续的半字存储,并初始化为123。

10-3.汇编控制伪指令

汇编控制伪指令类似于C语言中的if else和循环结构。if逻辑表达式为真时执行特定代码段,否则执行另一代码段。

汇编控制伪指令示例一(if else结构):

GB ll test:生成全局逻辑变量test。

if test等于true,执行指定序列一;否则,执行指定序列二。

汇编控制伪指令示例二(循环结构):

gbl a count:定义一个名为count的竖直边变量。

count set a 3:将count的值设置为3。

当count小于10时,执行循环体指令序列。

循环中可能包含使count逐渐加一的操作,直至满足终止条件。

10-4.其他伪指令
  • 断明l指令:涉及程序、数据的分段,段有很多属性
  • 段的属性:包括代码d、只读read only、可读可写read why、对齐a line、16位或32位指令集
  • entry和end:汇编程序的入口和结束
  • equ指令:定义一个常量,类似于C语言的define
  • export指令:全局标号声明
  • import指令:引入一个不在当前范围内的标号作为指令
  • exchange指令:外部标号的引用
11.ARM汇编语言的语句格式

汇编语言的语句由标号、指令或伪指令以及注释组成。指令或伪指令的助记符可以全大写或全小写,但不可大小写混用

符号约定:

  • 区分大小写: 同名但大小写不同的符号被视为两个不同的符号。
  • 唯一性: 符号在其作用范围内必须唯一,不允许重名。
  • 避免与保留字重名: 自定义符号名不能与系统的保留字或指令、伪指令同名。

变量与常量:

  • 变量: 其值在程序运行过程中可以改变的量。
  • 常量: 其值在程序运行过程中不能改变的量。
  • 变量代换: 程序中的变量可以通过代换操作取得一个常量值。
11-1.在汇编语言程序中的表达式和运算符

运算次序:

  • 优先级相同的双目运算符从左到右运算。
  • 括号运算符的优先级最高。
  • 相邻的单目运算符从右到左运算,且单目运算符的优先级高于其他运算符。

数值表达式构成: 由数值常量、数值变量、数值运算符和括号构成。

常用运算符:

      • 算术运算符: +、-、*、/ 及 MOD。
      • 移位运算符: ROL、ROR、SHL 及 SHR。
      • 数值逻辑运算符: AND、OR、NOT 及 EOR。

逻辑表达式构成: 由逻辑量、逻辑运算符和括号构成,运算结果为真或假。

常用运算符:

      • 关系操作符: =、>、<、>=>=>=、<=<=<=、/=。
      • 逻辑运算符: LAND、LOR、LNOT 及 LEOR。

注意: 逻辑运算符前的“L”用于与位运算符区分。

字符串表达式构成: 由字符串常量、字符串变量、运算符和括号构成。字符串最大长度为512B。

常用运算符:

      • 返回字符串长度运算符: LEN。
      • 字节整数转换为字符运算符: CHR。
      • 字符串转换运算符: STR。
      • 返回左端字符串运算符: LEFT。
      • 返回右端字符串运算符: RIGHT。
      • 合并字符串运算符: CC。
11-2. S3C2410系统引导程序代码
1)系统引导程序的功能
  • 关看门狗定时器: 引导程序首先会关闭看门狗定时器和中断,以确保系统稳定启动。
  • 设置CPU速率及时钟频率: 接着,设置CPU的速率和时钟频率,为系统提供基本的运行参数。
  • 设置堆栈: 设置堆栈,为程序的运行提供必要的内存空间。
  • 切换用户模式并初始化用户堆栈: 切换至用户模式,并初始化用户堆栈,为应用程序的运行做准备。
  • 初始化设备寄存器: 如果使用DRAM或其他设备,还需要设置相关寄存器,初始化这些设备。
  • 初始化存储空间: 初始化存储空间,为数据的存储和读取提供条件。
  • 跳转到C程序入口: 最后,跳转到C程序的入口,开始执行主程序。
2)启动文件Startup.S及其代码分析
  • 启动文件: 引导程序的主要实现文件是Startup.S,这是一个启动代码文件。
  • 分析时机: 由于启动代码中涉及许多S3C2410内部硬件知识,建议在学习完第3章相关内容后,再详细分析Startup.S代码。
11-3. 顺序程序设计

顺序程序设计也称简单程序设计或直接程序设计,没有分支,也没有循环,是按照指令顺序一条一条执行下去的程序结构。

11-4. 分支程序设计

ARM分支程序结构通过分支指令B与条件执行相结合来实现。分支指令B通常与cmp等指令结合,根据cmp的比较结果或其他运算结果对状态寄存器的位进行改变,从而决定是否进行跳转。

例: 如三个数(8,2,6)的降序排序过程,首先比较a(8)与b(2),因a大于等于b,所以不变;接着比较b(2)与c(6),因b不大于c,所以交换b与c的位置,得到(8,6,2);最后再次比较a(8)与b(6),因a大于等于b,所以排序完成,得到降序排列(8,6,2)。

11-5. 循环程序设计

1)循环控制部分

  • 循环初始部分: 为开始循环准备必要的条件,如循环次数、循环体需要的初始值等。
  • 循环体部分: 重复执行的程序代码,其中包括对循环条件修改的程序段。
  • 循环控制部分: 判断循环条件是否成立,决定是否继续循环,是编程的关键和难点。分为先循环后判断和先判断后循环两种方式。

2)由计数控制循环

  • 方法: 用一个通用寄存器Rn(n=0,1,2,3,4,5,6,7)作为计数器,先给初始值,然后每循环一次减1,直到循环次数为0结束循环。
  • 程序结构: 初始化计数器→执行循环体→修改计数器值→判断计数器值是否为0→是则结束循环,否则继续循环。

3)由条件控制循环

11-6. 子程序设计

在汇编语言设计中,子程序设计是指将单独的功能块进行独立设计。目的是提高代码的模块化和可重用性。

子程序调用采用BL指令。格式为BL + 子程序名。BL指令会保存返回地址,以便子程序执行完毕后能够返回到调用处。

11-7. 多段结构程序设计

在ARM汇编语言程序中,除了可以使用一个代码段外,还可以定义多个数据段,以便对数据进行更灵活的操作。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询