目录

01.简介

02.ARM架构版本进化史

03.Cortex-M3中断异常处理机制

04.SkyEye支持的处理器列表


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》

关于Cortex-M3处理器内核中断异常处理机制你了解多少?相关推荐

  1. Cortex M3 NVIC与中断控制

    Cortex M3 NVIC与中断控制 宗旨:技术的学习是有限的,分享的精神是无限的. 一.NVIC概览 --嵌套中断向量表控制器 NVIC 的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断 ...

  2. 龙芯处理器内核中断讲解

    龙芯处理器内核中断讲解 这里以龙芯处理器ls2k1000为例讲解 1.和中断相关的协处理器 ① 原因寄存器(Cause) IP7-0指出等待的中断.该位将保持不变直到中断撤除.IP0~IP1 是软中断 ...

  3. Cortex M3处理器工作模式及中断过程

    来自::http://blog.csdn.net/ffgamelife/article/details/6947300 1.      工作模式 线程模式(Thread mode):处理器复位或异常退 ...

  4. Cortex M3内核架构

    CortexM3内核架构 宗旨:技术的学习是有限的,分享的精神是无限的. 1.ARMCortex-M3处理器 Cortex-M3处理器内核是单片机的中央处理单元( CPU). 完整的基于CM3的MCU ...

  5. Cortex‐M3的Faults异常究竟是什么?

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 有许多朋友在学习,或者开发STM32时都遇到过HardFault_Handler的情 ...

  6. Cortex、ARMv8、arm架构、ARM指令集、soc?Cortex A8、A9都是ARMv7a 架构;Cortex M3、M4是ARMv7m架构;前者是处理器(内核)后者是指令集的架构(架构)

    架构组成元素的指令集状态或者语法thumb指令集与arm指令集的区别例如thumb指令集是什么_thumb指令集与arm指令集的区别以及thumb-2的关系在下一文中介绍,本文暂时不讨论 有粉丝问我到 ...

  7. Linux内核中断系统处理机制-详细分析

    原文地址::https://blog.csdn.net/weixin_42092278/article/details/81989449 相关文章 1.Linux中断管理 (1)Linux中断管理机制 ...

  8. cortex m3/m4处理器的复位设计

    cortex m3/m4处理器在复位层面总体上可以划分为core和debug logic两部分.core部分包括处理器内核(core)以及NVIC,BUS Matrix,MPU的非debug部分.de ...

  9. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

最新文章

  1. 树莓派centos安装的基本配置
  2. Python写各大聊天系统的屏蔽脏话功能原理
  3. linux内核竞争条件漏洞,Linux内核竞争条件漏洞-导致远程代码执行
  4. MySQL实战45讲学习笔记:MySQL架构(第一讲)
  5. python逐行读取字符串_python3.4.3下逐行读入txt文本并去重的方法
  6. Scrapy-Link Extractors(链接提取器)
  7. linux之stat
  8. 忆芯科技发布新一代国产主控芯片STAR1000P!4月完成量产版本
  9. 计算机表格中需要乘法求和,《怎么在Excel表格里面使用乘法求和》
  10. JVisualVM监控jvm
  11. 计算机没有音频驱动程序,电脑没有声音怎么办?如何安装音频输出设备?
  12. 计算机系统中为何采用层次化存储体系,计算机组成原理与体系结构——层次化存储结构...
  13. 小猫爪:PMSM之FOC控制12-扩展卡尔曼滤波状态观测器解析
  14. 如何在手机或平板上编写代码?
  15. Python+Selenium自动化测试之页码,前一页、后一页、翻页
  16. Java人员随机分组
  17. Python测试三角函数的正交性
  18. 专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09
  19. Dynamics 365 Online和On-premises在开发方式上的差别
  20. 新浪微博技术架构分析-微博首席架构师杨卫华

热门文章

  1. 禅道批量删除bug_写代码有这16个好习惯,可以减少80%非业务的bug
  2. nginx 多php项目配置文件,nginx 配置文件配置多个站点
  3. mysql查看当前数据库的连接信息_查看 mysql 数据库当前连接数
  4. php升级语言,PHP是最好的语言,PHP 8.0带来了重大更新
  5. 特殊年份(java)
  6. mysql_safe不存在_mysql5.7.9安装后找不到mysqld_safe和mysqld_multi程序
  7. 中移M5311-NBIOT-OPENCPU开发-HTTP串口收发器
  8. 中移4G模块-ML302-OpenCpu开发-51单片机串口转I2C
  9. 怎么设置mysql 的权限_怎么设置SQL数据库用户权限
  10. 手机如何通过路由器共享计算机硬盘,手机如何访问电脑硬盘之ES文件浏览器?...