版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章Cortex-M3内核原理(2)第2章Cortex-M3内核原理(2)本章主要学习内容:1.Cortex-M3微处理器内部结构2.Cortex-M3寄存器3.Cortex-M3存储器管理Cortex-M3处理器工作模式4.1Cortex-M3处理器工作模式4.2Cortex-M3处理器工作状态5.Cortex-M3异常与中断6.Cortex-M3堆栈7.Cortex-M3CoreSight调试与跟踪系统8.Cortex-M3内核的其他特性4.1Cortex-M3处理器工作模式Cortex‐M3支持两种模式和两个特权等级。Handler模式错误的用法线程模式线程模式用户级特权级异常Handler的代码主应用程序的代码Cortex‐M3处理器的工作模式和特权等级共有三种配合。线程模式+用户级线程模式+特权级Handler模式+特权级复位后,处理器首先进入线程模式+特权级。复位Reset4.1Cortex-M3处理器工作模式在“线程模式+用户级”下,禁止访问包含配置寄存器以及调试组件寄存器的系统控制空间(SCS);P39禁止使用MSR访问除APSR外的特殊功能寄存器。在特权级下(“处理模式or线程模式”)可通过置位CONTROL[0]来进入用户级;不管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程;异常返回后将回到产生异常之前的特权级。用户级下(“线程模式”)代码不能再试图修改CONTROL[0]来回到特权级。它必须通过产生异常,并通过异常处理程序程序(处于特权级下)来修改CONTROL[0],才能在线程模式拿到特权级。4.1Cortex-M3处理器工作模式特权级和处理器模式的切换4.1Cortex-M3处理器工作模式•按特权级和用户级区分代码,有利于架构的安全和健壮。
例如,当用户代码出问题时,因其被禁止写特殊功能寄存器和NVIC中寄存器,不会影响系统中其他代码的正常运行。•为了避免系统堆栈因应用程序的错误使用而毁坏,给应用程序专门配一个堆栈,不让它共享操作系统内核的堆栈。
在这个管理制度下,运行在线程模式的用户代码使用PSP,而异常服务例程则使用MSP。这两个堆栈指针的切换是全自动的,就在出入异常服务例程时由硬件处理。4.1Cortex-M3处理器工作模式•特权等级和堆栈指针的选择均由CONTROL负责。
(1)当CONTROL[0]=0时,表示“线程模式+特权级”状态。因为
只能在特权级进行Control寄存器的设置。因此,在异常处理的始末, 处理器始终处于特权级,仅仅进行处理器模式的转换。CONTROL[0]=0CONTROL[1]=0CONTROL[0]=0CONTROL[1]=0CONTROL[0]=0CONTROL[1]=04.1Cortex-M3处理器工作模式•特权等级和堆栈指针的选择均由CONTROL负责。
(2)若CONTROL[0]=1(线程模式+用户级),则在中断响应的始 末,处理器模式和特权等级都要发生变化。CONTROL[0]=1CONTROL[1]=1CONTROL[0]=1CONTROL[1]=1CONTROL[0]=1CONTROL[1]=0•CONTROL[0]有在特权级下才能访问。用户级的程序如想进入特权级,通常都是使用一条“系统服务调用指令(SVC)”来触发“SVC异常”,该异常的服务例程可以选择修改CONTROL[0]。4.1Cortex-M3处理器工作模式4.2Cortex-M3处理器工作状态•Cortex-M3处理器有两种工作状态:①Thumb-2工作状态:Thumb-2指令执行状态。②调试工作状态:处理器停机调试时(inhaltingdebug)进入该状态。第2章Cortex-M3内核原理(2)本章主要学习内容:1.Cortex-M3微处理器内部结构2.Cortex-M3寄存器3.Cortex-M3存储器管理4.Cortex-M3处理器工作模式5.Cortex-M3异常与中断5.1异常与中断5.2向量表5.3中断输入及挂起5.4中断的具体行为5.5高级中断操作5.6异常返回值5.7Fault类异常6.Cortex-M3堆栈7.CoreSight调试与跟踪系统8.Cortex-M3内核的其他特性5.1异常与中断•中断系统,是为CPU具备随机事件的实时处理能力而设置的。•所谓中断,是指CPU对系统内、外发生的某个事件的一种响应过程,或者说“一种机制”,即CPU暂时停止现行程序的执行,自动转去执行预先安排好的处理该事件的服务子程序;当处理结束后,再返回到被暂停的程序的断点处,继续执行原来的程序。•实现中断功能的软、硬件系统,称之为“中断系统”。“中断”系统的随机事件的处理机制:•中断源:如何表征随机事件?•中断的响应与返回:环境、现场(状态、断点)•优先级控制:多个随机事件发生,请求CPU服务的情形•实时性悖论(问题):被暂停程序的实时性如何保证?5.1异常与中断
•事件,为触发系统状态改变的某种行为(消息或请求等,消息 或请求由某个对象发出,并由某个对象接收和处理。)
•凡是能打断程序顺序执行的事件都称为异常。
•异常的处理:CPU中止正在运行的程序进入特权状态去执行特 定的指令或程序。
•根据触发源的不同,一般将异常分为同步异常和异步异常。同步异常是指与CPU当前执行的指令密切相关、造成CPU正常运行状态被中止的系统事件(或称内部事件),如指令未定义、指令预取中止、数据访问中止等。异步异常则是由于外部事件的触发而产生的,与CPU当前执行的指令无关,故被称为异步异常。复位即属于异步异常。异常与中断(续)•由于微处理器内部事件或外部事件(外设请求服务),引起CPU中止正在运行的程序,转去执行相应的其他程序(一般称之为服务程序),完毕后再返回被中止的程序,这一过程被称为中断。•异常是事件的子集,中断则是处理各种异常和外设请求服务的一种机制或方式。•CPU与外部设备之间的数据交换,可以采取无条件传送、查询传送,也可以采用中断的方式。若采取中断的方式,相应的服务程序一般被称作“中断服务(子)程序”。5.1异常与中断大多数教材,对异常和中断不加特别的区分。程序代码也可以通过系统调用主动请求进入异常/中断状态的。常见的异常/中断有:外部中断非法指令操作非法数据访问错误(总线错误、存储器错误、用法错误、硬错误)不可屏蔽中断等5.1异常与中断Cortex‐M3内核集成了中断控制器——嵌套向量中断控制器NVIC(NestedVectoredInterruptController)。NVIC具有以下功能:可嵌套中断支持。向量中断支持。动态优先级调整支持。软件可以在运行时期更改中断的优先级。如果在 某ISR中修改了自己所对应中断的优先级,而且这个中断又有新的实例处 于挂起中(pending),也不会自己打断自己,从而没有重入(reentry)风险。中断延迟大大缩短。Cortex‐M3为了缩短中断延迟,引入自动的现场保护和恢复等措施,缩短中断嵌套时的ISR间延迟。中断可屏蔽。既可以屏蔽优先级低于某个阈值的中断/异常(设置
BASEPRI寄存器),也可以全体封杀(设置PRIMASK和FAULTMASK寄存器)。
这是为了让时间苛求(timecritical)的任务能在时限(deadline)到来前完成,而不被干扰。5.1异常与中断•Cortex-M3内核中的NVIC支持总共256种异常和中断。•中断编号为1-15的对应系统异常,大于等于16的则
全是外部中断,通常外部中断写作IRQs。•NVIC还有一个非屏蔽中断(NMI)输入。•因为芯片设计商可以修改Cortex-M3的硬件描述源代 码,所以最终芯片支持的中断源数目常常不到240个,且优先级的位数也由芯片设计商最终决定。5.1异常与中断•NVIC的访问地址是0xE000E000,•除软件触发中断寄存器可以在用户级下访问外,其他所有NVIC的中断控制/状态寄存器都只能在特权级下访问。•所有的中断控制/状态寄存器均可按字/半字/字节的方式访问。•中断屏蔽寄存器的内容设置,只能通过MRS/MSR及CPS指令来访问。5.1异常与中断•Cortex-M3系统异常5.1异常与中断•外部中断
编号1617…
类型IRQ#0IRQ#1…
优先级可编程可编程…
简介外中断#0外中断#1…255IRQ#239可编程外中断#2395.1异常与中断•异常/中断优先级优先级,会影响一个异常是否能被响应,以及何时可以响应。优先级的数值越小,则优先级越高。Cortex-M3支持中断嵌套,使得高优先级异常会抢占低优先级异常。原则上,Cortex-M3支持多达256级的可编程优先级,并且支持128级抢占。但是,绝大多数Cortex-M3芯片都会精简设计,以致实际上支 持的优先级数会更少,如8级,16级,32级等。它们在设计时会裁掉表达优先级的几个低端有效位,以达到减少优先级数的目的。Cortex-M3有3个系统异常:复位、NMI以及硬fault,它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其它异常。所有其它异常的优先级则都是可编程的,但不能编程为负数。5.1异常与中断•例5:使用3个位来表达优先级的情况•优先级为:0x00(优先级最高)、0x20、0x40、0x60、0x80、0xA0、0xC0以及0xE0(优先级最低)。•Cortex-M3允许的最少使用位数为3位,亦即至少要支持8级优先级。5.1异常与中断•通过让优先级以MSB对齐,可以简化程序的跨器件移植。如果一个程序早先在支持4位优先级的器件上运行, 在移植到只支持3位优先级的器件后,其功能不受影响。但若是对齐到LSB,则会使MSB丢失,导致数值大于
7的低优先级级别升高,甚至出现优先级反转。如8号 优先级因为损失了MSB,现在反而变成0号了!支持的优先级位数为8位时,优先级数目就达到了256级。5.1异常与中断•Cortex-M3除配置优先级外,还通过把256级优先级分为抢占优先级和亚优先级支持最多128个抢占级。•抢占优先级决定了抢占行为,即当系统正在响应某异常E5时,如果来了抢占优先级更高的异常E2,则E2可以抢占E5。•亚优先级则处理“内务”,即当抢占优先级相同的异常有不止一个挂起时,在当前任务完成后就优先响应亚优先级最高的异常,即使当前正在执行的任务的亚优先级比较低。•优先级分组规定:亚优先级至少是1位,因此抢占优先级最多是7位,128级抢占优先级。5.1异常与中断•抢占优先级和亚优先级的表达,位数与分 组位置的关系优先级组
0 1 2 3 4 5 6 7表达抢占优先级的位段
[7:1] [7:2] [7:3] [7:4] [7:5] [7:6] [7:7]
无表达亚优先级的位段
[0:0] [1:0] [2:0] [3:0] [4:0] [5:0] [6:0] [7:0](所有位)5.1异常与中断
•NVIC中有一个“应用程序中断及复位控制寄存器(AIRCR)(地址:
0xE000ED00)”,它里面有一个位段名为“优先级组(PRIGROUP)”, 其值对每一个优先级可配置的异常都有影响。名称类型复位值描述31:16VECTKEYRW‐访问钥匙:任何对该寄存器的写操作,都必须同时把0x05FA写入此段,否则写操作被忽略。若读取此半字,则0xFA0515ENDIANESSR‐指示端设置。1:大端(BE8)0:小端。此值是在复位时确定的,不能更改。10:8 2 1 0
PRIGROUP
SYSRESETREQVECTCLRACTIVE VECTRESETR/W W W W0‐‐‐优先级分组,表示当前从第几位开始分组。请求芯片控制逻辑产生一次复位清零所有异常的活动状态信息。通常只在调试时用,或者在OS从错误中恢复时用。复位Cortex-M3处理器内核(调试逻辑除外),但是此复位不影响芯片上在内核以外的电路5.1异常与中断•例6:采用3位来表达优先级([7:5]),并 且优先级组的值是5(从比特5处分组), 则你得到4级抢占优先级,且在每个抢占优 先级的内部有2个亚优先级。5.1异常与中断•Cortex-M3允许所有的位都表达亚优先级,此时没有任何位表达抢占优先级,因而所有优先级可编程的异常之间就不会发生抢占,这意味Cortex-M3的中断嵌套机制失效。•当然这对于复位、NMI和硬fault三个最高优先级无效,即它们无论何时出现,都立即无条件抢占所有优先级可编程的异常。5.2向量表•Cortex-M3拥有一张向量表,用于在发生中断并作出响应时,从表中查询与中断对应的处理例程的入口地址向量。•缺省情况下,Cortex-M3认为该表位于零地址处。•上电后的向量表:5.2向量表•地址0处应该存储引导代码(BootStrap),所以它通常是Flash或者是ROM器件,并且它们的值不得在运行时改变。•Cortex-M3允许向量表重定位——从其它地址处开始定位各异常 向量。这些地址对应的区域可以是代码区,但也可以是RAM区。•在RAM区就可以修改向量的入口地址。为了实现这个功能,
NVIC中有一个寄存器,称为“向量表偏移量寄存器”(在地址
0xE000_ED08处),通过修改它的值就能定位向量表。•但必须注意的是:向量表的起始地址是有要求的:必须先求出系统中共有多少个向量,再把这个数字向上增大到是2的整次幂,而起始地址必须对齐到后者的边界上。•例如,如果一共有32个中断,则共有32+16(系统异常)=48
个向量,向上增大到2的整次幂后值为64,因此合法的起始地址 可以是:0x0,0x100,0x200等。5.2向量表•向量表偏移量寄存器(VTOR)(地址:0xE000_ED08)5.2向量表•如果需要动态地更改向量表,则对于任何器件来说,向量表的起始处都必须包含以下向量:主堆栈指针(MSP)的初始值复位向量NMI硬fault服务例程•后两者也是必需的,因为有可能在引导过程中发生这两种异常。•可以在SRAM中开出一块用于存储向量表。然后在引导完成后,就可以启用内存中的向量表,从而实现向量可动态调整的功能。5.3中断输入及挂起若当前中断优先级较低,该中断就被挂起,并对其挂起状态进行标记。即使后来中断源取消了中断请求,在系统所有中断中它的优先级最高时,也会因为其挂起状态标记而得到响应,如图所示。5.3中断输入及挂起但是,如果中断得到响应之前,其挂起状态被清除了(例如,在PRIMASK或FAULTMASK置位的时候,软件清除了挂起状态标志),则中断被取消,如图所示。5.3中断输入及挂起•当某中断的服务例程开始执行时,此中断进入“活跃” 状态,并且其挂起位会被硬件自动清除,如图所示。中断服务例程执行完毕且中断返回后,才能对该中断的新请求予以响应(即单实例)。新请求的响应亦是由硬件自动清零挂起标志位。中断服务例程也可以在执行过程中把自己对应的中断重新挂起。5.3中断输入及挂起•如果中断请求信号一直保持,则该中断就会在其 上次服务例程返回后再次被置为挂起状态,如图 所示。5.3中断输入及挂起•如果某个中断在得到响应之前,其请求信 号以多个脉冲形式呈现,则被视为只有一 次中断请求,多出的请求脉冲全部错失。•如果在服务例程执行时,中断请求释放了,
但是在服务例程返回前又重新被置为有效,则Cortex-M3会记住此动作,重新挂起该中断。5.4中断的具体行为①特权线程模式→特权handler模式②用户线程模式→特权handler模式③特权handler模式→特权handler模式嵌套(抢占)非抢占咬尾中断(后到中断优先级低于前者,“非抢占”&“嵌套”)迟到中断(后者优先级高,“嵌套”)异常(中断)行为的3种情形5.4中断的具体行为①特权线程模式→特权handler模式CONTROL[0]=0CONTROL[1]=0CONTROL[0]=0CONTROL[1]=0CONTROL[0]=0CONTROL[1]=05.4中断的具体行为②用户线程模式→特权handler模式CONTROL[0]=1CONTROL[1]=1CONTROL[0]=1CONTROL[1]=0CONTROL[0]=1CONTROL[1]=15.4中断的具体行为一、中断响应•当Cortex-M3响应一个中断时,依次执行下列操作:①保护现场:I.II.II.依次把xPSR,PC,LR,R12以及R3‐R0等8个寄存器内容由硬件自动压入当前堆栈;更新堆栈指针SP(MSP/PSP)和PSR状态寄存器,如IPSR段的中断号;链接寄存器LR自动更新为EXC_RETURN(特权级+工作模式)②从向量表中找出对应的服务程序入口地址,更新程序计数器PC;•同时,NVIC也会更新相关寄存器。例如,新响应异常的挂起位 将被清除,同时其活动位将被置位。特别注意:当前的代码正在使用PSP,则压入PSP,使用线程堆栈;否则压入MSP,使用主堆栈。一旦进入了服务例程,就将一直使用主堆栈。5.4中断的具体行为二、中断返回•当异常服务例程执行完毕后,应当返回先前被中断程序得以继续执行。•有3种途径可以触发异常返回操作。5.4中断的具体行为中断返回•进入异常服务程序后,LR的值被自动更新为特殊的
EXC_RETURN,这是一个高28位全为1的值,只有[3:0]的值 有特殊含义。•当异常服务例程把这个值送往PC时,就会启动处理器的中 断返回序列。
位段[31:4] 3 2 1 0
含义EXC_RETURN的标识:必须全为10:返回后进入Handler模式1:返回后进入线程模式0:从主堆栈中做出栈操作,返回后使用MSP,1:从进程堆栈中做出栈操作,返回后使用PSP保留,必须为00:返回ARM状态。1:返回Thumb状态。在Cortex-M3中必须为15.4中断的具体行为EXC_RETURN0xFFFF_FFF10xFFFF_FFF90xFFFF_FFFD功能返回handler模式返回特权线程模式,并使用主堆栈(SP=MSP)返回用户线程模式,并使用线程堆栈(SP=PSP)
•合法的EXC_RETURN值及其功能5.4中断的具体行为中断返回时的执行内容(顺序):•恢复中断现场:栈中的寄存器内容出栈; 内部的出栈顺序与入栈时的相对应,后进 先出。•更新NVIC寄存器:NVIC的活动位也被硬件清除。注意:对于外部中断,倘若中断输入再次被置为有效,挂起位也将再次置位,新一次的中断响应序列也将再次开始。5.4中断的具体行为三、中断嵌套控制•Cortex-M3内核配合NVIC提供了完备的中断嵌套控制。•在程序中,通过为每个中断建立适当的优先级,就可以实施中断嵌套控制。表现在:
通过对NVIC以及Cortex-M3处理器相关寄存器的设置,可以方便地确定中断源的优先级。系统正在处理相应某个异常时,所有优先级不高于它的异常都不能抢占它,且它自己也不能抢占自己。自动入栈和出栈,能及时保存相关寄存器内容,不至于中断嵌套发生时寄存器内容受损。5.4中断的具体行为中断嵌套控制5.4中断的具体行为•但是需要注意堆栈溢出现象。所有服务例程都只使用主堆栈。每嵌套一级,就至少再需要8
个字,即32字节的堆栈空间(不包括中断服务程序自身状态保存对堆栈的额外需求)。当中断嵌套层次很深时,对主堆栈的容量空间压力会增大,甚至出现堆栈容量用光,导致堆栈溢出。堆栈溢出对系统正常运行是很致命的,可能造成系统功能紊乱,出现程序跑飞/死机。•同时,还需注意相同异常的不可重入特性。因为每 个异常都有自己的优先级,并且在异常处理期间, 同级或低优先级的异常是要阻塞的,即对于同一优 先级的多个异常,只有在上次实例的服务例程执行 完毕后,方可继续响应新的请求。5.5高级中断操作•咬尾中断–当处理器在响应某异常时,如果又发生其它异常,但它们优 先级不够高,则被阻塞。那么中断返回时正常操作流程为:POP以恢复系统现场系统处理挂起的异常PUSH以保存系统现场,然后进入中断服务程序–显然,POP和PUSH所涉及到的系统现场是一样的,这个操作会白白浪费CPU时间。–正因此,Cortex-M3提供了“咬尾中断”来减少不必要的操作, 通过继续使用上一个异常已经PUSH好的系统现场,在本次异常完成后才执行现场恢复。–好像“后一个异常把前一个的尾巴咬掉了”,前前后后只执行了一次入栈/出栈操作5.5高级中断操作•咬尾中断示意图5.5高级中断操作异常咬尾与常规处理的比较5.5高级中断操作•晚到中断处理Cortex-M3在入栈时能够提供一种高效的操作模式,称为“晚到中断处理”:当Cortex-M3对某异常的响应序列还处在入栈的阶段,尚未执行其服务例程时,如果此时收到了高优先级异常的请求,则本次入栈就成了为高优先级中断所做的入栈操作,并进一步执行高优先级异常的服务例程。注意:晚到中断处理的时机问题!5.5高级中断操作例7:若在响应某低优先级异常#1的早期,检测到了高优先级异常#2,则只要#2没有太晚,就能以“晚到中断”的方式处理,在入栈完毕后执行ISR#2。5.5高级中断操作例7-1:•如果异常#2来得太晚,以至于ISR#1的指令已经开始执行,则按普通的抢占处理,这会需要更多的处理器时间和额外32字节的堆栈空间。•在ISR#2执行完毕后,则以刚刚讲过的“咬尾中断”方式,来启动ISR#1的执行。5.6异常返回值•进入异常服务程序后,LR的值被自动更新 为特殊的EXC_RETURN,这是一个高28位 全为1的值,只有[3:0]的值有特殊含义。位段[31:4] 3 2 1 0
含义EXC_RETURN的标识:必须全为10:返回后进入Handler模式1:返回后进入线程模式0:从主堆栈中做出栈操作,返回后使用MSP,1:从进程堆栈中做出栈操作,返回后使用PSP保留,必须为00:返回ARM状态。1:返回Thumb/Thumb-2状态。在Cortex-M3中必须为15.6异常返回值•合法的EXC_RETURN值只有3个:EXC_RETURN数值
0xFFFF_FFF1 0xFFFF_FFF9 0xFFFF_FFFD
功能返回handler模式返回线程模式,并使用主堆栈(SP=MSP)返回线程模式,并使用线程堆栈(SP=PSP)5.6异常返回值•如果主程序在线程模式下运行,并且在使用MSP时被中断,则在服务例程中LR=0xFFFFFFF9(主程序被打断前的LR已被自动入栈。5.6异常返回值•如果主程序在线程模式下运行,并且在使用PSP时被中断,则在服务例程中LR=0xFFFFFFFD(主程序被打断前的LR已被自动入栈)。5.6异常返回值•如果主程序在Handler模式下运行,则在服务例程中
LR=0xFFFF_FFF1。这时的“主程序”,其实更可能是被 抢占的服务例程。事实上,在嵌套时,更深层ISR所看到 的LR总是0xFFFF_FFF1。5.7Fault类异常Cortex-M3中的Faults可分为以下几类:总线faults当AHB接口上正在传送数据时,如果回复了一个错误信号,则会产生总线faults。如指令预取流产、数据读写流产、入栈错误、出栈错误;无效存储器区段访问、设备数据传送未准备好等。存储器管理faults存储器管理faults多与MPU有关,其诱因常常是某次访问触犯了MPU设置的保护策略。如在不可执行的存储器区域试图取指,也会触发该Falut,而且即使没有MPU也会触发。另外,访问了MPU设置区域覆盖范围之外的地址、访问了没有存储器与之对应的空地址、往只读region写数据、用户级下访问了只允许在特权级下访问的地址。等等用法faults若执行了未定义的指令、执行了协处理器指令(Cortex‐M3不支持协处理器,但是可以通过fault异常机制来使用软件模拟协处理器的功能,从而可以方便地在其它Cortex处理器间移植)、尝试进入ARM状态(因为Cortex-M3不支持ARM状态,所以用法fault会在切换时产生。软件可以利用此机制来测试某处理器是否支持ARM状态)、存在无效的中断返回(LR中包含了无效/错误的值)、使用多重加载/存储指令时,没有对齐地址等等都会触发用法Faults。硬fault硬fault是上文讨论的总线fault、存储器管理fault以及用法fault上访的结果。在NVIC中有一个硬fault状态寄存器(HFSR),它指出产生硬fault的原因。如果不是由于取向量造成的,则硬fault服务例程必须检查其它的fault状态寄存器,以最终决定是谁上访的。5.7Fault类异常在软件开发过程中,我们可以根据各种fault状态寄存器的值来判定程序错误,并且改正它们。如果系统中运行了一个RTOS,通常是终结肇事的任务。应付fault的常用方法:复位。通过设置NVIC“应用程序中断及复位控制寄存器”中的VECTRESET位,将 只复位处理器内核而不复位其它片上设施。有些Cortex-M3芯片可以使用该寄存器的
SYSRESETREQ位来复位。这种只限于内核中的复位不会复位其它系统部件。恢复:在一些场合下,还是有希望解决产生fault的问题的。例如,如果程序尝试访 问了协处理器,可以通过一个协处理器的软件模拟器来解决此问题——当然是以牺牲性能为代价的。中止相关任务:如果系统运行了一个RTOS,则相关的任务可以被终结或者重新开始。各个fault状态寄存器(FSRs)都保持住它们的状态,Fault服务例程在处 理了相应的fault后不要忘记清除这些状态,否则如果下次又有新的
fault发生时,服务例程在检视fault源时,无法判断哪个fault是新发生 的。作业31、在主程序处于以下三种情境下时,系统响应中断,则在中断服务程序中LR的值分别是什么?1)线程模式、使用MSP;2)线程模式、使用PSP;3)Handler模式。2、简述Cortex-M3的中断响应及中断返回的过程。第2章Cortex-M3内核原理(2)本章主要学习内容:1.Cortex-M3微处理器内部结构2.Cortex-M3寄存器3.Cortex-M3存储器管理4.Cortex-M3处理器工作模式5.Cortex-M3异常与中断6.Cortex-M3堆栈7.CoreSight调试与跟踪系统8.Cortex-M3内核的其他特性6.Cortex-M3堆栈•堆栈操作就是对内存的读写操作,但是其地址由专门的寄存器——堆栈指针SP给出,其数据操作模式满足先进后出(FILO,FirstInLastOut)的规则。•正常情况下,PUSH与POP必须成对使用,还要特别注意进出栈 数据的顺序。当PUSH/POP指令执行时,SP指针的值也跟着自 减/自增。•寄存器列表堆栈(满降)操作方式,汇编器都将把它们升序排序:PUSH指令按照从大到小的顺序依次入栈;POP则按从小到大的顺序依次出栈。6.Cortex-M3堆栈•Cortex‐M3使用的是“向下生长的满栈”模型。堆栈是按字操作的,即每次入栈和出栈都是32位数据,因此SP值总是执行自增/减4操作。堆栈指针SP指向最后一个被压入堆栈的32位数值。•ARM体系架构有4种堆栈生长方式:满增、满降、空增、空降。6.Cortex-M3堆栈Cortex-M3中断响应的入栈操作6.Cortex-M3堆栈•Cortex-M3的双堆栈机制:①主堆栈MSP;②进程堆栈PSP。由CONTROL[1]来控制堆栈的选择。6.Cortex-M3堆栈•当CONTROL[1]=0,只使用MSP,此时用户 程序和异常handler共享同一个堆栈。这也是复位后的缺省使用方式。6.Cortex-M3堆栈•当CONTROL[1]=1,进入异常时的自动压栈使用的是进程堆栈PSP,进入异常handler后才自动改为MSP,退出异常时切换回PSP,并且从进程堆栈上弹出数据。6.Cortex-M3堆栈•异常/中断的返回可分为两个阶段:①LR中EXC_RETURN值→PC;②压栈数据出栈。6.Cortex-M3堆栈•在特权级下,可以指定具体的堆栈指针,而不受当前使 用堆栈的限制,例如:MRSR0,MSPMSRMSP,R0MRSR0,PSPMSRPSP,R0;读取主堆栈指针到R0 ;写入R0的值到主堆栈中
;读取进程堆栈指针到R0 ;写入R0的值到进程堆栈中•通过读取PSP的值,操作系统OS就能够获取用户应用程 序使用的堆栈,进而知道发生异常时被入栈寄存器的内 容。•OS还可以修改PSP,用于实现多任务中的任务上下文切 换。第2章Cortex-M3内核原理(2)本章主要学习内容:1.Cortex-M3微处理器内部结构2.Cortex-M3寄存器3.Cortex-M3存储器管理4.Cortex-M3处理器工作模式5.Cortex-M3异常与中断6.Cortex-M3堆栈7.CoreSight调试与跟踪系统8.Cortex-M3内核的其他特性7.CoreSight调试与跟踪系统CoreSight技术概览CoreSight调试架构覆盖了一个很大的面,包括调试接口协议、调试总线协议、对调试组件的控制、安全特性、跟踪接口等。在《CoreSightTechnologySystemDesignGuide(Ref3)》中,对CoreSight有详细的讲述。处理器的调试接口以前的ARM处理器都提供JTAG接口,通过它来控制对寄存器和存储器的访问。在CM3中全变了——对处理器上总线逻辑的控制使用另外的总线接口,即通过所谓的“调试访问端口(DAP)”。DAP与AMBA中的APB很相似。在CM3中,把JTAG或串行线协议都转换成DAP总线接口协议,再控制DAP来执行调试动作。7.CoreSight调试与跟踪系统从外部调试器到CM3调试接口的连接,需要多级互联才能完成,如图所示。第一步,是通过DP接口模块(通常是SWJ‐DP或SW‐DP),先把外部信号转换成一个通用的32位调试总线信号(图表中的DAP总线)。SWJ‐DP支持SW与JTAG两种协议,而SW‐DP则只支持SW。另外,在CoreSight产品中还可以使用一种JTAG‐DP,它只支持JTAG协议。DAP总线上的地址是32位的,其中高8位用于选择访问哪一个设备,由此可见最多可以在DAP总线上面挂256个设备。在CM3处理器的内部,只用掉了一个设备的地址,还剩下的255个都可以用于连接访问端口(AP)到DAP总线上。7.CoreSight调试与跟踪系统在把数据从DAP接口传递给CM3处理器后,下一步就连接到了一个称为“AHB‐AP”的AP设备上,它相当于一个总线桥,用于把DAP总线的命令转换为AHB总线上的数据传送,再插入到CM3内部的总线网络中。这么一来,CM3的整个存储器映射都可以访问了,连NVIC中的调试控制寄存组也包括在内。在oreSight系列产品中,AP设备可以有好几种类型,包括APB‐AP和JTAG‐AP。APB‐AP顾名思义,是用于产生APB总线数据传送动作的,而JTAG‐AP则用于控制传统的,基于JTAG的测试接口,例如ARM7上的调试接口。跟踪接口CoreSight架构的另一个部分用于跟踪。在CM3中有3种跟踪源:1.指令跟踪:由ETM(嵌入式跟踪宏单元)产生2.数据跟踪:由DWT产生3.调试消息:由ITM产生,提供形如printf的消息输入,送到调试器的GUI中7.CoreSight调试与跟踪系统在跟踪踪过程中,由跟踪源产生的数据被裹成数据包,然后被送到“高级跟踪总线(ATB)”上进行传送。在CoreSight的架构中,如果某SoC含有多个跟踪源(例如,多核系统),则需要一种硬件水平的ATB归并器(merger),把各ATB数据流归并成一条(在CoreSight架构中,这种硬件被名为ATBfunnel)。归并后的数据流都送往TPIU(跟踪端口接口单元),TPIU再把数据导出到片外的跟踪硬件设备。在数据送到了调试主机(PC)后,再由PC端的调试软件还原为先前
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浴珠珠状沐浴剂市场发展预测和趋势分析
- 2024年度供应链管理及服务合同
- 2024年度技术研发保密录像合同范本
- 2024年度游戏开发合同游戏设计要求
- 2024年度巢湖劳动合同续签申请书指南
- 2024年度宠物店品牌合作合同:宠物店与其他品牌之间的合作推广协议
- 2024年度建筑工程施工合同标的及工程描述
- 2024年度人力资源外包合同:保安人员派遣服务协议
- 羽毛掸市场需求与消费特点分析
- 2024年度健身俱乐部会员合同:关于健身俱乐部与会员之间的服务内容、费用等规定
- 企业资产管理培训
- 公文写作课件教学课件
- 第45届世界技能大赛焊接项目全国选拔赛技术工作文件
- 《老年人生活照护》试卷B卷及答案
- 课程设计几种排序算法
- 学前教育法学习重点1
- 2024版合伙经营运输车辆合同范本
- 夏县县城污水处理提质增效-一厂一策-系统化整治方案
- 幼儿园中班健康《运动过后》课件
- 门卫室承包合同
- +Unit+2+We're+family+Section+A+2a+-+2e+说课稿 人教版(2024)七年级英语上册++
评论
0/150
提交评论