程序员是不是都是做网站的,行业门户网站方案,制作网站哪家好,wordpress rss采集一、处理器的工作模式Cortex-M核的工作模式#xff1a;异常模式 线程模式Cortex-A核的工作模式#xff1a;ARM-v7架构设计的A核的工作模式#xff1a;非特权模式#xff1a; User(用户模式)特权模式#xff1a; 1.非异常模式#xff1a;Sys2.异常模式IRQ模式…一、处理器的工作模式
Cortex-M核的工作模式异常模式 线程模式Cortex-A核的工作模式ARM-v7架构设计的A核的工作模式非特权模式 User(用户模式)特权模式 1.非异常模式Sys2.异常模式IRQ模式普通中断模式FIQ模式快速中断模式SVC模式超级管理员模式ABT模式中止访问模式UDF模式未定义异常模式ARM-v8架构设计的A核的工作模式在v7架构的基础上多以下两个工作模式MON电源管理模式HYP虚拟化技术模式1、异常源 异常源是指触发处理器执行异常事件对应的处理逻辑的源头异常源是异常事件的集合异常源下支持很多异常事件异常模式异常源异常源下的异常事件IRQ模式一系列触发处理器进入IRQ模式的异常源普通中断定时器中断FIQ模式一系列触发处理器进入FIQ模式的异常源内核中断高优先级中断SVC模式复位异常源上电复位按键复位软中断异常源swi执行软中断指令ABT模式数据终止访问异常源非法访问或使用没有权限的数据段错误指令终止访问异常源汇编指令格式错误、汇编指令访问没有权限的空间UDF模式未定义异常源指令/变量未被定义过
1、5种异常模式对应七种异常源
2、每种异常源下存在很多的异常事件
3、SVC模式下的复位异常源的优先级等级最高处理器优先处理2、异常向量表
异常向量表就是异常源的集合
当产生异常事件后处理器会检测当前这个异常事件属于哪个异常源
此时处理器会根据异常源去异常向量表中对应的地址,查找对应的异常源中对应的异常事件注意1、处理器只会根据异常向量表中固定的地址查找异常源异常源地址是不能随意变化的2、异常向量表共占内存空间32字节每个异常源占用4字节存放异常源地址保留了4字节作为预留空间
为什么需要引入异常向量表
由于异常触发后最终需要执行异常处理函数
而对于函数而言当开发板/系统上电复位后函数的地址、参数的地址、变量的地址可能都会发生改变
对于CPU而言他无法知道变化后的地址
此时就需要固定一片内存空间地址用于引导CPU找到最后的异常处理函数
所以ARM公司开发并生产内核时固定了一片32个字节的地址空间
专门用于存放各个异常源的地址他就是异常向量表二、异常处理流程1、自动保存现场CPU自动完成
自动保存现场需要做四件事
1、将CPSR寄存器内的值保存到SPSR_MODE寄存器中
2、修改CPSR寄存器中的位1.修改CPSR寄存器中的I位和F位选择是否屏蔽IRQ模式和FIQ模式2.修改CPSR寄存器中的T位选择使用ARM汇编指令集/Thumb汇编指令集3.修改CPSR寄存器中的M位选择需要进入的异常模式
3、将函数返回地址保存到LR链接寄存器中
4、将PC计数寄存器指向异常向量表2、手动返回现场程序员手动完成
1、将SPSR_MODE寄存器中的值赋值给CPSR寄存器
2、将LR链接寄存器中的值赋值给PC计数寄存器3、ARM汇编代码模拟异常事件处理流程
.text
.global _start _start: 构建异常向量表b reset_handlerb undefined_handlerb swi_handlerb prefetch_handlerb data_handlerb . 占4个字节空间操作b irq_handlerb fiq_handlerreset_handler: 为SVC模式下的SP寄存器给定一个内存空间地址ldr sp, 0x40000820 从SVC模式切换到User模式下执行用户代码msr cpsr, #0xD0 用户代码以下相当于main函数mov r0, #0x1mov r1, #0x2 软中断异常事件触发 swi 2这条汇编指令执行完毕后需要看到的效果 1、CPSR寄存器中的值是否被保存到SPSR寄存器中 2、CPSR寄存器中的值是否被改变IFTM位 3、LR寄存器中是否保存函数的返回地址 4、PC是否指向异常向量表中软中断异常源的地址swi 2add r2, r1, r0undefined_handler:swi_handler: 压栈保存现场保存局部变量和函数返回地址stmfd sp!, {r0-r1, lr} 软中断异常源下第一个异常事件的处理函数mov r0, #0xffmov r1, #0xeeadd r2, r1, r0 出栈恢复现场恢复局部变量和函数返回地址 还需要恢复SPSR寄存器中的值给到CPSR寄存器 ^的作用用于将SPSR寄存器中的值赋值给CPSR寄存器ldmfd sp!, {r0-r1, pc}^prefetch_handler:data_handler:irq_handler:fiq_handler:stop: b stop
.end 三、分析芯片手册EXTI
NVIC嵌套向量中断控制器
EXTI外部中断和事件控制器嵌套中断的嵌套指的是中断具备优先级等级高优先级等级的中断信号可以打断低优先级的中断信号向量所有异常中断都由异常向量表统一管理在Cortex-M核中中断处理一般使用 EXTI 和 NVIC 这两个寄存器实现
在Cortex-A核中中断处理一般使用 EXTI 和 GIC(GICCCPID) 这两个寄存器实现1、外部中断章节介绍EXTI1输入事件编号2EXTI的主要特点3EXTI框图分析
4寄存器功能分析
中断挂起是指中断信号到达等待被处理需要执行这个中断信号对应的逻辑代码
中断挂起标志位是表示当前中断信号到达等待处理的标志位
中断就是判断中断标志位是否被挂起挂起后执行中断信号对应的异常事件处理代码5GPIO端口选择6寄存器分析2、EXTI_FTSR1寄存器配置下降沿触发3、EXTI_FPR1寄存器下降沿触发标志位当我们检测按键是否按下时也就是检测中断是否被挂起也就是读取这个寄存器对应位是否为1
读取到1就代表中断被挂起可以执行处理逻辑
读到到0就代表中断没有被挂起不需要执行处理逻辑当我们读取到中断被挂起后为了让中断不一直处于被挂起状态需要人为手动解除中断的挂起4、EXTI_EXTICRm寄存器