CORTEX-M4知识点总结_第1页
CORTEX-M4知识点总结_第2页
CORTEX-M4知识点总结_第3页
CORTEX-M4知识点总结_第4页
CORTEX-M4知识点总结_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、Cortex-M4内核知识点总结目录Cortex-M4内核知识点总结C1 ARM处理器简介4.2架构5.1.1 架构简介5.1.2 编程模型5.1.3 存储器系统8.1.4 复位和复位流程 123指令集143.1 CM4指令集特点1.43.2 Cortex-M处理器间的指令集比拟 1.43.3 汇编指令简要介绍1.43.3.1 处理器内传送数据 1.43.3.2 存储器访问指令 1.53.3.3 算数运算163.3.4 逻辑运算173.3.5 移位1.73.3.6 异常相关指令1.74存储器系统1.84.1 存储器外设184.2 Bootloader1.84.3 位段操作 1.94.4 存储器

2、大小端 195异常和中断215.1 中断简介215.2 异常类型215.3 中断治理225.4 异常或中断屏蔽存放器235.4.2 FAULMASK M0 中无235.4.3 BASEPR【M0 中无235.5 中断状态及中断行为 235.5.2 中断状态 235.5.3 中断行为245.6 各Cortex-M处理器NVIC差异 266异常处理286.1 C实现的异常处理286.2 栈帧286.3 EXC_RETURN29.6.4 异常流程 306.4.1 异常进入和压栈 .306.4.2 异常返回和出栈.317低功耗和系统限制特性327.1 低功耗模式327.2 SysTickt 时器.32

3、8 OS支持特性348.1 OS支持特性简介348.2 SVCf口 PendSV.348.3 实际的上下文切换 .351 ARM处理器简介ARM处理器的种类很多,从 上的高端处理器芯片到面向微限制器的芯 片,都有ARM的身影.2021年基于ARM处理器的芯片的出货量已经到达 79亿. 这一章首先对ARM处理器有个简单的了解.在早期的时候,ARM处理器使用后缀说明特性.例如 ARM7TDMI, T表示支 持Thumb指令,D表示JTAG M表示快速乘法器,I那么表示嵌入式ICE模块.近几年,ARM改变处理器的命名方式,统一使用了 Cortex处理器的名称. Cortex处理器下分为三类: Cor

4、tex-A系列:需要处理高端嵌入式系统等复杂应用的应用处理器 Cortex-R系列:实时、高性能的处理器,面向较高端的实时市场 Cortex-M系列:面向微限制器和混合信号设计等小型应用,注重低本钱、 低功耗.不同系列的处理器使用不同版本的架构Cortex-A 系歹!JARMv7-A 架构Cortex-R系歹!JARMv7-R 架构Cortex-M 系歹!JARMv7-M、ARMv6-M在Cortex-M系列中,进一步都处理器进行了划分处理器功能架构Cortex-M0、Cortex-M0+低功耗ARMv6-MCortex-M1FPGAARMv6-MCortex-M3微限制器ARMv7-MCor

5、tex-M4增力口 DSPARMv7E-M2架构2.1 架构简介Cortex-M3和Cortex-M4处理器都是基于 ARMv7-M架构.最初ARMv-7M 架构是随着Cortex-M3处理器一同引进的,而在 Cortex-M4发布时,架构中 又额外增加了新的指令和特性,改良后的架构有时也被称为ARMv7E-Mo2.2 编程模型2.2.1 操作模式和状态Cortex-M4处理器包括两种操作状态和模式,还有两种访问等级.1 .操作状态调试状态:处理器被暂停后,就会进入调试状态,比方利用调试器触 发断点,单步执行等.- Thumb状态:处理器执行程序代码,它就是处在 Thumb状态,由于 Cort

6、ex-M4用的是Thumb指令,所以称为Thumb状态,并且在Cortex-M 处理器中已经不支持 ARM指令,也就不存在ARM状态.2 .操作模式处理模式:执行中断效劳程序等异常处理. 在处理模式下,处理器总 是具有特权访问等级.线程模式:执行普通的程序代码.3 .访问等级特权访问等级:可以访问处理器中的所有资源.非特权访问等级:有些存储器区域无法访问,有些操作也无法使用.启动异常请求线程模式特权等级Thumb状态处理模式执猾牖处理执行异常处理软件转"换异常请求线程模式非特权等级调试事件解除调试调试状态处理器停止 指令执行访问等级有特殊存放器CONTRO限制.软件可将处理器从特权访

7、问等级转 换至非特权访问等级,但反之无法直接转换,需要借助异常机制.处理器的操作模式和状态可由图1.1来表示,在上电后,默认处于特权线程 模式下的Thumb状态.2.2.2 存放器对于ARM架构来讲,处理存储器中的数据时,需将其从存储器加载到存放 器中,处理完毕后,假设有必要,还可以再写回存储器.这种方式被称作“加载 - 存储架构"(LOAD-STORE)Cortex-M4处理器的存放器组中有16个存放器,其中包括13个通用存放器 和3个有特殊用途的存放器.1通用存放器R0-R12R0-R7被称作低存放器,许多16位指令只能访问低存放器.R8-R12称作高寄 存器,可用32位指令和几

8、个16位指令访问.R0-R12初始值未定义.2栈指针R13R13为栈指针,可通过PUSH和POP操作实现栈存储的访问.栈指针包括两 个:主栈指针MSP和进程栈指针PSP MSP为默认指针,复位后或处理模式时 只能是MSP,而PSP只能在线程模式使用.栈指针的选择有 CONTROL?存器控 制.MSP和PSP勺最低两位必须是0,也就是栈指针的地址操作必须4字节对齐3链接存放器(LR R14用于函数或子程序调用时返回地址的保存,在异常中那么用来保存进异常前状 态信息,包括系统模式、栈指针模式等.异常返回时参考LR中的信息返回到相应状态.4程序计数器P.R15R15为程序计数器,读操作返回当前地址加

9、 4,写操作引起跳转.2.2.3 特殊存放器特殊存放器有三类:程序状态存放器、中断/异常屏蔽存放器、处理器限制 存放器.1程序状态存放器:应用PSRAPSR、执行PSREPSR、中断PSRIPSR. 三个存放器可以单独访问,也可以组合到一个存放器中访问.31262320161080N Z C V Q| ICI/IT TGE0-3ICI/ITISR NUM在APS"包含N 负标志、Z 零标志、C 进位标志、V 溢出标志、 Q 饱和标志和GE 大于或等于标志,只在 M4中有.IPSR中是中断号,只读.EPSFfr, T为表示Thumb状态,由于M4支持Thumb状态,不支持ARM状 态,

10、T位始终为1.ICI是中断继续指令位,保存的是中断被打断时的信息.IT指 令时IF-THEN旨令,用于条件执行.2 PRIMASK FAULTMASK和BASEPRff存器:这三个存放器只能在特权模 式下使用.PRIMASKM屏蔽除NMI和HardFault之外的所有异常.FAULTMASBE 可屏蔽HardFault.BASEPRff以根据设置屏蔽低优先级的中断, 可限制8个或16 个中断,相应的改存放器的宽度为 3位或4位.3 CONTROL?存器CONTROL?存器主要有以下几项作用: 线程模式下的访问等级 指针的选择 当前代码是否使用了浮点单元分别对应了存放器的低三位位功能nPRIV第

11、 0 位0对应特权等级,1为非特权等级SPSE L第 1 位0对应主栈指针,1为进程栈指针,处理模式下始终为 00FPCA第2位0未使用浮点,1使用了浮点2.2.4浮点存放器1 S0-S31 和 D0-D15S0-S31都为32位存放器,也可以D0-D15的方式成对访问,但M4不支持双 精度浮点运算,只是可以传输双精度数据.2浮点状态和限制存放器FPSCRFPSC陋个功能 提供浮点运算结果的状态信息,如负标志、进位标志等. 定义一些浮点运算动作,如何舍入等3经过存储器映射的浮点单元限制存放器CPACR该存放器经过了映射,也就是说需要通过通用存放器加载进行设置,存放器 的功能是可以设置浮点单元的

12、访问权限,拒绝访问、特权访问,全访问.2.3存储器系统2.3.1 存储器系统特性 4GB线性地址空间 架构定义的存储器映射.4GB的存储器空间被划分为多个区域,用于 预定义的存储器和外设. 支持大端和小端的存储器系统. 位段访问. 写缓冲 存储器保护单元MPU 非对齐传输支持2.3.2 存储器映射CORTEX-Mt理器的4GB地址空间被分为了多个存储器区域,如下图.区 域根据各自典型用法进行划分,他们主要用于:程序代码访问如CODES域数据访问如SRAM区域外设如外设区域某款芯片的存储器映射分配系统0.5GB外部设备1GB外部RAM 1GB外设0.5GBSRAM 0.5GBCODE 0.5GB

13、0xFFFF_FFFFReserved0xF000_00000xE000_0000Private Peripheral BusReservedAPBBRG device0x5000_00000x4010 0000FLASH CTRL32KBy0x4000_0000DMAReserved0x3000_00000x2000_0000_SRAM8KBytesReserved0x60 0000FLASH MEMORY0x0000_0000128K+4K FLASH1PWM register0x50F0_00000x50D0_00000x50C0_00000x50B0_00000x5090_00000x

14、5073_00000x5072_00000x5071_00000x5070_00000x5062_00000x5061_00000x5060_00000x5050_00000x5040_00000x5030_00000x5023_00000x5022_00000x5021_00000x5020_00000x5011_00000x5010_00000x5000_0000GPIO registerAnalog control (ADC/TP/AnalogReg/1k sram)IO control7816 registerSPI3 registerSPI2 registerSPI1 registe

15、rSPI0 registerTimer_2 registerTimer_1 registerTimer_0 registerWDT registerRTC registerCRC registerUART3 registerUART2 registerUART1 registerUART0 registerI2C_1 registerI2C_0 registerSCU (clock ResetPmu calendar)一般Code放在Flash当中,数据放在RAM中.数据在RAM存放有一定的顺 序,可以分为数据段,BSSgh堆和栈区域.数据段,存储在内存的底部,包含初始化的全局变量和静态变量.

16、 BSS®,未初始化的数据. 堆,C函数自动分配存储器区域,例如 alloc ()和malloc (). 栈,用于临时数据存储,局部变量,函数调用存储器栈(向下增长)BS以数据段0x200000002.3.3栈存储同几乎所有的处理器架构一样,Cortex-M处理器在运行时需要栈存储和栈指 针R1& ARM处理器将系统主存储器用于栈空间操作,使用 PUSH指令往栈中存 储数据以及POP指令从栈中提取数据.处理器启动后,SPPUSH时,SP指针首先减SP所指的数据出栈,然处理器使用的是满递减的模型,栈指针是向下增长的 被设置为栈存储空间的最后的位置,也就是最低位置, 小,然后将数

17、据压入栈中.POP的时候相反,先将当前 后再修改SP, SP此时增大.可用下面两幅图加以理解,pusHM乍POP®作存放器0x12345678栈中主要用于: 存储局部变量 异常产生时保存处理器状态(LR xPSR和存放器数值 函数调用时2.4复位和复位流程对于典型的Cortex-M处理器,复位类型有三种: 上电复位.复位微限制器中所有局部. 系统复位.只会复位处理器和外设,不包括处理的调试支持部件 处理器复位.只复位处理器.在复位后以及处理器开始执行程序前,处理器会从存储器中读出头两个字节 第一个字表示主栈指针的初始值.第二个字代表复位处理起始地址的复位向量.处理器读出这两个自己后,

18、就会将这些数值赋给 MSP和PC取MSP®始值取复位向县 里取第一条指令读地址 读地址读取复位向量0x00000000 0x00000004表示的地址时间之前在栈存储时讲到过,Cortex-M处理器的栈操作时基于满递减的,所以 S P的初始值应该设置在栈顶的位置.例如,假设存储器区域为 0x20007c0000x200 07FFF (1KB),初始的栈指针就应该为 0x20008000.另外,对于Cortex-M处理器,向量表中向量地址的最低位应该为 1,以代表 他们为Thumb状态.对于下列图中的例子,复位向量为 0x101,而启动代码是从0x100开始的.在取出复位向量后.Cor

19、tex-M处理器就可以从复位向量地址处执 行程序,并开始正常操作.其他存储器0X20008000SPM始值1 ,0X20007FFC第一个压栈顶0X20007FF8第二个压栈顶0X20000000SRA那么始地址-启动代码0X00000100复其他异常向量位 向量0X000000040X000001010X000000000X200080003指令集CORTEX-M较用白是Thumb-2指令集,不支持ARM指令集,Thumb指令集 是ARM指令集的子集,但是Thumb-2技术已经不再支持ARM状态.CORTEX-Mt理器间的一个区别就是指令集特性.为了将回路面积降到最低,CORTEXM0 CO

20、RTEXM0+CORTEXM处理器只支持多数16位指令和局部32位 指令,CORTEX-M共持的32位指令更多.CORTEXt理器支持剩下的 SIMD 单 指令多数据等DSP®升指令集可选的浮点指令.3.1 CM4指令集特点CM4处理器使用 ARMv7-M架构,指令集为 Thumb指令集中的Thumb-2技 术,具有如下特点 16位与32位混合指令 加载/存储指令集,不能直接操作存储器. 指令长度可变,使用16/32位由功能决定,优先使用16位. DSP指令,CM4中为单精度,CM7中可以双精度3.2 Cortex-M 处理器间的指令集比拟Cortex-M 处理器的架构有三类,ARM

21、v6-M, ARMv7-M, ARMv7E-M.内核性能ARMv6-MM0/M0+/M1一般数据处理,IO限制人物ARMv7-MM3高级数据处理、硬件除法ARMv7E-MM4SIMD、快速MAC饱和运算3.3 汇编指令简要介绍3.3.1 处理器内传送数据MOV <Rn目的存放器> < Rm源存放器>源存放器处可以是立即数,立即数为 8位以下,9-16位用 要使用LDR伪指令.使用浮点单元时可以使用VMOV指令3.3.2 存储器访问指令访问可分为读和写指令,另外根据读写的大小还有其他的延伸数据类型加载读存储写8位无符号LDRBSTRB8位有符号LDRSBSTRB16位无符

22、号LDRHSTRH16位有符号LDRSHSTRH32位LDRSTR多个32位LDMSTM64位LDRDSTRD栈操作PUSHPOP介绍几个较为重要的1 LDR/STRLDR Rd,Rn,#offset从存储器Rn+offset处读取字,读取到 Rd中STR Rd,Rn,#offset向存储器Rn+offset处存储字,数据来自 Rd.LDR R0 R1, #0X08从存储器R1+0X08处读取字,放到 R0中支持写回功能,力口!即可,上面可以写成LDR R0 R1, #0X08!这样表示存储器位置的 R1被更新为R1+0X082 LDM/STM读/写多个字上述命令是为了从存储器中读写多个字.一

23、般会加后缀配合使用LDMIA Rn,<reg list>Rn是存储器位置,reg list是存放器列表,从Rn所指的存储器位置读取数据, 放入存放器中,每次读取完成后,地址就会自动加4.作用相当于POP另外要注意的是,先读取的数据放置在低存放器中,后读取的数据放置到高存放器.LDMIA操作STMIA Rn,<reg list>Rn是存储器位置,reg list是存放器列表,向Rn所指的存储器位置存储数据, 每次存储前,地址自动减4.相当于PUSH操作.另要注意的是,先存储高存放 器的数据,后存储低存放器的数据.STMD啾作同样,这两个指令都可以通过!表示写回操作,更新存

24、放器所指的存储器位3压栈与出栈PUSH/POPPUSH口 POP和上面的LDMIA和STMDB是相同的.3.3.3 算数运算力口: ADC减:SUB乘:MUL除:DIV对此不做详细介绍3.3.4 逻辑运算与:AND或:ORR位去除:BIC按位异或:EOR按位或非:ORN3.3.5 移位算数右移:ASR逻辑左移:LSL逻辑右移:LSR循环右移:ROR3.3.6 异常相关指令之前说过,M4可以有特权模式和非特权模式,并且非特权模式不能直接转 换到特权模式,只能在异常中修改 CONTROLS存器.这里就可以通过 SVC旨令 来进入异常.SVC #<immed>这样就可以进入SVC中断中,

25、然后修改CONTROLS存器.要注意的是,调 用SVC旨令后,需尽快进入中断中,如果有其他高优先级的中断打断了SVC就会弓I起 HardFault.CPS旨令使用时需要带上后缀:IE 中断使能,ID 中断禁止,还需指定要 设置的中断屏蔽存放器,如之前讲到的 PRIMASKffi FAULTMASK指令操作CPSIE I使能中断去除PRIMASKCPSID I禁止中断设置PRIMASK,除NMI和HardFaultCPSIE F使能中断去除FAULTMASKCPSID F禁止中断设置FAULTMASK,除NMI4存储器系统4.1存储器外设哈佛结构,程序存储器和数据存储器分开,也就是指令和数据可以

26、同时访问.1、在第一章中的存储器映射图中,0-0.5G为代码段,主要用于程序代码, 改区域一般也允许数据访问.一般此处为Flash.在keil中,代码编译后,整个代码分为几局部: Code 代码,RO-data 只 读数据,RW-data,初始化的可读写变量大小,ZI-data Zero Initialize未初 始化的可读写变量大小,它会被自动初始化为0.ZI-data不会被算到代码里,由于 它不会被初始化.简单来说呢就是在烧写的时候 FLASHY的被占用的空间为: Code+RO-data+RW-dat a程序运行的时彳g,芯片内部 RAM使用的空间为:RW-data+ZI-data2、0

27、.5G-1G范围内是SRAM,主要用于连接SRAM,其大都为片上 SRAM, 不过对存储器的类型没有什么限制. 假设支持可选的位段特性,那么SRAM区域的第 一个1MB可位寻址,还可以在这块区域中执行程序代码.3、1G-1.5G是外设区域,多用于片上外设,和 SRAM区域类似,也可以放置 程序代码,假设支持可选的位段特性,那么外设区域的第一个1MB是可选的.4、1.5G-2.5G空间为外部RAM空间5、2G-3G空间为设备空间,用于片外外设.6、3G-4G空间为系统空间.4.2 Bootloader芯片设计人员将Bootloader放入系统中的原因是多方面的.例如: 提供Flash编程功能,这

28、样就可以利用一个简单的UART接口来编程Flash,或者当程序运行时,在自己的应用程序中编程Flash存储器的某些局部. 提供通信协议栈等额外的固件,可被软件开发人员通过 API调用. 提供芯片内置的自检功能BIST比方在1601中,提供一个 4K的info区,和128K的main区,4K的info区就 是一个bootloader,提供SPI下载功能,利用拨码开关可以设置从哪里启动, mode=0时从info区启动,mode=1时从main区启动,并且 main区分两局部, 软件可设置从低64K启动还是从高64K启动.这里设计存储器重映射的问题,系 统启动时是从0X00开始的,不管是Boot

29、loader还是用户flash,都得从0x00开 始,然后0x04放的reset_handler的地址,mode=0,那infor区就被映射到了 0x00, mode=1, main区就被映射到了 0x00.4.3 位段操作对存储器中某一位操作是如何实现的呢?先来看看普通模式下,写某一位:LDR R0, =0X200000000 设置地址LDR R1,R0;读数据ORR.W R1,#0X04;修改第 2 位STR R1, R0;写回读某一位:LDR R0, =0X200000000 设置地址LDR R1,R0;读数据UBFX.W R1 R1, #2, #1;提取第 2 位这种操作无法保证原子性

30、,比方输出端口的第0位被主程序使用,而第一位 被中断使用,这样有可能出现数据冲突.位段操作模式下,这种现象可以防止, 由于位段操作是在硬件等级下修改的.位段操作只在两个区域支持,SRAM的第1MB,外设区域的第1MB.每1MB 会对应一个32M的区域,只需操作这32M的某个字,就能对应那1MB区域的 某一位.例如写0x22000008为1,就设置了 0x20000000第3位为1.在指令上 也会更加简化.位段写操作LDR R0, =0X2200000 设置 addMOV R1, #1;要写的数据STR R1 ,R0;写设置了位段操作模式,对应的32MB区域将不能再使用.4.4 存储器大小端大小

31、端指的是数据存储时的顺序问题.大端指的是高字节的数据放在低地址 中,低字节放在高地址中,这种方式符合人类思维.小端那么是低字节放在低地址 中,高字节放在高地址中,这种方式更符合计算机思维.例如将0x12345678放到存储器0x2000-0x2003地址处大端方式地址0x20030x20020x20010x2000数据0x780x560x340x12小端方式地址0x20040x20030x20020x2001数据0x120x340x560x78CM4处理器同时支持小端和大端的存储器系统.CM的微限制器大多是小端 的.5异常和中断5.1 中断简介所有的CORTEX-Mt理器都会提供一个用于中断处

32、理的嵌套向量中断限制 器,也就是NVIC中断也属于异常的一种,其他异常包括如错误异常和其他用 于OS支持的系统异常.M4的NVIC支持最多240个IRQ 中断请求,1个不可屏蔽中断NMI, 1 个SysTick系统节拍定时中断及多个系统异常.异常编号异常类型优先级描述1复位-3复位2NMI-2/、口屏蔽中断3硬件错误-1硬件错误4MemManage 错误可编程存储器治理错误5总线错误可编程总线错误6使用错误可编程程序错误7-10保存11SVC可编程请求治理调用12调试监控可编程调试监控13保存14PendSV可编程一般用于上下文切换15SYSTICK可编程系统节拍定时器16外部中断#0可编程片

33、上外设或外部中断源产生17外部中断#1可编程255外部中断#239可编程除了前3个异常的优先级是固定的,其余异常都可以修改优先级5.2 异常类型编号1-15为系统异常,16及以上的那么为中断输入.5.3 中断治理为了简化中断和异常治理,CMSIS-Cor提供了多个访问函数函数用法Void NVIC_EnableIRQ( IRQn_Type IRQjn使能外部中断Void NVIC_DisableIRQ( IRQn_Type IRQn禁止外部中断Void NVIC_SetPriority(IRQn_Type IRQn,uint32_t priority)设置中断的优先级Void _enable_

34、irq(void)去除PRIMASK®能中断Void _disable_irq(void)设置PRIMASKR止所有中 断Void NVIC_SetPriorityGrouping(uint32_t priorityGroup)设置优先级分组复位后,所有中断都处于禁止状态,且默认的优先级为 00在使用任何一个中断之前需要 设置所需中断的优先级可选 使能外设中的可以触发中断的中断产生限制 使能NVIC中的中断在M4中,中断优先级共8位宽,但芯片厂商可进行设置,范围是 3-8位 中断优先级分为两个局部,分组优先级也叫抢占优先级和子优先级.处理器 首先判断的是分组优先级,分组优先级高的会被

35、首先处理,假设分组优先级相同, 再比拟子优先级.8为宽的优先级如何分配抢占优先级和分组优先级,可由存放 器设置.如下表优先级分组抢占优先级域分组优先级域0 默认Bit7:1Bit01Bit7:2Bit1:02Bit7:3Bit2:03Bit7:4Bit3:04Bit7:5Bit4:05Bit7:6Bit5:06Bit7Bit6:07无Bit7:0这里要注意的是,异常编号和优先级并不是一个意思, 异常编号仅仅是一个 编号,就像是枚举一样,而优先级那么是需要手动的进行设置的. 只有在分组优先 级和子优先级完全一致时,异常编号才起作用,编号越小优先级越高.另外,在M4内核中,还提供了中断向量重定位功

36、能.向量表重定位功能提 供了一个名为向量表偏移存放器VTOR的可编程存放器.前面提到的Bootloder 就可以使用此项功能来完成.5.4 异常或中断屏蔽存放器5.4.1 PRIMASKPRIMASKffl于禁止除NMI和HardFault外的所有异常,只能在特权状态访问 如:CPSIE I去除PRIMASK使能中断CPSID设置PRIMASK 禁止中断5.4.2 FAULMASK M0 中无FAULMASKS于禁止除NMI外的所有异常,只能在特权访问,如:CPSIE F青除 FAULMASKCOSID 段置 FAULMASK5.4.3 BASEPRIM0 中无BASEPR可禁止优先级低于某特

37、定等级的中断,只能在特权状态访问,如:_set_BASEPRI0X60;禁止优先级在0x60-0xFF间的中断_set_BASEPRI0X0;取消 BASEP所蔽5.5 中断状态及中断行为5.5.1 中断状态中断状态:inactive, pending, active, active and pending中断状态之间的转换:Inactive wActiveA Pending vA andPendingInactive 非活泼:没有挂起或激活的状态Pending挂起:异常已经被触发但是处理还未处理.比方当前中断被触发, 但是有高优先级或同等优先级的中断正在执行,或是中断使能被禁止.Active

38、 活泼:中断正在被处理Active and pending 活泼并挂起 异常被处理时,同一个异常再次被触发.上述异常对应的是每一个异常状态,不是整体的异常.5.5.2 中断行为每个中断都有多个属性: 每个中断都可以被禁止或使能 每个中断都可以被挂起或解除挂起 每个中断都可以处于活泼或非活泼状态这样中断就会产生多种行为,先来看一下最简单的中断下中断状态的转换中断请求中断挂起状态处理器模式中断活泼状态处理器开始处理中断请求后,中断请求被去除进入中断处理进入中断处理后活泼状态被置位中断的挂起状态是可以手动设置的,有一个存放器是中断挂起状态存放器, 例如上下文切换的PendSV异常,就是手动设置Pen

39、dSV#起,然后进入了 PendSV 异常中.同样,挂起状态是可以去除的.假设中断请求产生时,处理器正在处理更 高优先级的请求,然后在处理器对该中断请求作出相应之前, 挂起状态被消除掉了,那么该中断请求也就不会被处理了中断请求中断挂起状态挂起状态被软件去除处理器模式但是,如果外设保持某中断为请求状态,那样即使软件去除掉挂起状态,挂 起状态仍会再次置位.中断请求中断挂起状态处理器模式中断处理完成后,如果中断请求仍在继续保持,中断就再次进入挂起状态, 再次得到处理器的效劳中断请求保持活泼中断请求中断挂起状态中断活泼状态再次进入中断处理器模式 ¥V对于脉冲中断请求,假设在处理器开始处理前,

40、中断请求产生了屡次,它只会 被当做一次请求中断请求中断挂起状态中断活泼状态 I/ 处理器模式中断的挂起状态可以在其正在被处理时再次置位,也就是之前所说的activeand pend状态.中断处理完成后会再次处理该中断.再次产生中断请求中断请求T断再内挂起中断挂起状态中断活泼状态再次进入中断处理器模式另外有一种情况需要注意,即使禁止了某中断,中断的挂起状态仍然可以使 用,只是无法转化为活泼状态,并且,如果中断被使能后,假设没有高优先级中断 在执行,挂起状态就会被转换为活泼状态, 进而进入中断处理,如果不希望此类 状况发生,那应该在中断使能之前去除掉中断挂起状态.5.6 各Cortex-M 处理器

41、 NVIC差异Cortex-M处理器的中断治理有一定区别CM0CM0+CM1CM3CM4中断数量1-321-321/8/16/321-2401-240NMIYYYYY优先级宽度2223-83-8存放器访问字字字字、平字、字 节字、平字、字 节PRIMASKYYYYYFAULTMASKNNNYYBASEPRINNNYY向量表偏移 存放器NY 可选NYY动态修改优 先级NNNYY中断活泼状 态NNNYY错误处理硬件错误硬件错误硬件错误硬件错误+3个 其他错误异常硬件错误+3个 其他错误异常调试监控异 常NNNYY6异常处理6.1 C实现的异常处理C函数在ARM架构上是如何工作的,用于 ARM架构的

42、C编译器遵循ARM 的一个名为AAPCS勺标准.根据这份标准,C函数可以修改R0-R3 R12、R14(LR) 以及PSR假设C函数需要使用R4-R11,就应该将这些存放器保存到栈空间中,并 且在函数结束前将他们恢复.R0-R3 R12、R14 PSR称作“调用者保存存放器.R4-R11为“被调用者保存存放器.一般来说,函数调用将R0-R3作为输入参数,R0那么用作返回结果.假设返回 值为64位,R1也会用于返回结果.异常机制需要在异常入口处自动保存 R0-R3 R12、R14 PSR异常退出时 将其恢复,这些都要由处理器硬件限制.另外,与普通的 C函数调用不同,返回 地址PC并没有存储在LR

43、中,进入异常时LR存储的是EXC_RETURN#常返回时 将会用到.因此,异常流程也需要将 返回地址保存,所以,水算浮点单元,异常 处理期间保存的存放器为8个.对于带浮点单元的Cortex-M4处理器,异常机制 还会保存S0-S15以及FPSCR第一个参数 第二个参数一 第三个参数一 第四个参数一被调用者保存存放r器栈指针 链接存放器LR 程序计数器PCR0R1R2R3R4R5R5R6R7R8R9R10R11R12R13 (SP)R14R15PSR浮点单元被调用者保存存放器S0-S15S16-S31FPSCR1 , /R0R1R2R3R4R5R5R6R7R8R9R10jjf1/1/R11R12

44、R13 (SP)R14R15PSRS0-S15S16-S31FPSCRc函数6.2栈帧在异常入口处被压入栈空间的数据块为栈帧. 不具有浮点单元的M4处理器, 栈帧是8个字大小.带浮点的栈帧可能是 8个或26个字大小.与上一个小节中 所说的异常处理期间保存的存放器为 8个是一个意思.AAPC酸求栈指针的数值在函数入口和出口处应是双字对齐的,双字栈对齐特性可编程,该特性可以关闭.M0中不可设置.压栈的xPSR的第9位表示栈指 针的数值是否调整过,0未调整,1调整过,也就是会自动插入一个字的空间. 所以,栈帧最大为9或27个字.6.3 EXC_RETURN6.1 小节中说到过,处理器进入异常时,LR

45、存储的是EXC_RETURN这里说 明一下,EXC_RETURN具体细节.EXC_RETURN一个字大小,位域表示如下位描述数值31:28EXC_RETURN旨示0xF27:5保存全为10Xefffff4栈帧类型M0中无1: 8字0: 26 字3返回模式1:返回线程模式0:返回处理模式2返回栈1:返回线程栈0:返回主栈1保存00保存1EXC_RETUR N 合法值浮点未使用FPCA=1浮点使用FPCA=0返回处理模式,总使用主栈0XFFFFFFE10XFFFFFFF1返回线程模式,返回后使用主栈0XFFFFFFE90XFFFFFFF1返回线程模式,返回后使用进程栈0XFFFFFFED0XFFF

46、FFFFD_asm void vPortSVCHandler( void ) PRESERVE8Idr r3, =pxCurrentTCB /* Restore the context. */Idr r1, r3Idr r0, r1ldmia r0!, r4-r11msr psp, r0/* Restore the task stack pointer. */isbmov r0, #0msr basepri, r0orr r14, #0xd/*或上0b1101,返回线程栈,线程模式*/bx r146.4 异常流程6.4.1 异常进入和压栈当异常产生且被处理器接受时,压栈流程会将存放器压入栈中并

47、组织栈帧. 要注意的是,压栈期间的栈访问顺序和栈帧中的顺序不同,首先压栈的是PC和xPSR这样在取向量时会尽快更新PC这里再复习一下主栈与进程栈的使用,在处理模式,必须使用主栈,在进程模式,由CONTROL?存器限制使用主栈还是进程.在处理器处于进程模式并且使用进程栈时,压栈操作使用进程栈,然后就进入了处理模式,直到异常返回之前,一直使用的是主栈,如异常嵌套的情况,在 一个异常中又进入了另一个异常,仍然使用的是主栈进行压栈.另外,我们在使用OS的时候会有两个栈空间,系统栈空间和任务栈空间, 系统栈空间是在启动文件中进行了设置,如图 6-1,这个栈空间是留给异常使用 的,也就是处理模式下的MSP

48、;而在创立任务的时候都会有对栈空间的设置,我们称为任务栈空间,也就是在线程模式下的PSPScac)c_Si aeEQUOxOOfl00 ;bessel:Ne&d co fine tune cDis value.If printf()AREASTACK, NO INI! f RKADWRIIE, ALTGN=-3Suack_M«n: _initial_3pSPACESuac)c_Size*彳立*.*Heap_Si2eEQU0x00000000;Heap_SizeOX0002G000;teasel:0x8000 ->0x400AREAHEAP, NOINITrREADWRI

49、TE, ALIGN-3heap_fcaseHeap_Merr.SPACEHeap_Size进入异常时,会将R0-R3 R12, LR和返回地址带浮点单元时包括 S0-S15 和FPSCR硬件自动压栈保存,其他的R4-R11将要软件保存.6.4.2 异常返回和由栈出栈时就是对EXC_RETURN值的判断,也就是EXC_RETURN位域所表示 的那几项,用什么栈进行压栈的仍返回什么栈, 操作模式和栈帧类型也类似.出 栈操作结束时,还要检查xPSR的第9位,假设置1那么去除压栈时插入的额外空间.对于栈空间中的数据,同入栈一样,R0-R3 R12,和LR 带浮点单元时包括S0-S15?口 FPSCR是

50、自动出栈的,其余的需要软件出栈.7低功耗和系统限制特性7.1 低功耗模式CORTEX-MS列处理器提供两种休眠模式:休眠模式和深度休眠模式.由系 统限制存放器SCRS制.处理器提供了两个用于进入休眠模式的指令:WFI,进入休眠模式,等待中断,可由中断、调试、复位唤醒. WFE等待事件,条件进入休眠模式.内部事 件存放器为0,进入休眠,否那么内部事件存放器被去除,处理器继续执行,除了 中断、调试、复位唤醒外,还能由事件唤醒.WFE中的事件唤醒包括事件输入信号脉冲RXEV.该信号属于事件通信接 口特性的一局部.处理器还存在一个名为 TXEV发送事件的输出信号,当执 行SEV发送事件指令时,TXEV

51、会输出一个周期的脉冲信号.事件通信接口的主要设计目标位,在一个特定事件发生前让处理器一直处于 休眠模式.例如:允许外设和处理器之间的通信允许多个处理器间的通信7.1 SysTick 定时器Cortex-M处理器内集成了一个小型的名为 Systick的定时器,它属于NVIC的 一局部,可以产生Systick异常.Systick为简单的向下计数的24位计数器.Systick的主要作用是用于在OS中任务治理和上下文切换,处理器可以在不 同时间片内处理不同任务.设计这个定时器的目的是为了增加软件的可移植性.所有CORTEX-MS歹I的芯片都有相同的定时器.定时器的时钟可以是处理器时钟或者是外部参考时钟 STCLK定时器的使用很简单,只有四个存放器地址存放器作用0XE000E010Systick限制和状态存放

温馨提示

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

评论

0/150

提交评论