目录
01.简介
Cortex-M3处理器内核是ARM公司设计的Cortex-M系列的一款经典处理器内核,基于32位ARMv7内核架构,采用Thumb-2指令集,完全没有使用ARM指令集,即不能执行ARM指令。Thumb-2是16位Thumb 指令集的一个超集,在Thumb-2中,16位指令首次与32位指令并存。
Cortex-M3处理器的特点包括:性能强劲、功耗低、实时性好、代码密度得到很大改善、低成本的整体解决方案。
02.ARM架构版本进化史
ARM公司几十年如一日地开发新的处理器内核和系统功能块。随着功能的不断进化,处理水平的持续提高,年深日久造就了一系列的ARM架构。这里需要说明的是,ARM架构版本号和ARM处理器名字中的数字并不是一码事。比如,ARM7TDMI是基于ARMv4T架构的(T表示支持“Thumb指令”),并不是ARMv7架构。
ARMv5TE架构则是伴随着ARM9E处理器家族亮相的,ARM9E家族成员包括ARM926E-S和ARM946E-S,ARMv5TE架构添加了“服务于多媒体应用增强的DSP指令”。
后来又出了ARM11,ARM11是基于ARMv6架构建成的。基于ARMv6架构的处理器包括ARM1136J(F)-S,ARM1156T2(F)-S,以及ARM1176JZ(F)-S。
基于从ARMv6开始的新设计理念,ARM进一步扩展了它的CPU设计,也就是ARMv7架构,在这个版本中,内核架构首次从单一款式变成3种款式。
Cortex-A系列(Application):设计用于高性能的“开放应用平台”——越来越接近电脑了 ,针对日益增长的消费娱乐和无线产品设计,用于具有高计算要求、运行丰富操作系统及提供交互媒体和图形体验的应用领域,如智能手机、平板电脑、汽车娱乐系统、数字电视,智能本、电子阅读器、家用网络、家用网关和其他各种产品。
Cortex-R系列(Real-time):用于高端的嵌入式系统,尤其是那些带有实时要求的——又要快又要实时。 针对需要运行实时操作的系统应用,面向如汽车制动系统、动力传动解决方案、大容量存储控制器等深层嵌入式实时应用。
Cortex-M系列(Microcontroller):用于深度嵌入的,单片机风格的系统中。该系列面向微控制器领域,主要针对成本和功耗敏感的应用,如智能测量、人机接口设备、汽车和工业控制系统、家用电器、消费性产品和医疗器械等。
03.Cortex-M3中断异常处理机制
3.1 嵌套向量中断控制器
Cortex-M3内核中搭载了一颗中断控制器——嵌套向量中断控制器(NVIC),与内核是紧耦合的,因此我们是在Cortex-M3内核中实现NVIC。
可嵌套中断机制:
所有异常都可以被赋予不同的优先级,当前优先级被存储在xPSR的专用字段中。当一个异常发生时,硬件会自动比较该异常的优先级是否比当前的异常优先级更高。如果发现来了更高优先级的异常,处理器就会中断当前的中断服务例程(或者是普通程序),而服务新来的异常——即立即抢占。
3.2 中断和异常
与传统异常模型有了很大区别,Cortex-M3取消了FIQ快中断请求,采用更好的机制——中断优先级管理以及嵌套中断支持。支持11种系统异常(4+1个保留位),外加240个外部中断输入。
3.3 向量表
当Cortex-M3内核响应了一个发生的异常后,对应的异常服务例程(ESR)就会执行,Cortex-M3使用了“向量表查表机制”来确定ESR的入口地址。向量表其实是一个WORD(32位整数)数组,每个下标对应一种异常,该下标元素的值则是该ESR的入口地址,向量表在地址空间中的位置是可以设置的,通过NVIC中的一个重定位寄存器(VTOR)来指出向量表的地址。
0号类型并不是什么入口地址,而是给出了复位后MSP的初值。
以TLE987x 系列SoC(Cortex-M3核心)为例,外部中断向量表如下所示:
在系统初始化过程中通过设置VTOR = 0x11000000重定位向量表基地址。
外部中断IRQ #0 (GPT12)对应偏移为0x40,即向量地址为0x11000040,则IRQ 0中断服务程序的入口地址是0x1100221d,因为LSB必须是1,所以对应的ESR入口地址是0x1100221c,即GPT1_IRQHandler。
3.4 外部中断执行流程
有GTP1_T2的中断请求,会设置SCU.GPT12IRC[0]为1, 若SCU.GPT12EN[0]是1且SCU.IEN0[7]为1,则触发INTISR[0]中断,即外部中断0号,SCU向CPU发送中断的接口实现代码:
Cortex-M3 CPU中断触发接口实现如下:
3.5 中断系统设置全过程
1.当系统启动后,先设置优先级组寄存器。缺省情况下使用组0(7位抢占优先级,1位亚优先级)。
2. 如果需要重定位向量表,先把硬fault和NMI服务例程的入口地址写到新表项所在的地址中。
3. 配置向量表偏移量寄存器,使之指向新的向量表(如果有重定位的话)。
4. 为该中断建立中断向量。因为向量表可能已经重定位了,保险起见需要先读取向量表偏移量寄存器的值,根据该中断在表中的位置计算出对应的表项,再把服务例程的入口地址填写进去,如果一直使用ROM中的向量表,则无需此步骤。
5. 为该中断设置优先级。
6. 使能该中断。
3.6 Cortex-M3中断/异常的响应序列
中断/异常响应序列包含三个步骤(入栈、取向量、更新寄存器)。
1. 入栈
把8个寄存器的值压入栈(xPSR, PC, LR, R12以及R3-R0)
2. 取向量
根据异常号从向量表中找出正确的异常向量地址,然后从异常向量地址处取出服务程序的入口地址。
3. 更新寄存器
在入栈和取向量操作完成之后,执行服务例程之前,还要更新一系列的寄存器。
SP: 在入栈后会把堆栈指针(PSP或MSP)更新到新的位置。在执行服务例程时,将由MSP负责对堆栈的访问。
PSR:更新IPSR位段(地处PSR的最低部分)的值为新响应的异常编号。
PC:在取向量完成后,PC将指向服务例程的入口地址。
LR:在出入ISR的时候,LR的值将得到重新的诠释,这种特殊的值称为“EXC_RETURN”。在异常进入时由系统计算并赋给LR,并在异常返回时使用它。EXC_RETURN的二进制值除了最低4位外全为1,即0xFFFFFFFx,最低4位含义如下:
合法的EXC_RETURN值及其功能:
如果主程序在线程模式下运行,并且在使用MSP时被中断,则在服务例程中LR=0xFFFF_FFF9。
如果主程序在线程模式下运行,并且在使用PSP时被中断,则在服务例程中LR=0xFFFF_FFFD。
04.SkyEye支持的处理器列表
目前SkyEye支持市面上包括ARM、DSP、PowerPC、Sparc、X86、MIPS等多种架构在内的不同型号的处理器。下图为SkyEye支持的指令集架构、处理器内核、处理器型号、编译环境以及对应处理器可运行的操作系统。
参考资料
《CM3权威指南CnR2》
《Infineon-TLE987x-UserManual-v01_60-EN》