Cortex_M3的异常处理机制研究
- 格式:pdf
- 大小:274.10 KB
- 文档页数:4
ARMCortex-M3操作模式和特权级别Cortex-M3处理器⽀持两种处理器的操作模式,还⽀持两级特权操作。
两种操作模式分别为:处理者模式和线程模式(thread mode)。
引⼊两个模式的本意,是⽤于区别普通应⽤程序的代码和异常服务例程的代码——包括中断服务例程的代码。
两级特权操作分别为:特权级和⽤户级。
这可以提供⼀种存储器访问的保护机制,使得普通的⽤户程序代码不能意外地,甚⾄是恶意地执⾏涉及到要害的操作。
处理器⽀持两种特权级,这也是⼀个基本的安全模型。
主应⽤程序(线程模式),既可以使⽤特权级,也可以使⽤⽤户级;异常服务例程(处理者模式)必须在特权级下执⾏。
通过引⼊特权级和⽤户级,就能够在硬件⽔平上限制某些不受信任的或者还没有调试好的程序,不让它们随便地配置涉及要害的寄存器,因⽽系统的可靠性得到了提⾼。
控制寄存器(CONTROL)CONTROL[0]=1,⽤户级的线程模式CONTROL[0]=0,特权级的线程模式CONTROL[1]=1,选择使⽤PSPCONTROL[1]=0,选择使⽤MSP复位后,处理器默认进⼊线程模式,特权极访问 ( 使⽤ MSP 作为堆栈指针 )EXC_RETURN Description0xFFFFFFF1 Return to Handler mode. Exception return gets state from the main stack. Execution uses MSP after return.0xFFFFFFF9 Return to Thread mode. Exception Return get state from the main stack. Execution uses MSP after return.0xFFFFFFFD Return to Thread mode. Exception return gets state from the process stack. Execution uses PSP after return.Handler mode always uses the MSP, so the processor ignores explicit writes to the active stack pointer bit of the CONTROL register when in Handler mode. The exception entry and return mechanisms automatically update the CONTROL register based on the EXC_RETURN valueIn an OS environment, ARM recommendsthe kernel and exception handlers use the main stack.the threads running in Thread mode use the process stack.By default, Thread mode uses the MSP.To switch the stack pointer used in Thread mode to the PSP(1) use the MSR instruction to set the Active stack pointer bit to 1, CONTROL[1] = 1(2) perform an exception return to Thread mode with the appropriate EXC_RETURN valueWhen changing the stack pointer, software must use an ISB instruction immediately after the MSR instruction. This ensures that instructions after the ISB instruction execute using the new stack pointer.Processor mode and privilege levels for software executionThe processor modes are:Thread modeUsed to execute application software.The processor enters Thread mode when it comes out of reset.Handler modeUsed to handle exceptions.The processor returns to Thread mode when it has finished all exception processing.The privilege levels for software execution are:UnprivilegedThe software:has limited access to the MSR and MRS instructions, and cannot use the CPS instructioncannot access the system timer, NVIC, or system control blockmight have restricted access to memory or peripherals.Unprivileged software executes at the unprivileged level.PrivilegedThe software can use all the instructions and has access to all resources.Privileged software executes at the privileged level.In Thread mode, the CONTROL register controls whether software execution is privileged or unprivileged, see CONTROL register.In Handler mode, software execution is always privileged.Only privileged software can write to the CONTROL register to change the privilege level for software execution in Thread mode.Unprivileged software can use the SVC instruction to make a supervisor call to transfer control to privileged software.。
Cortex-M3权威指南J oseph Yiu 著宋岩译热心网友校对网络版初稿的译序我接触ARM的历史约4年,早期是很欣赏这类处理器,到了后来切身使用它们的机会越来越多,慢慢地有了感觉,也更加喜欢了。
在偶然听说Cortex-M3后,我就冥冥地感到它不寻常。
只是因为其它工作一直没有去了解它,直到今年初才进一步学习,很快就觉得相知恨晚。
当时只能看ARM官方的重量级资料,在看到这本书的英文原稿后,更感觉被电到了一样,于是突然有了把它翻译成中文的冲动。
经过累计约150个小时的奋战,终于有了此译稿。
在翻译过程中,我始终采用下列指导思想:1.尽量使用短句,并且把句子口语化。
我认为高深的道理不一定要用高级的语法句型才能表达。
想想看,即使是几位博士互相聊天讨论一个课题,也还是使用口语吧,而且火花往往就是在这种讨论中产生呢!2.多用修辞方法,并且常常引用表现力强的词汇——甚至包括网络用语和脍炙人口的歌词。
另外,有时会加工句子,使得风格像是对话。
这样做的目的是整个文风更鲜活——有点像为写出高分作文而努力的样子。
这点可能与很多学术著作的“严肃、平实”文风不同,也是一次大胆的尝试。
还希望读者不吝给予反馈。
3.在“宏观”上直译,在“微观”上意译。
英语不仅单一句子的语法和汉语不同,并且句子的连贯方式也与汉语不同。
因此在十几个到几十个单词的范围内,我先把它们翻译成脑子里的“中间语言”,再把中间语言翻译成汉语。
这样,就最大地避免了贻笑大方的“英式汉语”。
4.有些术语名词不方便翻译成汉语,或者目前的翻译方式不统一,或者与其它术语翻译的结果很接近,如error和fault,就只能用英语意会。
此时我就保留英文单词,相信这样比硬生生地翻译成汉语还好。
这些词汇主要是:retarget, fault, region等。
另外,英文中有一个很能精练表达“两者都”意思的单词及其用法:”both”,我也常常保留之。
5.图表对颜色的使用比较丰满,尤其是比较大型的插图,相信这样能帮助读者分析和理解。
Cortex-M3权威指南J oseph Yiu 著宋岩 译译序我接触ARM的历史约4年,早期是很欣赏这类处理器,到了后来切身使用它们的机会越来越多,慢慢地有了感觉,也更加喜欢了。
在偶然听说Cortex‐M3后,我就冥冥地感到它不寻常。
只是因为其它工作一直没有去了解它,直到今年初才进一步学习,很快就觉得相知恨晚。
当时只能看ARM官方的重量级资料,在看到这本书的英文原稿后,更感觉被电到了一样,于是突然有了把它翻译成中文的冲动。
经过累计约150个小时的奋战,终于有了此译稿。
在翻译过程中,我始终采用下列指导思想:1.尽量使用短句,并且把句子口语化。
我认为高深的道理不一定要用高级的语法句型才能表达。
想想看,即使是几位博士互相聊天讨论一个课题,也还是使用口语吧,而且火花往往就是在这种讨论中产生呢!2.多用修辞方法,并且常常引用表现力强的词汇——甚至包括网络用语和脍炙人口的歌词。
另外,有时会加工句子,使得风格像是对话。
这样做的目的是整个文风更鲜活——有点像为写出高分作文而努力的样子。
这点可能与很多学术著作的“严肃、平实”文风不同,也是一次大胆的尝试。
还希望读者不吝给予反馈。
3.在“宏观”上直译,在“微观”上意译。
英语不仅单一句子的语法和汉语不同,并且句子的连贯方式也与汉语不同。
因此在十几个到几十个单词的范围内,我先把它们翻译成脑子里的“中间语言”,再把中间语言翻译成汉语。
这样,就最大地避免了贻笑大方的“英式汉语”。
4.有些术语名词不方便翻译成汉语,或者目前的翻译方式不统一,或者与其它术语翻译的结果很接近,如error和fault,就只能用英语意会。
此时我就保留英文单词,相信这样比硬生生地翻译成汉语还好。
这些词汇主要是:retarget, fault, region等。
另外,英文中有一个很能精练表达“两者都”意思的单词及其用法:”both”,我也常常保留之。
5.图表对颜色的使用比较丰满,尤其是比较大型的插图,相信这样能帮助读者分析和理解。
ARM Cortex-M3相比于ARM其他系列微控制器,具有以下优势或特点:1. 三级流水线+分支预测ARM Cortex-M3与ARM7内核一样,采用适合于微控制器应用的三级流水线,但增加了分支预测功能。
现代处理器大多采用指令预取和流水线技术,以提高处理器的指令执行速度。
流水线处理器在正常执行指令时,如果碰到分支(跳转)指令,由于指令执行的顺序可能会发生变化,指令预取队列和流水线中的部分指令就可能作废,而需要从新的地址重新取指、执行,这样就会使流水线“断流”,处理器性能因此而受到影响。
特别是现代C语言程序,经编译器优化生成的目标代码中,分支指令所占的比例可达10-20%,对流水线处理器的影响会的更大。
为此,现代高性能流水线处理器中一般都加入了分支预测部件,就是在处理器从存储器预取指令时,当遇到分支(跳转)指令时,能自动预测跳转是否会发生,再从预测的方向进行取指,从而提供给流水线连续的指令流,流水线就可以不断地执行有效指令,保证了其性能的发挥。
ARM Cortex-M3内核的预取部件具有分支预测功能,可以预取分支目标地址的指令,使分支延迟减少到一个时钟周期。
2. 哈佛结构从内核访问指令和数据的不同空间与总线结构,可以把处理器分为哈佛结构和普林斯顿结构(或冯.诺伊曼结构)。
冯.诺伊曼结构的机器指令、数据和I/O共用一条总线,这样内核在取指时就不能进行数据读写,反之亦然。
这在传统的非流水线处理器(如MCS51)上是没有什么问题的,它们取指、执行分时进行,不会发生冲突。
但在现代流水线处理器上,由于取指、译码和执行是同时进行的(不是同一条指令),一条总线就会发生总线冲突,必须插入延迟等待,从而影响了系统性能。
ARM7TDMI内核就是这种结构的。
而哈佛结构的处理器采用独立的指令总线和数据总线,可以同时进行取指和数据读写操作,从而提高了处理器的运行性能。
ARMCortex-M3、ARM966E、ARM926EJ、ARM1136JF等内核都采用了哈佛结构。
第3章Cortex-M3内核结构3.1 M3处理器内核结构概述Cortex-M3是一个32位处理器内核,简称M3。
内部的数据总线宽度是32位的,寄存器是32位的,存储器接口也是32位的。
M3采用了哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行不悖。
这样一来数据访问不再占用指令总线,从而提升了性能。
为实现这些特性,M3内部含有好几条总线接口,每条都经过优化,适合自己的应用场合,并且它们可以并行工作。
但是另一方面,指令总线和数据总线共享同一个存储器空间(一个统一的存储器系统)。
换句话说,不是因为有两条总线,可寻址空间就变成8GB了。
比较复杂的应用可能需要更多的存储系统功能,为此M3提供一个可选的MPU,而且在需要的情况下也可以使用外部的高速缓存(Cache)。
另外M3支持大、小端两种存储模式。
M3内部还附赠了好多调试组件,用于在硬件水平上支持调试操作,如指令断点,数据观察点等。
另外,为支持更高级的调试,还有其它可选组件,包括指令跟踪和多种类型的调试接口。
图3-1-1是以Cortex-M3为内核所设计的处理器芯片的一个简化视图。
图3-1-1 Cortex-M3处理器简化视图3.2 M3内核寄存器M3寄存器组包括通用寄存器和特殊功能寄存器两部分。
如图3-2-1所示,M3处理器拥有16个通用寄存器R0-R15和5个特殊功能寄存器,下面对其分类介绍。
进程堆栈寄存器s图3-2-1 Cortex-M3寄存器3.2.1 通用寄存器1)通用寄存器R0-R12。
R0--R12是完全通用32位寄存器,用于数据操作,而绝大多数16位Thumb 指令只能访问R0-R7,而32位Thumb-2指令可以访问所有寄存器。
2)堆栈指针R13/SP。
M3拥有两个堆栈指针SP分组,即MSP和PSP,是两个完全独立的物理寄存器空间,但在任一时刻只能使用2个分组中的一个。
堆栈指针寄存器使用的有关说明如下:♦主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程);♦进程堆栈指针(PSP):由用户的应用程序代码使用;♦堆栈指针的最低两位永远是0,堆栈总是4字节对齐的。
TOPICALDISCUSS 专题论述 paper@mesnet.com.cn(投稿专用) 2009年第2期Microcontrollers&EmbeddedSystems
15
Cortex2M3的异常处理机制研究■武汉理工大学 方安平 蔡俊宇 摘 要详细阐述Cortex2M3异常的分类、优先级、进入和退出,以及在Cortex2M3异常处理机制中使用的新技术———迟到(late2arriving)和尾链(tail2chaining);最后,比较Cortex2M3和ARM7异常控制机制的区别,
并量化分析迟到和尾链技术在异常处理中的优越性。
关键词Cortex2M3 异常 迟到 尾链 中断控制器
引 言Cortex2M3是ARM公司第一款基于ARMv72M的微控制器内核,在指令执行、异常控制、时钟管理、跟踪调试和存储保护等方面相对于ARM7有很大的区别。尤其在异常处理机制方面有很大的改进,其异常响应只需要12个时钟周期。NVIC(NestedVectoredInterruptController,嵌套向量中断控制器)是Cortex2M3处理器的一个紧耦合部件,
可以配置1~240个带有256个优先级、8级抢占优先权的物理中断,为处理器提供出色的异常处理能力[1]。同时,抢占(pre2emption)、尾链(tail2chaining)、迟到(late2arriving)技术的使用,大大缩短了异常事件的响应时间。异常或者中断是处理器响应系统中突发事件的一种机制。当异常发生时,Cortex2M3通过硬件自动将编程计数器(PC)、编程状态寄存器(xPSR)、链接寄存器(LR)和R0~R3、R12等寄存器压进堆栈。在Dbus(数据总线)保
存处理器状态的同时,处理器通过Ibus(指令总线)从一个可以重新定位的向量表中识别出异常向量,并获取ISR
函数的地址,也就是保护现场与取异常向量是并行处理的。一旦压栈和取指令完成,中断服务程序或故障处理程序就开始执行。执行完ISR,硬件进行出栈操作,中断前的程序恢复正常执行。图1为Cortex2M3处理器的异常处理流程[2]。
图1 Cortex2M3异常处理流程维护和扩展。可重构数字图像并行处理系统为多媒体图像处理提供了一个非常有价值的发展方向。
参考文献[1]陈雪松.CT图像重建的可扩展多DSP并行计算系统结构[J].清华大学学报:自然科学版,2004,44(3).[2]MurphyCW,HarveyDM,NicolsonLJ.LowCostTMS320C4O/XC6200BasedReconfigurableParallelImageProcessingArchitecture[C].Proc.ofIEEColloquiumonReconfigurableSystems,Glasgow,UK.1999:91295.[3]MucheroniML,MoronCE,SaitoJH.ArchMDSP:Using
DSPsforParallelImageProcessing[C].Proceedingsofthe23rdEuromicroConference,1997:5842590.[4]陈国良,并行计算机体系结构[M].北京:高等教育出版社,2002:762127.[5]张天序,等.图像处理系统中的新型动态重构技术[J].计算机工程,2007,33(17).
赵振华(硕士研究生),主要研究方向为嵌入式系统开发;郑红(教授、博士生导师),主要研究方向为嵌入式系统设计、数字信号处理、专家系统等。
(收稿日期:2008209222) 专题论述 TOPICALDISCUSS
16
2009年第2期
adv@mesnet.com.cn(广告专用)
1 Cortex2M3异常类型同ARM7相比,Cortex2M3在异常的分类和优先级上有很大的差异,如表1所列。表1 Cortex2M3异常类型及优先级偏移异常类型优先级0—初始堆栈指针1复位-32不可屏蔽中断-23硬故障-14存储管理可配置5总线故障可配置36应用故障可配置3偏移异常类型优先级7~10——11SVcall可配置
3
12调试监视异常可配置3
13——14PendSV可配置
3
15SysTick可配置
3
≥16
外部
中断可配置3
3 该异常的优先级可调整,可设置范围是NVIC优先级范围值0~N。N为可执行的最高优先级,系统复位时清0。在这里,用户可配置的最高优先级为4。
Cortex2M3将异常分为复位、不可屏蔽中断、硬故障、存储管理、总线故障和应用故障、SVcall、调试监视异常、PendSV、SysTick以及外部中断等。Cortex2M3采用向量表来确定异常的入口地址。与大多数其他ARM内核不同,Cortex2M3向量表中包含异常处理程序和ISR
的地址,而不是指令。复位处理程序的初始堆栈指针和地址必须分别位于0x0和0x4。这些值在随后的复位中被加载到适当的CPU寄存器中。向量表偏移控制寄存器将向量表定位在CODE(Flash)或SRAM中。复位时,
默认情况下为CODE模式,但可以重新定位。异常被接受后,处理器通过Ibus查表获取地址,执行异常处理程序。在Cortex2M3的优先级分配中,较低的优先级值具有较高的优先级。NVIC将异常的优先级分成两部分:抢占优先级(pre2emptionpriority)部分和子优先级(sub2priority)部分,可以通过中断申请/复位控制寄存器来确定两个部分所占的比例。抢占优先级和子优先级共同作用确定了异常的优先级。抢占优先级用于决定是否发生抢占,一个异常只有在抢占优先级高于另一个异常的抢占优先级时才能发生抢占。当多个挂起异常具有相同的抢占优先级时,子优先级起作用[3]。通过NVIC设置的优先级权限高于硬件默认优先级。当有多个异常具有相同的优先级时,则比较异常号的大小,异常号小的被优先激活。2 Cortex2M3异常处理2.1 异常的进入当一个异常出现以后,Cortex2M3处理器由硬件通过Dbus保存处理器状态,同时通过Ibus读取向量表中的SP,更新PC和LR,执行中断服务子程序。为了应对堆栈操作阶段到来后的更高优先级异常,Cortex2M3支持迟到和抢占机制,以便对各种可能事件做出确定性的响应。抢占是一种对更高优先级异常的响应机制。Cortex2M3异常抢占的处理过程[2]如图2所示。当新的更高优先级异常到来时,处理器打断当前的流程,执行更高优先级的异常操作,这样就发生了异常嵌套。迟到是处理器用来图2 异常抢占流程加速抢占的一种机制。如果一个具有更高优先级的异常在上一个异常执行压栈期间到达,则处理器保存状态的操作继续执行,因为被保存的状态对于两个异常都是一样的。但是,NVIC马上获取的是更高优先级的异常向量地址。这样在处理器状态保存完成后,开始执行高优先级异常的ISR。2.2 异常的返回Cortex2M3异常返回的操作[2]如图3所示。当从异常中返回时,处理器可能会处于以下情况之一[4]:◆尾链到一个已挂起的异常,该异常比栈中所有异常的优先级都高;◆如果没有挂起的异常,或是栈中最高优先级的异常比挂起的最高优先级异常具有更高的优先级,则返回到最近一个已压栈的ISR;◆如果没有异常已经挂起或位于栈中,则返回到Tread模式。为了应对异常返回阶段可能遇到的新的更高优先级异常,Cortex2M3支持完全基于硬件的尾链机制,简化了激活的和未决的异常之间的移动,能够在两个异常之间没有多余的状态保存和恢复指令的情况下实现back2to2back
处理。尾链发生的2个条件[2]:异常返回时产生了新的
异常;挂起的异常的优先级比所有被压栈的异常的优先级都高。尾链发生后,Cortex2M3处理过程如图3中尾链分支所示。这时,Cortex2M3处理器终止正在进行的出栈操作并跳过新异常进入时的压栈操作,同时通过Ibus立即取出挂起异常的向量。在退出前一个ISR返回操作6个周TOPICALDISCUSS 专题论述 paper@mesnet.com.cn(投稿专用) 2009年第2期Microcontrollers&EmbeddedSystems
17
期后,开始执行尾链的ISR。图3 异常的返回3 Cortex2M3和ARM7中断控制器比较在过去的十年中,基于ARMv4的ARM7系列微控制器广泛应用在各个领域。在ARM7系列中,并没有对中断进行独立的服务,而是通过牺牲处理器一定的性能来换取有效的中断响应和中断处理机制。Cortex2M3高度耦合的NVIC可以实现硬件中断处理,同时支持迟到和尾链机制,加快了异常响应的速度,充分发挥了处理器的性能。图4为Corex2M3和ARM7在中断控制器结构方面的差异。比较可知,NVIC是直接作为Cortex2M3处理器的图4 Cortex2M3和ARM7中断控制器结构的差异表2 Cortex2M3和ARM7中断控制器功能和实现方式的差异项 目Cortex2M3ARM7中断控制器集成式NVIC外部VIC/GICa中断优先级硬件管理中断控制器管理,需VIC和内核间的交互操作中断进入硬件管理(汇编)软件管理中断进入开销b12周期26周期中断退出硬件管理(汇编)软件管理中断退出开销b12周期16周期中断嵌套硬件管理(汇编)软件管理进入核心中断源多达256个2个(FIQ,IRQ)执行状态Thumb22ARM不可屏蔽中断支持不支持 a VIC为向量中断控制器,GIC为通用中断控制器。b 在没有发生迟到或尾链的情况下。一部分,集成在处理器核内部;而VIC只是游离在ARM7
内核的外围,这样就必然占用内核资源,影响了处理速度。Cortex2M3和ARM7中断控制器在功能和实现方式上的差异如表2所列。3.1 处理器响应单个异常Cortex2M3和ARM7异常处理过程如图5所示。
图5 Cortex2M3和ARM7异常处理过程ARM7处理器的异常开销:TARM7=TARM7_PUSH+TARM7_POP=26+16=42周期
图6 NVIC对迟到的具有更高优先级异常的响应 Cortex2M3处理器的异常开销:
TCorelx2M3=TM3_PUSH+TM3_POP=12+12=24周期 其中,TARM7为ARM7处理异常的时间开销;
TARM7_PUSH和TARM7_POP
为ARM7进行压栈和出栈的操作时
间;TCoretx2M3为Cortex2M3处理异常的时间开销;TM3_PUSH和TM3_POP
为Cortex2M3进行压栈和出栈的操作时间。
可见,由于采用处理器状态硬件保存,Cortex2M3处理器少用了18周期,节省了42.8%的异常开销。3.2 处理器响应迟到异常Cortex2M3和ARM7在处理迟到高优先级异常时的差异如图6所示。当IRQ2正在为执行ISR2保存处理器状态时,迟到了一个优先级更高的异常IRQ1。这时ARM7继续进行压栈操作。在压栈操作完成后,ARM7继续为执行ISR1