ARM学习笔记资料.doc_第1页
ARM学习笔记资料.doc_第2页
ARM学习笔记资料.doc_第3页
ARM学习笔记资料.doc_第4页
ARM学习笔记资料.doc_第5页
免费预览已结束,剩余15页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ARM学习笔记本课程的主要学习内容1. 基础部分ARM 处理器的基础知识ARM 指令系统伪操作和伪指令基于汇编语言的程序设计ARM 存储系统异常中断处理2.应用部分基于 ARM 处理器的 C 程序设计DMA 过程的实现利用定时部件实现定时对 I/O 端口编程学习 ARM 顺序:了解各种不同存储器的工作原理。学习 ARM Core 的汇编语言。C 语言。嵌入式编译器ADS ( ARM Develop Duit )嵌入式调试器AXD硬件电路结构。异常事件及中断。相关控制接口。第二章 ARM 处理器的基础知识2.1ARM 处理器模式2.2ARM 寄存器介绍2.3ARM 存储系统2.4ARM 体系的异

2、常中断冯诺依曼体系结构:1、 计算机完成任务是由事先编号的程序完成。2、 计算机程序被事先输入到储存器中,程序运行结果,也被存放在存储器中。3、 计算机能自动连续地完成程序。4、 程序运行的所需要的信息和结果可以通过输入输出设备完成。5、 计算机由运算器、控制器、存储器、输入设备、输出设备所组成。哈佛结构:1、 程序存储器与数据存储器分开。2、 提供较大的数据存储器带宽。3、 适合于数字信号处理。4、 大多数 DSP 都是哈佛结构。5、 ARM9 是哈佛结构。ARM 内核与 SOCARM 核就是中央处理器(CPU)的运算单元。一般有以下几个单元:1、 逻辑运算单元。2、 乘法器、移位器等。3、

3、 指令译码。4、 各种寄存器。5、 调试单元。通常 ARM 核都会加入写缓冲区( write buffer )和高速缓存( cache) ,用来提高 CPU 与外界沟通效率。SOC 就是把系统的全部功能都放到 CPU 里。它是一个系统整合的理念,用来提供特定性能的芯片。通常具有以下特点:1、 运算式引擎: CPU 或 DSP2、 内建存储器: Flash memory 、 RAM 、 ROM3、 总线接口4、 其他特殊功能接口2.1 ARM 处理器模式1. 处理器模式的分类(1)用户模式 (User,user)(2)快速中断模式 (FIQ, fiq)-用于高速数据传输和通道处理(3)外部中断模

4、式 (IRQ, irq)- -用于通常的中断处理(4)管理模式 (Supervisor,svc)-供操作系统使用的一种保护模式(5)数据访问中止模式 (Abort, abt) -用于虚拟存储及存储保护(6)未定义指令中止模式 (Undefine,und)-用于支持通过软件仿真硬件的协处理器(7)系统模式 (System,sys)- 用于特权级的操作系统任务除了用户模式之外的其它6 种模式称为 特权模式 (Previleged mode)在这些模式下,程序可以访问所有的系统资源也可以任意地进行处理器模式的切换其中,除了系统模式以外,其它5 种特权模式 又称为 异常模式 2. 处理器模式的切换(1

5、)处理器模式可以通过软件控制进行切换也可以通过异常中断的方式进行切换(2)大多数的应用程序运行在用户模式下这时,应用程序不能够访问一些受操作系统保护的系统资源(3)应用程序不能直接进行处理器模式的切换当需要进行处理器模式切换时,应用程序可以通过异常中,在异常中断的处理过程中实现处理器模式的切换(4)当应用程序发生异常中断时,处理器进入相应的处理器模式每一种处理器模式都有一组寄存器,供相应的异常中断程序使用这样可以保证在进入相应的处理器模式时,用户模式下的寄存器不被破坏(5)系统模式不是通过异常中断进入的 ,它和用户模式具有完全一样的寄存器 .但系统模式属于特权模式 ,可以访问所有的系统资源 ,

6、也可以直接进行处理器模式切换 .它主要供操作系统使用 .2.2ARM 寄存器介绍ARM处理器共有37 个寄存器其中包括:31 个通用寄存器,包括程序计数器6 个状态寄存器这些寄存器都是(PC)在内这些寄存器都是 32 位寄存器32 位寄存器但目前只使用了其中的 14 位通用寄存器可分为3 类:未备份寄存器,包括R0-R7备份寄存器,包括R8-R14程序计数器PC,即 R15程序状态寄存器CPSR对于备份寄存器R13 和 R14 来说,每个寄存器对应6 个不同的物理寄存器寄存器 R13 在 ARM 中经常用作堆栈指针现场保护。寄存器 R14 又被称为连接寄存器(LR) 主要有两个作用:保存子程序

7、的返回地址保存异常中断程序的返回地址。当通过 BL 或 BLX 指令调用子程序时,R14 被设置成该子程序的返回地址。在子程序中,当把R14 的值复制到PC 时,就实现了子程序的返回。 MOV PC LR 或者 BL LR.程序计数器R15 被称为 PC它的值为当前指令的地址值加8 个字节 一条 ARM 指令固定占有 4 个字节的存储空间 所以 PC 总是指向当前指令的下两条指令并且ARM 指令是字对齐的,所以PC 的第 0 位和第 1 位总是 0程序状态寄存器 CPSRCPSR 可以在任何处理器模式下被访问每一种处理器模式下都有一个专用的物理寄存器,称为 备份程序状态寄存器(SPSR)当特定

8、的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容在异常中断程序退出时,可以用SPSR 的内容来恢复CPSR由于用户模式和系统模式不是异常中断模式,所以它们没有SPSRCPSR 是一个 32 位的寄存器2.3ARM存储系统ARM 存储系统中1 个字单元包含4 个字节单元ARM 存储系统中引入了半字的概念,1 个半字单元包含小端存储格式 - 高位地址保存高位数据大端存储格式 - 高位地址保存低位数据2 个字节单元ARM 存储系统的默认存储格式是小端存储格式2.4 ARM 体系的异常中断保存被中断程序:SPSR_modeCPSRR14_modereturn address恢复被中断程序:

9、CPSRSPSR_modePCR14_modeCPSR 是指用户模式的程序状态寄存器SPSR_mode是指即将进入的异常模式的备份程序状态寄存器R14_mode 是指即将进入的异常模式的连接寄存器return_address是指异常中断处理程序的返回地址第三章 寻址方式3.1ARM 指令的基本特点3.2数据处理指令的操作数寻址方式3.3Load/Store 指令的操作数寻址方式3.1ARM 指令的基本特点一条 ARM 指令的字长为固定的32 位,需要4 个字节的存储空间一条典型的ARM 指令的语法格式如下所示: S , , :指令的助记符,如ADD,MOV等等:指令的执行条件S:决定指令的运行

10、是否影响: 表示目标寄存器CPSR 值: 表示包含第一个操作数的寄存器: 表示第二个操作数2.2数据处理指令的操作数寻址方式 通常具有以下3 种格式(1)立即数方式ADD R0, R0, #2;R0 R0+21.如十六进制数在0x00 到 0xFF 之间,则它一定是合法的1.若十六进制数 0XFF 则将十六进制的数转化成十进制2.如果这个十进制数能够被4 整除则这个十六进制的立即数和合法的,否则是非法的3 例如: 0x101=257/4=64.25 非法0x104=260/4=65合法(2)寄存器方式ADD R0, R0, R1;R0R0+R1(3)寄存器移位方式移位方式有以下的几种形式ASR

11、 算术右移最高有效位右移,同时用自身填入,最低位移C可以实现带符号数的除 2 运算例 :ADD R0, R1, R2, ASR #1;R0R1+R2/2LSL 逻辑左移最低位补 0,最高位移入 C实现无符号数的乘 2 运算例 :ADD R0, R1, R2, LSL #2;R0R1+R2*4LSR 逻辑右移最高位补 0,最低位移入 C实现无符号数的除 2 运算例 :MOV R3, #2ADD R0, R1, R2, LSR R3;R0R1+R2/4ROR 循环右移例 : MOV R0, R0, ROR #8将 R0循环右移 8位RRX 扩展的循环右移例 : MOV R0, R0, RRXCR0

12、0R031C 原来的值RRX 操作只能右移1 位2.3Load/Store指令的操作数寻址方式Load 指令用于从内存中读取数据到寄存器中指令的助记符为LDR .Store 指令用于将寄存器中的数据保存到内存中指令的助记符为STR批量的 Load/Store 指令可以实现一组寄存器和一块连续的内存单元之间传输数据各类型的 Load/Store 指令的寻址方式由两部分组成一部分为一个为一个 地址偏移量 基址寄存器可以是任一个通用寄存器,地址偏移量有以下三种格式(1) 立即数(2) 寄存器(3) 寄存器及一个移位常数基址寄存器 ,另一部分在寻址方式中,地址的计算方法有3 种(1)偏移量方法(2)事

13、先更新方法在这种方法中 ,基址寄存器中的值和地址偏移量作加减运 算,生成操作数的地址 .指令执行后 , 这个生成的操作数地址 被写入基址寄存器 .(3)事后更新方法在这种方法中,指令将基址寄存器的值作为操作数的地址执行内存访问基址寄存器中的值和地址偏移量做加减运算,生成操作数的地址指令执行后,这个生成的操作数地址被写入基址寄存器(1) 基本的 Load/Store 指令, #+/-为地址寄存器 为 12 位的地址偏移量例: LDR R0, R1, #4;R0R1+4LDR R0, R1, #-4;R0R1-4, #+/-例: LDR R0, R1, R2;R0R1+R2LDR R0, R1,

14、-R2;R0R1-R2, #+/-, # 为寄存器中的数值经过移位或循环移位后生成的地址偏移量 为移位运算符 为移位或循环移位的位数例: LDR R0, R1, R2, LSL #2;R0R1+R2*4, #+/-!为基址寄存器 为 12 位的地址偏移量! 表示采用了事先更新方法.在这种方法中基址寄存器中的值和地址偏移量作加减运算,生成操作数的地址 .指 令执行后 ,这个生成的操作数地址被写入基址寄存器.例: LDRR0, R1, #4;R0R1+4LDR R0, R1, #4!;R0R1+4, R1R1+4, #+/-!例: LDRR0, R1, R2;R0R1+R2LDR R0, R1,

15、R2!;R0R1+R2, R1R1+R2, #+/-, #!为地址寄存器 为寄存器中的数值经过移位或循环移位后生成的地址偏移量 为移位运算符 为移位或循环移位的位数例: LDR R0, R1, R2, LSL #2;R0 R1+R2*4LDR R0, R1, R2, LSL #2! ;R0R1+R2*4,R1+R2*4, #+/-为地址寄存器 为 12 位的地址偏移量这种寻址方式采用了事后更新方法.在这种方法中,指令将基址寄存器的值作为操作数的地址执行内存访问基址寄存器中的值和地址偏移量做加减运算,生成操作数的地址指令执行后,这个生成的操作数地址被写入基址寄存器例: LDR R0, R1, #

16、4;R0R1+4LDR R0, R1, #4!;R0R1+4, R1 R1+4LDR R0, R1, #4;R0R1, R1 R1+4, #+/-例: LDR R0, R1, R2;R0R1+R2LDR R0, R1, R2!;R0R1+R2, R1R1+R2LDR R0, R1, R2;R0R1, R1 R1+R2, #+/-, #例: LDR R0, R1, R2, LSL #2;R0R1+R2*4LDRR0, R1, R2, LSL #2!;R0R1+R2*4,R1+R2*4LDRR0, R1, R2, LSL #2;R0R1, R1R1+R2*4(2)批量的 Load/Store 指令

17、一条批量的 Load/Store 指令可以实现在一组寄存器和一块连续的内存单元之间传输数据其语法格式如下LDM !,STM !,其中,指令中寄存器和内存单元的对应关系满足这样的规则:编号低的寄存器对应于内存中低地址单元,编号高的寄存器对应于内存中高地址单元中存放连续的内存单元中的最低地址值例: STMFD R13!, R0-R12, R14;STMDBSTMFD;R0R13-4*14;R1R13-4*13;R14R13-4,R14 通常保存返回地址;R13R13-4*14LDMFD R13!, R0-R12, PC;R0R13;R1R13+4;PCR13+4*13, 即 PCR14,子程序返回

18、或中断返回;R13R13+4*14;R13 为堆栈指针 ,该指令将堆栈中数据装载到寄存器中;LDMIALDMFD第四章 ARM指令集4.1 ARM 指令集概述4.2 跳转指令4.3 数据处理指令4.5 内存访问指令4.4 状态寄存器访问指令4.6 异常中断产生指令4.7 Thumb 指令集简介4.8 基本的 ARM 指令功能段ARM 指令可以分为 6 类,即跳转指令,数据处理指令,程序状态寄存器指令,内存访问指令,协处理器指令和异常中断指令4.2 跳转指令在 ARM 中有两种方式实现程序的跳转,一种是跳转指令;另一种是直接向PC 寄存器写入目标地址值通过直接向PC 寄存器中写入目标地址值可以实

19、现在4GB 的地址空间中任意跳转(R15)中ARM 的跳转指令可以从当前指令向前或向后的32MBARM 的跳转指令有以下的4 种B 跳转指令的地址空间跳转执行 B 指令可以跳转到指令中所指定的目标地址并且例: B Label;程序跳转到标号Label 处执行B 指令仅执行跳转操作BEQ Label;若Z=1, 程序跳转到标号Label处执行BL 带返回和跳转的指令BL指令可以跳转到指令中的目标地址,同时将PC(R15)寄存器的值减4 后保存在LR(R14)寄存器中BL 指令用于实现子程序调用例: BL func1;调用子程序func1MOV PC, LR;子程序返回BLX 带返回和状态切换的跳

20、转指令 BX 带状态切换的跳转指令 (略去 )(略去 )4.3 数据处理指令(1)MOV数据传送指令实现程序跳转MOV PC, LR;R15R14实现从异常中断中返回MOVS PC, LR;R15R14;CPSRSPSR_mode(2)ADD加法指令(3)ADC带进位加法指令ADC 和 ADD 指令的联合使用可以实现两个64 位操作数,其中R0 保存低位数据;R2 和64 位操作数的相加假设R0 和 R1 存放一个R3 存放另一个64 位操作数,其中R2 存放低位数据实现这两个操作数相加的指令为ADDS R4, R0, R2; 影响CPSRADC R5, R1, R3; 不影响CPSR(4)S

21、UB 减法指令注意:在 SUBS 指令中,如果发生了借位操作,CSPR 寄存器中的C果没有发生借位,CPSR 寄存器中的借位标志设置为1这与 ADDS要是为了适应SBC 等指令的需要标志位设置为 0;如指令正好相反这主(5)SBC 带借位减法指令SBC 和 SUB 指令的联合使用可以实现两个SUBS R4, R0, R2;影响 CPSR64 位操作数的相减SBC R5, R1, R3;不影响CPSR(6)MUL乘法指令(8)AND逻辑与操作指令(10)BIC位清除指令BIC 指令将 表示的数值的反码与寄存器 的值进行按位相与操作并把结果保存到目标寄存器 中BIC R0, R0, #%1011;

22、 将 R0 中第 0 位,第 1 位,第 3 位清 0,其它位不变%表示后面的数据采用二进制(11)EOR 逻辑异或操作指令(9)ORR 逻辑或操作指令(7)CMP比较指令(12)TST 位测试指令4.4 状态寄存器访问指令ARM 中有两条指令用于在程序状态寄存器和通用寄存器之间传送数据程序状态寄存器指令包括以下两条MRS 程序状态寄存器到通用寄存器的传送指令MSR 通用寄存器到程序状态寄存器的传送指令例:下面的指令段将当前的处理器模式切换到管理模式MRS R0, CPSR;读取CPSRBIC R0, R0, #0x1FORR R0, R0, #0x13; 修改,去除当前的处理器模式;修改,设

23、置管理模式MSR CPSR_c, R0;写回,仅仅修改CPSR 中的控制位域4.5 内存访问指令 (Load/Store 指令 )(1)LDRB 指令LDRB 指令用于从内存中将一个 8 位的字节数据读取到指令中的目标寄存器中,并将寄存器的高 24 位清零指令的语法格式LDR B, LDRB R0, R2, #3; 将内存单元 (R2+3) 中的字节数据读取到R0 中, R0 的高24 位清零(2)STRB 指令STRB 指令将一个8 位的字节数据写入到指令中指定的内存单元,该字节数据为指令中存放操作数的寄存器的低8 位指令的语法格式STR B , STRB R0, R2, #3;将 R0 中

24、的低 8 位数据保存到内存单元(R2+3) 中4.6 异常中断产生指令(1)SWI 软件中断指令4.7 基本的 ARM 指令功能段4.7.1 基本的指令功能段条件判断语句下面的程序段实现了在满足一定条件下的加法运算CMP R0, #0CMPNE R1, #1ADDEQ R2, R3, R4;判断 R0 是否等于0;如果 R0 不等于 0,判断 R1 是否等于;R0=0 或 R1=1 时, R2=R3+R41循环语句下面的代码段实现了程序的循环执行MOV R0, #loopcount; 初始化循环次数loopSUBS R0, R0, #1BNE loop;循环计数器减1,同时设置条件标志位;如果

25、循环计数器不为0,跳转到 loop; 如果循环计数器为0,则结束循环处继续执行简单的数据块复制下面的代码段实现简单的数据块复制.程序一次将48 个字数据从R12 作为首地址的一段连续的内存单元复制到 R13 作为首地址的一段连续的内存单元代码执行前R12 为源数据区首地址, R13 为目标数据区首地址,R14 为源数据区末地址loopLDMIAR12!, R0-R11;从源数据区读取 48 个字STMIAR13!, R0-R11;将 48 个字保存到目标数据区CMP R12, R14;是否到达源数据结尾BLO loop;没有到达则继续复制链表操作下面的代码段在链表中搜索与某一数据相等的元素.链

26、表的每个元素包括两个字,第 1 个字包含 1 个字节的数据 ; 第 2 个字是指向下一个链表元素的指针.当这个指针为0 时表示链表结束代码执行前 R0 指向链表的头元素,R1 中存放要搜索的数据;代码执行后R0 指向第1 个匹配的元素,或者当没有匹配元素时,R0为 0llsearchCMP R0, 0;R0 指针是否指向链表尾部LDRNEB R2, R0; 读取当前链表元素中的字节数据CMPNE R1, R2;判断当前元素是否为需要搜索的数据LDRNE R0, R0, #4;如果不是,指针R0 指向下一个元素BNE llsearch;如果下一个元素存在,跳转到llsearch 处执行MOV P

27、C, LR;搜索完成,程序返回简单的串比较下面的代码段实现比较两个串的大小代码执行前,R0 指向第 1 个串, R1 指向第 2 个串代码执行后 R0 中保存比较结果,如果两个串相同,R0 为 0;如果第1 个串大于第 2个串, R00;如果第 1 个串小于第2 个串, R00strcmpLDRBR2, R0, #1;从第 1 个串读取字节数据到R2 中LDRBR3, R1, #1;从第 2 个串读取字节数据到R3 中CMP R2, #0;判断第 1 个串是否已经搜索完了CMPNE R3, #0;判断第2 个串是否已经搜索完了BEQ return; 如果任一个串搜索完了,跳转到returnCM

28、P R2, R3; 如果两个串均未搜索完,比较两个串中的对应元素BEQ strcmp;如果两个元素相等,继续比较后面的元素returnSUB R0, R2, R3;判断两个串的大小关系MOV PC, LR;程序返回多路跳转下面的代码段通过函数地址表实现多路跳转其中, maxindex 为跳转的最大索引号, R0 跳转的索引号CMP R0, #maxindexLDRLO PC, PC, R0, LSL #2B IndexOutOfRangeDCD Handler0DCD Handler1; 判断索引号是否超过了最大索引号; 如果没有超过,跳转到相应的程序处;如果超过,跳转到错误程序处理处;子程序

29、 0 的地址;子程序 1 的地址DCD Handler2;子程序 2 的地址4.7.2与系统相关的指令功能段SWI 中断处理程序示例SWI 指令使处理器切换到管理模式,在管理模式下请求特定的系统服务(这些系统服务通常由操作系统提供)当 SWI 指令执行时通常完成下面的操作指令的下一条指令的地址;将返回地址赋给管理模式中的R14 寄存器SPSR_svc=CPSR;保存当前 CPSRCPSR4:0=0b10011;使处理器切换到管理模式CPSR5=0;使程序进入 ARM 状态CPSR7=1;禁止正常的中断响应ifhigh vectors configuredthen;程序跳转到相应的中断向量处PC

30、=0xFFFF0008;使用高端向量elsePC=0x00000008;使用正常向量下面的代码段是 SWI 中断处理程序的基本框架SWI 中断向量存放在内存单元0x00000008 处通常在该地址处放一条跳转指令其目标地址为下面代码段的首地址在下面的代码段中,程序保存了相关的寄存器,接着提取SWI 指令中的立即数,以确定SWI 指令中的立即数,以确定 SWI 指令请求的具体服务对于ARM 状态和 Thumb 状态分别得到 24 位和 8 位立即数根据得到的立即数程序跳转到相应的代码处执行在下面的代码段中,仅仅保存了寄存器R0-R3, R12 和 LR(R14) 如果实际代码还用到了其它的寄存器

31、,可以修改代码中的寄存器列表,也可以在各个具体的服务程序中保存各自用到的寄存器SWIHandlerSTMFDsp!, r0-r3, r12, lr;保存相关的寄存器MRS r0, spsr; 将 SPSR 内容传送到R0 中TST r0, #0x20; 判断程序状态是否为ARM状态LDRNEr0, lr, # -2; 如果是 Thumb 状态,提取指令中的8 位立即数BICNE r0, r0, #0xff00LDREQr0, lr, # -4; 如果是 ARM 状态,提取指令中的24 位立即数BICEQ r0, r0, #0xff000000CMP r0, #MaxSWI;判断请求的服务的序号

32、是否超过合法的范围LDRLSpc, pc, r0, LSL #2;如果没有超出合法范围,跳转到相应的服务程序执行B SWIOutOfRange;如果超出了合法范围,跳转到错误处理程序Switable; 下面是各服务程序的地址表DCD do_swi_0;立即数为0 时,对应的服务程序的入口地址DCD do_swi_1; 立即数为1 时,对应的服务程序的入口地址do_swi_0;服务程序 do_swi_0 的代码LDMsp!, r0-r3, r12, pcdo_swi_1; 服务程序 do_swi_1的代码(2)IRQ 中断处理程序示例在 ARM 中,外部中断管理器或外设通过使能ARM 处理器 中

33、的 IRQ 输入引脚产生 IRQ 异常中断 CSPR 寄存器中的 I控制位设置为 1 时禁止 ARM 处理器响应 IRQ 中断请求,CPSR 寄存器中的 I 控制位设置为0时ARM处理器在指令边界处检查是否有 IRQ 中断请求ARM 处理器响应 IRQ 中断请求时,完成以下工作R14_irqPC;保存当前 PC 值SPSR_irq=CPSR;保存 CPSRCPSR4:0=0b100010;将处理器模式切换到IRQ 模式CPSR5=0;进入 ARM 状态CPSR7=1;禁止常规中断ifhigh vectors configured then;跳转到 IRQ 异常中断的中断向量PC=0xFFFF0

34、018;使用高端向量elsePC=0x00000018;使用正常向量下面的代码段是 IRQ 中断处理程序的基本框架通常,IRQ 中断向量存放在内存单元0x00000018 处通常在该地址处放一条跳转指令,其目标地址为下面代码段的首地址外围中断管理硬件将所有的IRQ 异常中断请求按优先级排队,并把优先级最高的IRQ 异常中断的相关信息保存到寄存器中IRQ 中断处理程序读取这些信息,并跳转到相应的代码处执行;保存工作寄存器,返回地址和当前程序现场SUB r14, r14, #4; 调整 R14 值,使其指向发生IRQ 中断的指令的下一条指令STMFDr13!, r12, r14;保存返回地址和相关

35、的寄存器,r13 为栈指针MRS r12, SPSR;保存 SPSRSTMFDr13!, r12MOV r12, #IntBase;读取中断控制器的基地址LDRr12, r12, #IntLevel;读取优先级最高的中断号MRS r14, CPSR;读取 CPSRBICr14, r14, #0x80;清除中断禁止位MSR CPSR_c, r14;将 R14 的值写入 CPSR LDR PC, PC, r12, LSL #2;跳转到当前 IRQ 对应的中断处理程序NOP;插入该指令是为了实现正确跳转DCD Priority0Handler; Priority0Handler的地址DCD Prio

36、rity1Handler; Priority1Handler的地址Priority0Handler; Priority0Handler的程序体STMFD r13!, r0-r11;保存工作寄存器组MRS r12, CPSR; 修改 CPSR 的相关位,禁止响应中断ORR r12, r12, #0x80MSR CPSR_c, r12LDMFDr13!, r0-r12;恢复工作寄存器组和 SPSR MSR SPSR_cxsf, r12LDMFDr13!, r12, PC; 恢复所有寄存器组并返回Priority1Handler; Priority1Handler的程序体(3)进程切换进程是操作系统

37、中任务调度的基本单位.每个进程由一个控制块 PCB 来表示进程间切换就是通过某种方式保存当前进程的 PCB,加载新进程的PCB 到处理器中这里介绍的仅仅是一个简单的演示性的例子,通过下面的约定使这个例子简单并且清晰一些这里讨论的是用户模式下的进程间的切换切换过程是通过 IRQ 中断处理程序完成的 .比如在进程1 执行到特 定时机时 ,希望切换到进程2.这时系统产生IRQ 中断, 首先执行常规的中断处理操作,然后判断是返回被中断的进程 1,还是切换到新的进程2 执行这里仅仅讨论用户模式下进程间的切换如果在特权模式下发生了 IRQ 中断,中断处理程序一定要回到被中断的进 程这里假设IRQ 中断处理

38、程序仅仅保存寄存器R0-R3 ,R12 和 R14;使用R13 作为栈指针;栈的类型为FD 型在中断处理程序中始终禁止中断,也不进行处理器模式的切换这里假设进程控制块格式为从低地址到高地址依次为下列寄存器:CPSR,返回地址, R0-R14下面分三部分介绍进程切换的过程在进入 IRQ 中断处理程序时,首先计算返回地址,并保存相关的寄存器SUB r14, r14, #4;使 r14 指向发生中断的指令的下一条指令STMFD R13!, R0-R3, R12, R14;保存 R0-R3 ,R12 和 R14如果 IRQ 中断处理程序返回到被中断的进程,则执行下面的指令该指令从数据栈中恢复寄存器 R

39、0-R3 及 R12 的值,将返回地址传送到PC 中,并将 SPSR_irq 值复制到 CPSR 中LDMFDR13!, R0-R3, R12, PC如果 IRQ 切换到新的进程,则要保存被中断的进程的PCB,然后加载新进程的 PCB 到处理器中;保存被中断的进程的 PCB,该 PCB 存放在 R0 所指向的连续的内存单元MRS R12, SPSR;读取被中断的进程的CPSRSTR R12, R0, #8;将其保存到R0 指向的内存单元,并更新R0 值;R0=R0+8LDMFDR13!, R2, R3;读取被中断进程的R0和 R1STMIAR0!, R2, R3;将其保存到R0 指向的内存单元

40、,并更新R0 的值LDMFDR13!, R2, R3, R12, R14;读取栈中的其它数据STR R14, R0, #-12;将返回地址值 R14 保存在 PCB 中的第 2 个字单元,即 CPSR 之后STMIAR0, R2-R14;保存其它所有的寄存器;将新进程的 PCB 中的内容加载到处理器中,其中R1 指向新进程的 PCBLDMIAR1!, R12, R14;恢复 CPSR 及 R14MSR SPSR_fxsc, R12LDMIAR1, R0-R14;恢复 R0-R14NOP;因为在用户模式下的LDM指令后不能立即操作备份寄存器,故插入本指令MOVS PC, R14;切换到新进程执第

41、五章 伪操作5.1伪操作概述5.2符号定义伪操作5.3数据定义伪操作5.4伪指令5.5用于程序说明的伪操作5.6程序设计实例5.1伪操作概述ARM 汇编语言源程序中语句由指令和伪操作组成指令在程序运行期间由机器执行而伪操作是在编译期间由汇编程序进行处理伪操作的作用主要有:符号定义,数据定义,汇编控制,框架描述,信息报告等5.2 符号定义伪操作GBLA, GBLL 和 GBLSGBLA Var1;声明一个全局算术变量并将其初始化为0GBLL Var2;声明一个全局逻辑变量并将其初始化为FALSEGBLS Var3;声明一个全局字符串变量并将其初始化为空串LCLA,LCLL 和 LCLSLCLA Var1;声明一个局部算术变量并将其初始化为0LCLL Var2;声明一个局部逻辑变量并将其初始化为FALSELCLS Var3;声明一个局部字符串变量并将其初始化为空串SETA, SETL 及 SETSSETA 给一个算术变量赋值GBLA Var1Var1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论