cortex-A7基于ARMV7-A架构,复习一下armv7
ARM-V7的模式类型如下:
FIQ快速中断和IRQ外部中断的区别:当一个高优先级中断产生时将会进入FIQ,一般用于高速数据传输和通道处理。当一个低优先级中断产生将会进入IRQ,一般用于通常的中断处理 处理器模式可以通过软件控制进行切换,也可以通过外部中断或异常处理过程进行切换。大多数用户程序运行在用户模式下。当处理器工作在用户模式时,应用程序不能访问受操作系统保护的一些系统资源,应用程序也不能直接进行处理器模式切换。当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理过程中进行处理器模式切换。这种体系结构可以使操作系统控制整个系统资源的使用。Cortex-A7处理器寄存器组:
1、在寄存器组中,每个方块都是一个寄存器,每个寄存器都是32位的 2、寄存器没有地址,访问寄存器通过编号进行访问,r0-r15,cpsr,spsr(spsr是cpsr的影子寄存器) 3、banked类型的寄存器属于该模式下私有的寄存器,而非banked类型的寄存器属于公有寄存器组 4、user模式和system模式最多可以访问17个寄存器,HYP模式最多可以访问19个寄存器,其他模式可访问18个寄存器 5、cortex-A7寄存器组中一共只有43个寄存器,因此开发中尽量不要定义register类型的变量 6、通用寄存器可分为两类: 未分组寄存器,包括R0-R7。 分组寄存器,包括R8-R12。栈指针寄存器R13
R13寄存器在ARM处理器中常用为栈指针,称为SP。 每一种异常模式拥有自己的R13。异常处理程序负责初始化自己的R13,使其指向该异常模式专用的栈地址。在异常处理程序入口处,将用到的其他寄存器的值保存在堆栈中,返回时,重新将这些值加载到寄存器。通过这种保护程序现场的方法,异常不会破坏被其中断的程序现场 SP栈指针寄存器存放的是栈指针指向的栈空间的地址。此栈是用来压栈保护现场的,特点是先进后出 满减栈如图所示: 代码分析: 给每一个模式都设置对应的栈空间init_stack: ldr r0,stacktop /*get stack top pointer,stacktop是一个地址*/ /********svc mode stack********/ mov sp,r0 sub r0,#128*4 /*512 byte for irq mode of stack*/ /****irq mode stack**/ msr cpsr,#0xd2 /*切换至IRQ模式*/ mov sp,r0 sub r0,#128*4 /*512 byte for irq mode of stack*/ /***fiq mode stack***/ msr cpsr,#0xd1 mov sp,r0 sub r0,#0 /***abort mode stack***/ msr cpsr,#0xd7 mov sp,r0 sub r0,#0 /***undefine mode stack***/ msr cpsr,#0xdb mov sp,r0 sub r0,#0 /*** sys mode and usr mode stack ***/ msr cpsr,#0x10 mov sp,r0 /*1024 byte for user mode of stack*/测试栈:
/****irq mode stack**/ msr cpsr,#0xd2 /*切换至IRQ模式*/ mov sp,r0 sub r0,#128*4 /*512 byte for irq mode of stack*/ mov r5, #0x11 /*0x11赋给r5*/ mov r6, #0x23 /*0x23赋给r6*/ stmfd sp!, {r5, r6} /*r5,r6入栈*/ ldmfd sp!, {r7, r8} /*出栈值给到r7, r8*/监控寄存器的值和栈指针的变化:
寄存器 | 执行完第四行 | 执行完第五行 | 执行完第六行 | 执行完第七行 | 执行完第八行 |
r5 | 0 | 0x11 | 0x11 | 0x11 | 0x11 |
r6 | 259635441 | 259635441 | 0x23 | 0x23 | 0x23 |
r7 | 1667 | 1667 | 1667 | 1667 | 0x11 |
r8 | 384526877 | 384526877 | 384526877 | 384526877 | 0x23 |
sp | 0xc200844 | 0xc200844 | 0xc200844 | 0xc20083c | 0xc200844 |
连接寄存器R14:
寄存器R14又被称为连接寄存器(Link Register,LR),可以被用作通用寄存器使用。在ARM体系结构中具有下面两种特殊的作用。每一种处理器模式用自己的R14存放当前子程序的返回地址,比如中断异常处理模式。当通过BL或BLX指令调用子程序时,R14被设置为该子程序的返回地址。在子程序返回时,把R14的值复制给程序计数器PC,典型的用法如下: 使用方法一: mov pc,lr bx lr 使用方法二: 在子程序入口处使用下面的指令将PC保存到栈中。 stmfd sp!, {,lr} 在子程序返回时,使用以下相应的配套指令返回: ldmfd sp!, {,pc} 当异常中断发生时,该异常模式特定的物理寄存器R14被设置为该异常模式的返回地址。
程序计数寄存器R15:
R15又被称为PC程序计数寄存器。PC寄存器中存储的是当前取值的指令的地址,当完成取值操作之后,PC中的值会自动加4指向下一条指令程序状态寄存器CPSR:
所有的处理器模式都共用一个 CPSR 物理寄存器,因此 CPSR 可以在任何模式下被访问。CPSR 是当前程序状态寄存器,该寄存器包含了条件标志位、中断禁止位、当前处理器模式标志 等一些状态位以及一些控制位。所有的处理器模式都共用一个 CPSR 必然会导致冲突,为此,除了 User 和 Sys 这两个模式以外,其他 7 个模式每个都配备了一个专用的物理状态寄存器,叫 做 SPSR(备份程序状态寄存器),当特定的异常中断发生时,SPSR 寄存器用来保存当前程序状态寄存器(CPSR)的值,当异常退出以后可以用 SPSR 中保存的值来恢复 CPSR。 因为 User 和 Sys 这两个模式不是异常模式,所以并没有配备 SPSR,因此不能在 User 和Sys 模式下访问 SPSR,会导致不可预知的结果。由于 SPSR 是 CPSR 的备份,因此 SPSR 和CPSR 的寄存器结构相同, CPSR寄存器包含下列内容:- ALU(逻辑运算单元)状态标志
- 当前处理器模式
- 中断使能标志
- 设置处理器的状态
标签:sp,r0,V7,模式,stack,mode,寄存器,架构,ARM From: https://www.cnblogs.com/lethe1203/p/18077266