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

下载本文档

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

文档简介

1、Cortex-M4内核知识点总结目录Cortex-M4内核知识点总结 错误!未定义书签1 ARM处理器简介 错误!未定义书签2架构 错误!未定义书签架构简介 错误!未定义书签编程模型 错误!未定义书签存储器系统 错误!未定义书签复位和复位流程 错误!未定义书签3指令集 错误!未定义书签CM4指令集特点 错误!未定义书签Cortex-M处理器间的指令集比较 错误!未定义书签汇编指令简要介绍 错误!未定义书签处理器内传送数据 错误!未定义书签存储器访问指令 错误!未定义书签算数运算 错误!未定义书签逻辑运算 错误!未定义书签移位 错误!未定义书签异常相关指令 错误!未定义书签4存储器系统 错误!未

2、定义书签存储器外设 错误!未定义书签Bootloader 错误!未定义书签位段操作 错误!未定义书签存储器大小端 错误!未定义书签5异常和中断 错误!未定义书签中断简介 错误!未定义书签异常类型 错误!未定义书签中断管理 错误!未定义书签异常或中断屏蔽寄存器 错误!未定义书签PRIMASK 错误!未定义书签FAULMASK (M0中无) 错误!未定义书签BASEPRI ( M0中无) 错误!未定义书签中断状态及中断行为 错误!未定义书签中断状态 错误!未定义书签中断行为 错误!未定义书签各Cortex-M处理器NVIC差异 错误!未定义书签6异常处理 错误!未定义书签C实现的异常处理 错误!未

3、定义书签栈帧 错误!未定义书签EXC_RETURN 错误!未定义书签异常流程 错误!未定义书签异常进入和压栈 错误!未定义书签异常返回和出栈 错误!未定义书签7低功耗和系统控制特性 错误!未定义书签低功耗模式 错误!未定义书签SysTick定时器 错误!未定义书签8 OS支持特性 错误!未定义书签OS支持特性简介 错误!未定义书签SVC和PendSV 错误!未定义书签实际的上下文切换 错误!未定义书签1 ARM处理器简介ARMt理器的种类很多,从手机上的高端处理器芯片到面向微控制器的芯片,都有ARM勺身影。2011年基于ARMt理器的芯片的出货量已经到达 79亿。 这一章首先对ARMt理器有个

4、简单的了解。在早期的时候,ARMt理器使用后缀表明特性。例如 ARM7TDMIT表示支持 Thumb旨令,D表示JTAG M表示快速乘法器,I则表示嵌入式ICE模块。近几年,ARM:变处理器的命名方式,统一使用了 Cortex处理器的名称。Cortex处理器下分为三类: Cortex-A系列:需要处理高端嵌入式系统等复杂应用的应用处理器- Cortex-R系列:实时、高性能的处理器,面向较高端的实时市场 Cortex-M系列:面向微控制器和混合信号设计等小型应用, 注重低成本、 低功耗。不同系列的处理器使用不同版本的架构Cortex-A 系列ARMv7-咪构Cortex-R 系歹!JARMv7

5、-Rg构Cortex-M 系歹!JARMv7-M ARMv6-M在Cortex-M系列中,进一步都处理器进行了划分处理器功能架构Cortex-M0、Cortex-M0+低功耗ARMv6-MCortex-M1FPGAARMv6-MCortex-M3微控制器ARMv7-MCortex-M4增力口 DSPARMv7E-M2架构架构简介Cortex-M3和Cortex-M4处理器都是基于 ARMv7-俅构。最初 ARMv-7M 架构是随着Cortex-M3处理器一同引进的,而在 Cortex-M4发布时,架构中 又额外增加了新的指令和特性,改进后的架构有时也被称为ARMv7E-M编程模型操作模式和状态

6、Cortex-M4处理器包括两种操作状态和模式,还有两种访问等级。1 .操作状态调试状态:处理器被暂停后,就会进入调试状态,比如利用调试器触 发断点,单步执行等。- Thumb犬态:处理器执行程序代码,它就是处在 Thumb犬态,因为 Cortex-M4用的是Thumb旨令,所以称为Thumb犬态,并且在Cortex-M 处理器中已经不支持 ARM旨令,也就不存在ARM犬态。2 .操作模式处理模式:执行中断服务程序等异常处理。 在处理模式下,处理器总 是具有特权访问等级。线程模式:执行普通的程序代码。3 .访问等级特权访问等级:可以访问处理器中的所有资源非特权访问等级:有些存储器区域无法访问,

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

8、能访问低寄存器。R8-R12称作高 寄存器,可用32位指令和几个16位指令访问。R0-R12初始值未定义。2栈指针R13R13为栈指针,可通过PUS的POFS作实现栈存储的访问。栈指针包括两个: 主栈指针MSPffi进程栈指针PSP MS斯默认指针,复位后或处理模式时只能是 MSP而PSP只能在线程模式使用。栈指针的选择有 CONTROL存器控制。MSP® PSP的最低两位必须是0,也就是栈指针的地址操作必须4字节对齐。3链接寄存器(LR) R14用于函数或子程序调用时返回地址的保存,在异常中则用来保存进异常前状 态信息,包括系统模式、栈指针模式等。异常返回时参考LR中的信息返回到相

9、应状态。4程序计数器(PC R15R15为程序计数器,读操作返回当前地址加 4,写操作引起跳转。特殊寄存器特殊寄存器有三类:程序状态寄存器、中断/异常屏蔽寄存器、处理器控制 寄存器。1程序状态寄存器:应用PSR(APSR、执行PSR(EPSR、中断PSR(IPSR) 三个寄存器可以单独访问,也可以组合到一个寄存器中访问。31262320161080N Z C V Q| ICI/IT TGE0-3ICI/ITISR NUM在APS中包含N (负标志)、Z (零标志)、C (进位标志)、V (溢出标志)、 Q (饱和标志)和GE (大于或等于标志,只在 M4中有)。IPSR中是中断号,只读。EPS

10、Rfr, T为表示Thum瞅态,由于M4支持Thumb犬态,不支持ARM犬态, T位始终为1。ICI是中断继续指令位,保存的是中断被打断时的信息。 IT指令 时IF-THEN指令,用于条件执行。2 PRIMASK FAULTMASq口 BASEPRlf存器:这三个寄存器只能在特权模 式下使用。PRIMASKT屏蔽除NMI和HardFault之外的所有异常。FAULTMASK 可屏蔽HardFault。 BASEPR可以根据设置屏蔽低优先级的中断,可控制 8个或 16个中断,相应的改寄存器的宽度为 3位或4位。3 CONTROL 存器CONTROL存器主要有以下几项作用: 线程模式下的访问等级

11、指针的选择 当前代码是否使用了浮点单元分别对应了寄存器的低三位位功能nPRIV (第 0 位)0对应特权等级,1为非特权等级SPSEL(第 1 位)0对应主栈指针,1为进程栈指针,处理模式下始终为 0。FPCA(第2位) 0未使用浮点,1使用了浮点浮点寄存器1 S0-S31 和 D0-D15S0-S31都为32位寄存器,也可以D0-D15的方式成对访问,但 M4不支持双 精度浮点运算,只是可以传输双精度数据。2浮点状态和控制寄存器(FPSCRFPSC陋个功能 提供浮点运算结果的状态信息,如负标志、进位标志等。 定义一些浮点运算动作,如何舍入等3经过存储器映射的浮点单元控制寄存器(CPACR该寄

12、存器经过了映射,也就是说需要通过通用寄存器加载进行设置,寄存器 的功能是可以设置浮点单元的访问权限,拒绝访问、特权访问,全访问。存储器系统存储器系统特性 4GB性地址空间 架构定义的存储器映射。4GB的存储器空间被划分为多个区域,用于 预定义的存储器和外设。 支持大端和小端的存储器系统。 位段访问。 写缓冲 存储器保护单元MPU 非对齐传输支持存储器映射CORTEX-M理器的4GBm址空间被分为了多个存储器区域,如图所示。区 域根据各自典型用法进行划分,他们主要用于: 程序代码访问(如COD位域)数据访问(如SRAM:域)外设(如外设区域)某款芯片的存储器映射分配系统0.5GB外部设备1GB外

13、部RAM 1GB外设0.5GBSRAM 0.5GBCODE 0.5GB/PWM register0x50F0_00000x50D0_00000x50C0_00000x50B0_00000x5090_00000x5073_00000x5072_00000x5071_00000x5070_00000x5062_00000x5061_00000x5060_00000x5050_00000x5040_00000x5030_00000x5023_00000x5022_00000x5021_00000x5020_00000x5011_00000x5010_00000x5000_0000GPIO regis

14、terAnalog control (ADC/TP/AnalogReg/1k sram)IO control0xFFFF_FFFF0xF000_0000Reserved<-7816 registerSPI3 registerSPI2 register0xE000_0000Private Peripheral BusSPI1 register0x5000_00000x4010_0000ReservedSPI0 registerTimer_2 registerTimer_1 registerTimer_0 registerAPBBRG deviceWDT registerRTC regist

15、erCRC registerUART3 registerFLASH CTRL32KByUART2 register0x4000_0000_DMA0x3000_0000ReservedUART1 registerUART0 registerI2C_1 register0x2000_0000_SRAM8KBytes0x60 0000_ReservedI2C_0 registerSCU (clock ResetPmu calendar)0x0000_0000FLASH MEMORY 128K+4K FLASH一般Code放在Flash当中,数据放在RAW。数据在RAMfr放有一定的顺 序,可以分为数

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

17、置,PUSH寸,SP指针首先减小,然后将数据压入栈中。POP勺时候相反,先将当前SP所指的数据出栈,然 后再修改SP, SP此时增大。可用下面两幅图加以理解,栈空间PUSHM乍寄存器0x12345678poPM乍寄存器0x12345678栈中主要用于: 存储局部变量 异常产生时保存处理器状态(LR xPSR和寄存器数值 函数调用时复位和复位流程对于典型的Cortex-M处理器,复位类型有三种: 上电复位。复位微控制器中所有部分。 系统复位。只会复位处理器和外设,不包括处理的调试支持部件 处理器复位。只复位处理器。在复位后以及处理器开始执行程序前,处理器会从存储器中读出头两个字 节。第一个字表示

18、主栈指针的初始值。第二个字代表复位处理起始地址的复位向 量。处理器读出这两个自己后,就会将这些数值赋给MSPffi PG读地址 读地址读取复位向量0x00000000 0x00000004表示的地址取MSP®始值取复位向皇 里取第一条指令时间之前在栈存储时讲到过,Cortex-M处理器的栈操作时基于满递减的,所以 S P的初始值应该设置在栈顶的位置。例如,若存储器区域为 0x20007c0000x200 07FFF (1KB),初始的栈指针就应该为0x。另外,对于Cortex-M处理器,向量表中向量地址的最低位应该为1,以代表他们为Thumb犬态。对于下图中的例子,复位向量为 0x1

19、01,而启动代码是从0x100开始的。在取出复位向量后。Cortex-M处理器就可以从复位向量地址处执 行程序,并开始正常操作。其他存储器SPM始值第一个压栈顶第二个压栈顶SRA则始地址启动代码T复其他异常向量位 向量0X000001010X200080000X200080000X20007FFC0X20007FF80X200000000X000001000X000000040X000000003指令集CORTEX-M4用的是Thumb-2指令集,不支持 ARM旨令集,Thumb旨令集是ARM旨令集的子集,但是Thumb-2技术已经不再支持ARM犬态。CORTEX-M理器间的一个区别就是指令集

20、特性。为了将回路面积降到最低, CORTEXMCORTEXM0CORTEXM1理器只支持多数16位指令和部分32位指令, CORTEX-M3持的32位指令更多。CORTEX理器支持剩下的SIMD (单指令多数 据)等DSPI开指令集可选的浮点指令。CM4指令集特点CM4t理器使用ARMv7-M构,指令集为Thumb旨令集中的Thumb-2技术, 具有如下特点 16位与32位混合指令 加载/存储指令集,不能直接操作存储器。 指令长度可变,使用16/32位由功能决定,优先使用16位。 DSP旨令,CM时为单精度,CM种可以双精度Cortex-M处理器间的指令集比较Cortex-M 处理器的架构有三

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

22、6位无符号LDRHSTRH16位有符号LDRSHSTRH32位LDRSTR多个32位LDMSTM64位LDRDSTRD栈操作PUSHPOP介绍几个较为重要的1 LDR/STRLDR Rd,Rn,#offset从存储器Rn+offset处读取字,读取到 Rd中STR Rd,Rn,#offset 向存储器Rn+offset处存储字,数据来自 R& 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。相当于PUSHft作。另要注意的是,先存储高 寄存器的数据,后存储低寄存器的数据。STMD啾作同样,这两

24、个指令都可以通过!表示写回操作,更新寄存器所指的存储器位 置3压栈与出栈PUSH/POPPUSHffi POP®上面的LDMIAffi STMD是相同的。算数运算加:ADC减:SUBMUL除:DIV对此不做详细介绍逻辑运算与:AND或:ORR位清除:BIC按位异或:EOR按位或非:ORN移位算数右移:ASR逻辑左移:LSL逻辑右移:LSR循环右移:ROR异常相关指令之前说过,M4可以有特权模式和非特权模式,并且非特权模式不能直接转 换到特权模式,只能在异常中修改CONTROL存器。这里就可以通过SVC旨令来 进入异常。SVC #<immed>这样就可以进入SVC中断中,然

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

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

27、ata2、范围内是SRAM主要用于连接SRAM其大都为片上SRAM不过对存储 器的类型没有什么限制。若支持可选的位段特性,则SRAMK域的第一个1MB可位寻址,还可以在这块区域中执行程序代码。3、是外设区域,多用于片上外设,和SRA顺域类似,也可以放置程序代码, 若支持可选的位段特性,则外设区域的第一个1MB是可选的。4、空间为外部RAMfi问5、2G-3G空间为设备空间,用于片外外设。6、3G-4G空间为系统空间。Bootloader芯片设计人员将Bootloader放入系统中的原因是多方面的。例如: 提供Flash编程功能,这样就可以利用一个简单的 UAR侬口来编程 Flash,或者当程序

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

29、后0x04放的reset_handler 的地址,mode=0那infor区就被映射到了 0x00, mode=1 main 区就被映射到了 0x00。位段操作对存储器中某一位操作是如何实现的呢?先来看看普通模式下,写某一位:LDR R0, =0X0 ;设置地址LDR R1,R0; 读数据R1,#0X04; 修改第2位STR R1, R0; 写回读某一位:LDR R0, =0X0 ;设置地址LDR R1,R0; 读数据R1 , R1 , #2, #1;提取第 2 位这种操作无法保证原子性,比如输出端口的第0位被主程序使用,而第一位 被中断使用,这样有可能出现数据冲突。位段操作模式下,这种现象可

30、以避免, 因为位段操作是在硬件等级下修改的。位段操作只在两个区域支持,SRAM勺第1MB外设区域的第1MB每1M哈 对应一个32M的区域,只需操作这32M的某个字,就能对应那1MBK域的某一位。 例如写0x为1,就设置了 0x第3位为1。在指令上也会更加简化。位段写操作LDR R0, =0X2200000 ;设置 addMOV R1 #1;要写的数据STR R1 ,R0;写设置了位段操作模式,对应的32MB区域将不能再使用。存储器大小端大小端指的是数据存储时的顺序问题。大端指的是高字节的数据放在低地址 中,低字节放在高地址中,这种方式符合人类思维。小端则是低字节放在低地址 中,高字节放在高地址

31、中,这种方式更符合计算机思维。例如将0x放到存储器0x2000-0x2003地址处大端方式地址0x20030x20020x20010x2000数据0x780x560x340x12小端方式地址0x20040x20030x20020x2001数据0x120x340x560x78CM4t理器同时支持小端和大端的存储器系统。CM的微控制器大多是小端 的。5异常和中断中断简介所有的CORTEX-Mt理器都会提供一个用于中断处理的嵌套向量中断控制 器,也就是NVIC中断也属于异常的一种,其他异常包括如错误异常和其他用 于OS支持的系统异常。M4的NVIC支持最多240个IRQ (中断请求),1个不可屏蔽中

32、断(NMD, 1 个SysTick (系统节拍)定时中断及多个系统异常。异常编号异常类型优先级描述1复位-3复位2NMI-2/、口屏蔽中断3硬件错误-1硬件错误4MemManage 误可编程存储器管理错误5总线错误可编程总线错误6使用错误可编程程序错误7-10保留11SVC可编程请求管理调用12调试监控可编程调试监控13保留14PendSV可编程一般用于上下文切换15SYSTICK可编程系统节拍定时器16外部中断#0可编程片上外设或外部中断源产生17外部中断#1可编程255外部中断#239可编程除了前3个异常的优先级是固定的,其余异常都可以修改优先级异常类型编号1-15为系统异常,16及以上的

33、则为中断输入中断管理为了简化中断和异常管理,CMSIS-Core提供了多个访问函数函数用法Void NVIC_EnableIRQ (IRQn_Type IRQ®使能外部中断Void NVIC_DisableIRQ (IRQn_Type IRQn)禁止外部中断Void NVIC_SetPriority(IRQn_Type IRQn,uint32_t priority)设置中断的优先级Void _enable_irq(void)清除PRIMASK!能中 断Void _disable_irq(void)设置PRIMAS嫌止所有中断Void NVIC_SetPriorityGrouping(

34、uint32_t priorityGroup)设置优先级分组复位后,所有中断都处于禁止状态,且默认的优先级为 00在使用任何一个中断之前需要 设置所需中断的优先级(可选) 使能外设中的可以触发中断的中断产生控制 使能NVIC中的中断在M4中,中断优先级共8位宽,但芯片厂商可进行设置,范围是 3-8位 中断优先级分为两个部分,分组优先级(也叫抢占优先级)和子优先级。处理器 首先判断的是分组优先级,分组优先级高的会被首先处理,若分组优先级相同, 再比较子优先级。8为宽的优先级如何分配抢占优先级和分组优先级,可由寄存 器设置。如下表优先级分组抢占优先级域分组优先级域0 (默认)Bit7:1Bit01

35、Bit7:2Bit1:02Bit7:3Bit2:03Bit7:4Bit3:04Bit7:5Bit4:05Bit7:6Bit5:06Bit7Bit6:0Bit7:0这里要注意的是,异常编号和优先级并不是一个意思, 异常编号仅仅是一个 编号,就像是枚举一样,而优先级则是需要手动的进行设置的。 只有在分组优先 级和子优先级完全一致时,异常编号才起作用,编号越小优先级越高。另外,在M4内核中,还提供了中断向量重定位功能。向量表重定位功能提 供了一个名为向量表偏移寄存器(VTOR的可编程寄存器。前面提到的Bootloder 就可以使用此项功能来完成。异常或中断屏蔽寄存器PRIMASKPRIMASIffl

36、于禁止除NMI和HardFault外的所有异常,只能在特权状态访问 如:CPSIE I ;消除PRIMASK使能中断)CPSID I;设置PRIMASK (禁止中断)FAULMASK (M0中无)FAULMASK于禁止除NMI外的所有异常,只能在特权访问,如:CPSIE F ;消除 FAULMASKCOSID F;设置 FAULMASKBASEPRI (M0中无)BASEPR可禁止优先级低于某特定等级的中断,只能在特权状态访问,如:_set_BASEPRI(0X60);中断请求处理器开始处理中断请求后,中断请求被清除中断挂起状态处理器模式进入中断处理中断活跃状态中断请求进入中断处理后活跃状态被

37、置位中断挂起状态挂起状态被软件清除处理器模式中断请求中断挂起状态处理器模式中断请求保持活跃中断请求中断挂起状态中断活跃状态处理器模式中断请求中断挂起状态中断活跃状态处理器模式再次产生中断请求中断再次挂起中断请求中断挂起状态中断活跃状态再次进入中断处理器模式C函数返回结果在函数调用后会被修改的寄存器*/ldr r1, r3Idr r0, r1Idmia r0!, r4-r11msr psp, r0/* Restore the task stack pointer. */isbmov r0, #0msr basepri, r0orr r14, #0xd /* 或上0b1101,返回线程栈,线程模式

38、*/ bx r14异常流程异常进入和压栈当异常产生且被处理器接受时,压栈流程会将寄存器压入栈中并组织栈帧。 要注意的是,压栈期间的栈访问顺序和栈帧中的顺序不同,首先压栈的是PC和xPSR这样在取向量时会尽快更新PC这里再复习一下主栈与进程栈的使用, 在处理模式,必须使用主栈,在进程 模式,由CONTROL存器控制使用主栈还是进程。在处理器处于进程模式并且使用进程栈时, 压栈操作使用进程栈,然后就进 入了处理模式,直到异常返回之前,一直使用的是主栈,如异常嵌套的情况,在 一个异常中又进入了另一个异常,仍然使用的是主栈进行压栈。另外,我们在使用OS的时候会有两个栈空间,系统栈空间和任务栈空间, 系

39、统栈空间是在启动文件中进行了设置,如图 6-1 ,这个栈空间是留给异常使用 的,也就是处理模式下的MSP而在创建任务的时候都会有对栈空间的设置,我 们称为任务栈空间,也就是在线程模式下的 PSP *Stack_SizeEQU0x00400 jbessel:Need to fine rune this value,If princf( )AREASTACK r NO IKIRZADWRITEr ALIGN-3Stack_MettSPACEScackSizeEQU0x00000000;rtsa£_5izetyuUXOOO23C0O ;£>*ssel :03t:1000 -

40、>0X03neap IsaaeAREAHEAP, NOINIT, EtEiDWRlTE, ALIGN=3Hear_Men _!ie mp_1 Jlieel tSPACEHeaD_Slze进入异常时,会将R0-R3, R12, LR和返回地址(带浮点单元时包括 S0-S15 和FPSCR硬件自动压栈保存,其他的(R4-R11)需要软件保存。异常返回和由栈出栈时就是对EXC_RETURNfi的/U断,也就是EXC_RETURN位域所表示的 那几项,用什么栈进行解讪的仍返回什么栈, 操作模式和次帧类型也类似。出栈 操作结束时,还要检查xPSR的第9位,若置1则去除压栈时插入的额外空间。对于栈空

41、间中的数据,同入栈一样,R0-R3, R122和LR (带浮点单元时包括S0-S15和FPSCR是自动出栈的,其余的需要软件出栈。7低功耗和系统控制特性低功耗模式CORTEX-M列处理器提供两种休眠模式:休眠模式和深度休眠模式。由系 统控制寄存器SCR空制。处理器提供了两个用于进入休眠模式的指令:WFI,进入休眠模式,等待中断,可由中断、调试、复位唤醒。 WFE等待事件,条件进入休眠模式。内部事 件寄存器为0,进入休眠,否则内部事件寄存器被清除,处理器继续执行,除了 中断、调试、复位唤醒外,还能由事件唤醒。WF叶的事件唤醒包括事件输入信号脉冲(RXEV。该信号属于事件通信接 口特性的一部分。处

42、理器还存在一个名为 TXEV(发送事件)的输出信号,当执 行SEV(发送事件)指令时,TXE&输出一个周期的脉冲信号。事件通信接口的主要设计目标位,在一个特定事件发生前让处理器一直处于 休眠模式。例如:允许外设和处理器之间的通信允许多个处理器间的通信SysTick定时器Cortex-M处理器内集成了一个小型的名为 Systick的定时器,它属于NVIC 的一部分,可以产生Systick异常。Systick为简单的向下计数的24位计数器。Systick的主要作用是用于在OS中任务管理和上下文切换,处理器可以在 不同时间片内处理不同任务。设计这个定时器的目的是为了增加软件的可移植性。所有C

43、ORTEX-陈歹I的芯片都有相同的定时器。定时器的时钟可以是处理器时钟或者是外部参考时钟 (STCLK)。定时器的使用很简单,只有四个寄存器地址寄存器作用0XE000E010Systick控制和状态寄存器使能以及设置Systick0XE000E014Systick重装载值寄存器Systick计时周期0XE000E018Systick当前值寄存器Systick当前数值0XE000E01CSystick校准值寄存器校准设置使用CMSIS-Core中的函数就能方便地使用Systick ,主要作用就是产生定 时中断,如下,产生1HZ的定时中断配置正确的始终频率数,产生1khz的定时中断Sys_Conf

44、ig(SystemCoreClock/1000);SystemCoreClock为对应芯片的时钟频率SysTick定时器的寄存器只能在特权状态下访问。8 OS支持特性os支持特性简介上下文切换是OS中很重要的一点,经过前面的学习,我们知道一个OS的运 行就是在不同任务间频繁的切换,而在切换时,就需要对上一个任务的一些数据 进行保存,然后进入下一个任务,并取出这个任务保存的数据。可以手动的实现 一个系统的上下文切换。处理器架构实现了多个特性,保证了 OS设计的方便和高效: 影子栈指针。有两个栈指针,MS刖于OS内核以及中断处理,PSP 用于应用任务。 Systick定时器。处理器内部的简单的定时

45、器。可实现任务的定时器 切换 SVCffi PendSV常。这两种异常对于嵌入式 OS的操作非常重要,如 上下文的切换的实现等等。 非特权等级执行,可以利用其实现一种基本安全模型SVC 和 PendSVsv的作请求管理调用,它既是一条指令,也是一种异常。 svC旨令就可以 进入SVC#常中,之前说道过从非特权转换到特权模式就可以使用 SVC#常的方 法。并且SVC#常通常是不能被打断的,如果打断就会出现硬件错误。PendSV常是为完成OS的上下文切换,并且PendSV勺异常等级要设置为 最低。这是因为如果PendSV勺异常等级比较高的话,当其他异常来临或正在执 行时,上下文切换就会打断其他异常

46、,上下文的切换较为复杂,就造成中断延迟。 这在实时系统中是不可以的。所以要把 PendSV#常等级设置为最低,等待所有 中断执行完毕后,再进行上下文切换。下图是两种方式的对比。任务切换一般有两种方式,一种可以通过 systick中断触发PendSV异常, 比如在时间片式的任务中;对于手动方式,可以通过 SVC®发PendSV#常,完 成上下文切换。这里要说明一下的是,下面两幅图中省略了触发 PendSV勺过程, Systick异常优先级是比较高的,它的作用简单,只是触发 PendSV#常,它对 IRQ的抢占影响很小。优先级上下文切换时间时间实际的上下文切换上下文切换操作由PendSV

47、常执行处理,由于异常流程已经保存了寄存器 的R0-R3 R12 LR xPSR和返回地址,PendSVft需将R4-R11保存到栈中。保存彳£务A的上下文指向任务B的上下文任务B的上下文恢复进入PendSV存储器PSP任务A的栈任务A的异常栈帧(R0-R3R12、LR、PCF 口 xPSRPSP array口STDMB任务A的R4-R11任务B日SP 任务A的SP存储器任务B的栈任务B的异常栈帧(R0-R3R12、LRPCF 口 xPSR任务B的R4-R11加载下一个任务的PSP存储器PSPLDMIA任务B的栈任务B的异常栈帧(R0-R3R12、LRPG 口 xPSR具有四个任务的多任务系统实例:/*字访问的宏定义*/#define HW32_REG(ADDRESS)(volatile unsigned long *)ADDRESS)/*以上宏定义相当于Int *p;p = (int*)0x;*p = 0x01;就是可以对ADDRESS址处赋值,也就是访问这个字地址处的数据。*/V

温馨提示

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

评论

0/150

提交评论