关键词不能为空

当前您在: 主页 > 英语 >

ARMCortex-M3内核结构

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-01 23:41
tags:

-

2021年2月1日发(作者:pnd)


. .. .






ARM Cortex-M3


核结构




2.1



ARM


Cortex-M3


处理器简





2.1.1


概述





ARM


公 司成立于上个世纪九十年代初,致力于处理器核研究,


ARM



Advanced RISC Machines



缩写,


ARM


公司 本身不生产芯片,只设计核,靠转让设计许可,由合作伙伴公司来生产各具特色的




片。


这种运行模式运营的成果受到全球半 导公司以及用户的青睐。


目前


ARM


体 系结构的处理器核有:



ARM7TDMI


ARM9TDMI



ARM10 TDMI



ARM11


以及

< p>
Cortex


等。


2005



ARM


推出的


ARM Cortex


系列核,分别



为:


A


系列、


R


系列和


M


系列,其中


A


系列是针对可以运行复杂操作系统(


Linux


< p>
Windows


CE



Symbian


等)的处理器;


R


系列是主要针对处理实时性要求较 高的处理器(汽车电子、网络、影像系


统);


M


系列



又叫微控制器,对开发费用敏感,对性能要求较高的场合。


< /p>


Cortex-M


系列目前的产品有


M0



M1



M3



其中


M1


用 在


FPGA


中。


Cortex-M


系列对微控制器


和低成本应



用提供优化,具有低成本、低功耗和高性能的特点,


能够满足微控制器设计师 进行创新设


计的需求。




中,


ARM Cortex-M3


处理 器的性能是


ARM7


的两倍,而功耗却只有

ARM7



1/3


,适用


于众多高性能、极其低



成本需求的嵌入式应用 ,如微控制器、汽车系统、大型家用电器、网络装置


等,


ARM Cortex-M3


提供了


32


位微控制器市场前所未有的优势。



Cortex-M3


核,


部的数据路径为

32


位,寄存器为


32


位,


存储器接口也是


32


位。

Cortex-M3


采用




哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问分开进行。


Cortex-M3


还提供


一个


可选的


MPU


,对存储器进行保 护,而且在需要的情况下也可以使用外部的


cache


。另外在


Cortex-M3


中,


< p>
存储器支持小端模式和大端存储格式。


Cortex-M3


部还附赠了很多调试组件,用于在


硬件水平上支持


< /p>


调试操作,如指令断点,数据观察点等。另外,为支持更高级的调试,还有其它可选


组件,包括指令跟



踪和多种类型的调试接口。




2.1.2


核结构组成及功能描述





Cortex-M3


微控制器核包括处理核心和许多的组件,目的是用于系统管理和调试支持。如图


2.1




Cortex-M3


核方框图。



i. .w.


. .. .










NMI



断号


[239:0]



SLEEPING


SLEEPDEE


P









NVIC



SysTick



中断



睡眠



调试



指令




MPU




Cortex-M3



CM3




数据







ETM







触发




TPIU






FPB



DWT



M



IT


专用外



设总线






SW-DP


JTAG-


DP


专用外设总线(部)



AHB- AP



AP


B



ROM




总线矩阵





I-code


总线



D-code


总线



系统总线



系统总线(


AHB





总线矩阵






静态



R


AM


外部



R


AM


外部



控制器



设备




AHB to APB



线











SRAM




选配



外部



RAM



Flash




储器






外设总线





I/O




UART


PWM


Timer






2


.1 Cortex-M3


核方框图





1.


处理器核





Cortex-M3


处理器核采用


ARMv7-M


架构,其主要特性如下 :




Thumb-2


指令集架构(


ISA


)的子集,包含所有基本的


16


位和


32



Thumb-2


指令;




哈佛处理器架构,在加载


/


存储数据的同时能够执行指令取指;




带分支预测的三级流水线;




32


位单周期乘法;




硬件除法;




Thumb


状态和调试状态;



i. .w.


. .. .








?



?




处理模式和线程模式;



ISR


的低延迟进入和退出;



可中断


-


可继续(


i nterruptible-continued


)的


LDM/ STM



PUSH/POP




支持


ARMv6


类型


BE8/LE



支持


ARMv6


非对齐访问。





(嵌套向量中断控制器)





NVIC


与处理器核是紧密耦合的,


这样可实现快速、


低延迟的异常处理 。



Cortex-M


微控制器此




能非常强大。




3.


总线矩阵





总线矩阵用来将处理器和调试接口与外部总线相连。



处理器


包含


4


个总线接口:




ICode


存储器接口:从


Code


存储器空间(


0x0000000


–< /p>


0x1FFFFFFF


)的取指都在这条


32



AHBLite


总线上执行。




DCode


存储器接口:对


Code


存储器空间(


0x0000000


–< /p>


0x1FFFFFFF


)进行数据和调试访


问都



在这条


32



AHBLite


总线上执行。



系统接口:


对系统空间



0x20 000000



0xDFFFFFFF



进行取指、


数据和调试访问都在这条


32



AHBLite


总线上执行。



外部专用外设总线(


PPB


):对外部

PPB


空间(


0xE0040000


0xE00FFFFF


)进行数据和调试


访



问都在这条


32



APB


总线(


AMBA v2.0


)上执行。 跟踪端口接口单元(


TPIU


)和厂商


特定的



外围器件都在这条总线上。



注:处理器包含一条部专用外设总线,用来访问嵌套向量中断控制器(

< br>NVIC


)、数据观察点和



触 发



DWT


)、


Flash


修补和断点(


FPB


) ,以及存储器保护单元(


MPU


)。








FPB


单元实现硬件断点以及从代码 空间到系统空间的修补访问,


FPB



8


个比较器。









数据观察点和跟踪,调试功能部件。









ITM


是 一个应用导向(


application driven


)的跟 踪源,支持对应用事件的跟踪和


printf


类型的调



试。



i. .w.


. .. .










存储器保护单元(


MPU



是用来保护存储器的一个元件。处理器支持标 准的


ARMv7


“受保护的存


储器



系统结构”



P MSA


)模型。如果希望向处理器提供存储器保护,则可以使用可选的

< br>MPU



MPU


对访问允许



和存储器属性进行检验。它包含


8


个区和一个可选的执行默认存储器映射访问属性的背景


区。

< p>







ETM


支 持指令跟踪的低成本跟踪宏单元。









TPIU


用作来自


ITM


ETM


(如果存在)



Cortex-M3


核跟踪数据与片外跟踪端口分析仪之间的桥


接。





/JTAG-DP





Cortex-M3


处理器可配置为 具有


SW-DP



JTAG-DP


调试端口的接口,或两者都有。这两个调试


端口提

< br>


供对系统中包括处理器寄存器在的所有寄存器和存储器的调试访问。

< p>




2.2


核寄存器组织




如图



2


.2



示,


Cortex_M3



寄存器分为



1


6



通用寄存器



R


0



R15




7




特殊功能寄存器。



i. .w.


. .. .




































R0


R1


R2


R3


R4


R5


R6


R7


R8


R9


R10


R11


MSP























R12


R13



SP




R14



LR



R15


PC






















PSP



状态寄存器



中断屏蔽



寄存器



控制寄存器



xPSR


PRIMASK


FAULTMASK


BASEPRI


CONTROL






2


.2


寄存器组织图





2.2.1


通用寄存器



R


0-R15





R0



R12



存器:


是真正意义上的通用。在处理器运行过程中,作数据 的寄存。



R13


为堆栈指针寄存器 :


堆栈指针是用于访问堆栈,也即系统的


RAM


区。


Cortex_M3


中采用了两




堆栈指针:主堆栈指针(


MSP


)和进程堆栈指针(


PSP


),


R13


在 任何时刻只能是其中一个,默认情


况为



MSP


,可以通过控制寄存器(


CONTORL


)来改变。


Cortex_M3


中堆栈方向是向低 地址方向增


长,为满堆栈



机制。堆栈操作是通过



P


USH




P


OP



完成操作的。



例如



M


SP



前指针指向:


0x2000_000 C



R0=0x00000000


。< /p>



执行:


PUSH


此时



M


SP



向:


0x2000_0008


执行示意如图



2


.3



示。



R0


i. .w.


. .. .







RAM




RAM


已使用



已使用



已使用



0x2000_0008


MSP










已使用



已使用



0x2000_00


0C MSP


上次压入的数据



未用



未用





0x00000000


未用








2.3


堆栈操作示意图




R14


程序连接寄存器(


LR


):


在执行分支(


B


)和(


BL


)指令或带有交换分支(


B X


)和



指令



BLX


)时,


PC


的返回地址自动保存进



LR


。比如在子程序调用时用保存子程序的返回地址。


LR


也用


于异常返回,


但是在这里保存的是返回后的状态,


不是返回的地址,


异常返回是通过硬件自动出栈



弹出


之前压入的



P


C


完成的。



R15

< br>程序计数器(


PC


):


是程序运 行的基础,具有自加的功能。该寄存器的位



0



始终为



0


,因此,



指令始终与字或半字边界对齐。




2.2.2


特殊功能寄存器





特殊功能寄存器分为程序状态寄存 器、中断屏蔽寄存器和控制寄存器三类。



xPSR


程序状态寄存器:


系统级的处理器状态可分为


3


类,应用状态寄存器(


APSR


) 、中断状态寄



存器(


IPSR


)、执行状态寄存器(


EPSR


),可组合起 来构成一个



3


2



的寄存器,统称



x


PSR







2


.1 xPSR


寄存器





寄存



器名



APSR




31


N


30


29


28


27


Z


C


V


Q


26:25


24


23:20


19:16


15:10


9


8


7


6


5


4:0



中断编号



ICI/IT


T



EPSR



IPSR



ICI/IT





xPSR



存器的各位的功能如表



2


.2









2


.2 xPSR


寄存器各位功能







31


30


29


28


名称



N


Z


C


V


定义



负数或小于标志:


1


:结果为负数或小 于;


0


结果为正数或大于



零标志:


1


:结果为



0



0


:结果 为非



0



进 位


/


借位标志:


1

:进位或借位;


0


没有进位或借位



溢出标志:


1


:溢出;


0


:没有溢 出



i. .w.


. .. .






27


26:25


15:10


24




T


Q


粘着饱和标志:


1


:已饱和;


0


:没有饱和



IF- Then


位。它们是



i


f-Then


指令的执行状态位。



包含



i


f-Then


模块的指令数目和它们的执行条件



用于指示处理器当前是



A


RM


状态还是



T


humb


状态



可中断


-


可继续的指令位:


如果在执行



LDM




STM


操作时产生一次中断,




L


DM




ICI


STM


操作暂停,该位来保 存该操作中下一个寄存器操作数的编号,在中断响




之后,处理器返回由该位指向的寄存器并恢复操作。



8:0


ISR


占先异常的编号




IT



15:12




中断屏蔽寄存器:


分为三组,分别是



P


RIMASK


FAULTMASK



BASEPRI



PRIMASK



片上外设总中断开关,该寄存器只有位



0




效,当该位为



0




响应所有外设中断;当该



位为



1




屏蔽所有片上外设中断。



FAULTMASK



存器管理系统 错误的总开关,该寄存器中有位



0




效,当该位为



0




,响应所有的异



常;为



1




蔽所有的异常。



BASEPRI



存器用来屏蔽优先 级等于和小于某一个中断数值的寄存器。



控制寄存器:


CONTROL



两个作用,其一用于定义处理器特权级别,其二用于选择堆栈指针,如




3.3



示。






2


.3 CONTROL


寄存器








功能



堆栈指针选择



CONTROL[1]


0


:选择主堆栈指针



M


SP


1


:选择进程堆栈指针



P


SP




CONTROL[0]


0


:特权级



1


:用户级




CONTROL[0]


:异常情况下,处理器总是处于特权模式 ,


CONTROL[0]


位总是为


< /p>


0


;在线程模式情况


< br>


(非异常情况),处理器可以工作在特权级也可工作在用户级,该位可为



0





1


。特权级下所有的资源



都可以访问,而用户级下被限制的资源不能访问,比如



M


PU



限制的资源。



CONTROL[1]


:为



0




,只使用



M


SP


,此时用户程序和异常共享同一个堆栈,处理器复位后默 认的也



是该模式。




1





用户应用程序使用进程堆栈



P

< p>
SP



而中断任然得使用主堆栈

< br>


M


SP


这种双堆栈机制,




别适合在带有


O


S


(操作系统)的环境下使用,只要


O


S



在特权级下执行,而用户应用程序在用户



模式下

< p>
执行,就可很好的将代码隔离互不影响。




2.3



理器操作模式




ARM


Cortex-M3


支持


2


个模式和两个特权等级。如图


2.4


所示,在嵌入式系统应用程序中,程序


代 码



涉及异常服务程序代码和非异常服务程序代码,

< p>
这些代码可以工作在处理器特权级也可以工作在


用户级


级,


但有区别。


当处理器处在线 程模式下时,


既可以使用特权级,


也可以使用用户级;


另一方面,


handler


模式总是特权级的。在复位后,处理器进入线程模式+特权级。



i. .w.


. .. .






特权级



用户级




Handler


模式




主应用程序的代码



线程模式




线程模式



错误的用法




异常



h


andler


的代码







2


.4


操作模式和特权等级





在线程模式+用户级下,对系统控制空间(

< br>SCS



0xE000E000



0xE000EFFF


,包括


NVI C



SysTick



MPU


以及代码调试控制所用的寄存器)


的访问将被 禁止。除此之外,


还禁止使用


MRS/MSR

< br>访


问,


除了


APSR


之外的特殊功能寄存器。如果操作,则对于访问特殊功能寄存器的,访问操作被忽略;而


对于访问


SCS


空间的,将产生错误。



在特权级下不 管是任何原因产生了任何异常,处理器都将以特权级来运行其服务例程,异常返回



后,


系统将回到产生异常时所处的级别,


同 时特权级也可通过置位


CONTROL[0]


来进入用户级。< /p>


用户


级下



的代 码不能再试图修改


CONTROL[0]


来回到特权级。它必须 通过一个异常


handler


,来修改


CONTROL[0]




才能在返回 到线程模式后进入特权级。如图


2.5


所示。

< br>



特权级



handler


模式



1





CONTROL[0]=


异常服务



例程



CONTROL[0]=0


异常服务



例程








线







代码



程模式





异常



异常



特权级的



线程








线



程模式






用户



程序



用户



程序







2


.5


处理器模式转换图





把代码按特权级和用户级分开处理,有利于使


Cortex-M3


的架构更加稳定可靠。例如,当某个用



程序代码出问题时,


可防止处 理器对系统造成更大的危害,


因为用户级的代码是禁止写特殊功能寄

存器




NVIC


中寄存器的。另外,如果还配有


MPU


,保护力度就更 大,甚至可以阻止用户代码访问不


属于它的



存区域。



在引入了嵌入式实时操作系 统中,为了避免系统堆栈因应用程序的错误使用而毁坏,我们可以给


< br>应用程序专门配一个堆栈,


不让它共享操作系统核的堆栈。


在这个管理制度下,


运行在线程模式的用


< br>户


代码使用


PSP


< p>
而异常服务例程则使用


MSP


< br>这两个堆栈指针的切换是智能全自动的,


在异常服务的始



末由


Cortex-M3


硬件处理。< /p>



如前所述,特权等级和堆栈指针的选择均由

CONTROL


负责。




CONTROL[0]=0


,在异常处理


的始 末,只发生了处理器模式的转换,如图


2.6


所示。

< p>



CONTROL[0]=1

< br>(线程模式


+


用户


级),则在中 断响应的始末,处理器模式和特权等级都要发生变



化,如图< /p>


2.7


所示。


CONTROL



0


]只有在特权级下才能访问。用户级的程序 如想进入特权级,通常都


是使用一条“系



i. .w.


. .. .






统服务呼叫指令(


SVC


)”来触发“


SVC


异 常”,该异常的服务例程可以视具体情况而修改


CONTROL[0]

< br>。






中断事件



中断服务程序



中断返回




主程序





入栈




出栈




线









(特权级)



Handler






(特权级)



线









(特权级)







2


.6


中断前后的状态转换










中断事件



中断服务程序



中断返回




主程序




入栈




出栈



线









(用户级)




线









(用户级)




Handler






(特权级)







2


.7


中断前后的状态转换


+


特权等级切换





2.4



储器系统





2.4.1


存储器映射





Cortex-M3



用了固定的存储映射结构,如图



2


.8



示。



Cortex-M3


的地址空间是


4GB,


程序可以在代码区,



SRAM


区以及外部


RAM


区中执行。


但是因为



指令总线与数据总线是分开的,


最理想的是把程序放到代码区,


从而使取指和数据访问各自使用己的总



线。





S


RAM



的大小是



5


12MB


,用于让芯片制造商连接片上的


S


RAM


,这个区通过系统总线 来访问。



在这个区的下部,


有一个



1


MB



区 间,


被称为“位带区”。


该位带区还有一个对应的



3


2MB




“位带别




(alias)


区”,容纳了



8


M



“位变量”(对比



8


051



只有



1


28



位变量),位带区对应的是最低的



1MB


地址围,而位带别名区里面的每个字对应位带区的一个 比特。位带操作只适用于数据访问,不适



用于取


指。通过位带的功能,可以把多个布尔型数据打包在单一的字中,却依然可以从位带别名区中,



像访


问普通存一样地使用它们。

< p>
位带别名区中的访问操作是原子的,


消灭了传统的“读-改-写”三



步。



i. .w.


. .. .






0xE00FFFF


F


0xE00FF00


0


0xE004200


0


0xE004100


0


0xE004000


0



ROM


外部



PPB


ETM


TPIU






芯片厂商定义










0xFFFFFFFF


外部私有外设总线






内核



0xE0100000


私有



0xE00FFFFF


区域



512MB


0xE0040000


0xE003FFFF


0xE0000000


0xDFFFFFFF


内部私有外设总线








0xE003FFF


F


0xE000F00


0


0xE000E00


0


0xE000300


0


0xE000200


0


0xE000100


0


0xE000000


0



保留





片外外设



1.0GB





0xA0000000


0x9FFFFFFF




NVIC


保留



FPB


DWT


ITM





片外



RAM 1.0GB




0x60000000


0x5FFFFFFF



片上外设区



512MB




0x40000000


0x3FFFFFFF














片上



SRAM 512MB





0x20000000


0x1FFFFFFF




代码区



512MB




0x00000000




0x43FFFFFF



0x4200000


0


0x41FFFFFF


32MB


位带别名区





31MB



0x40100000


0x4000000


0




1MB


位带区





0x23FFFFFF



0x2200000


0


0x21FFFFFF


32MB


位带别名区



31MB



0x20100000


0x2000000


0


1MB


位带区







2


.8 Cortex-M3


存储器映射图





片上外设对应



5


12MB



空间,


芯片上所有与外围设备相关的寄存器都位于该区域。


这 个区中也有一




32MB


的位带别名,


以便于快捷地访问外设寄存器,


用法与部


SRAM


区中的位带相同。


例如,


可以方



便地访问各种控制位 和状态位。


要注意的是,


外设区不允许执行指令。


通常半导体厂商就是修改此区



< br>的片上外设,来达到各具特色的、个性化的设备。



i. .w.


. .. .


还有两个



1


GB



围 ,


分别用于连接外部



R


AM



外 部设备,


它们之中没有位带。


两者的区别在于外





RAM



允许执行指令,而外部设备区则不允许。



最后还剩下



0


.5GB



隐秘地带,包括了系统级组件,


部私有外设总线,


外部私有外 设总线,以及



由提


供者定义的系统外设。



私有外设总线有两条:



AHB



有外设总线,只用于



C


M3





A


HB



设,它们是:


NVIC, FPB, DWT




I


TM




APB



有外设总线,


既用于



C


M3





A


PB



备 ,


也用于外部设备


(这里的“外部”是对核而言)




Cortex-M3



许器件制造商再添加一些片上



A


PB



设到



A


PB



有总线上,它们通过



A


PB



口来访问。



i. .w.


. .. .






NVIC



处的区域叫做“系统控制空间(


SCS

)”,在



S


CS



的除了



N


VIC



,还有



S


ysTick



MPU




及代码调试控制所用的寄存器。



最后 ,未用的提供商指定区也通过系统总线来访问,但是不允许在其中执行指令。




2.4.2


位带操作






Cotex-M3


存储器映射中包括 两个位操作区。分别位于


SRAM


和片上外设存储区的最低


1MB



间中。



这两个位带中的地址除了可以像普通的


RAM

< br>一样使用外,它们还都有自己的“位带别名


区”,位带别名



区把每个比特膨胀成一个


32


位的 字形成位地址。


当你通过位带别名区访问这些字时,


就可以达到 访问原



始比特的目的,其对应关系如图


2.8


所。



位地址与位别名对应关系统如下:






S


RAM



带区的某个位:



Aliasaddr


0


x

< p>
22000000


0


x


2 2000000


0


x


42000000


0


x


42000000


((


A


(


A



((


A


(


A



0< /p>


x


20000000


)


0


x


20000000


) < /p>


0


x


40000000

< br>)


0


x


40000000


)


8


32


8


32


n


)


n


n


)


n


4



4



4



4



对于片上外设位带区的某个位:



Aliasaddr


在上述表达式中,


A



示要操作的位所在的字节地址,


n



0



n


7


)表示位序号。




0x23FFFFFC 0x23FFFFF8 0x23FFFFF4 0x23FFFFF0 0x23FFFFEC 0x23FFFFE8 0x23FFFFE4


0x23FFFFE0




位带别名区(共



3


2MB





0x2200001C 0x22000018 0x22000014 0x22000010 0x2200000C 0x22000008 0x22000004


0x22000000







7


6


5


4


3


2


1


0


7


6


5


4


3


2


1


0


7


6


5


4


3


2


1


0


7


6


5


4


3


2


1


0


0x200FFFF


F



0x200FFFF


E


0x200FFFF


D


0x200FFFFC


SRAM



带区(共



1


MB





7


6


5


4


3


2


1


0


7


6


5


4


3


2


1


0


7


6


5


4


3


2


1


0


7


6


5


4


3


2


1


0


0x200000


03


0x200000


02


0x200000


01


0x20000000




2.9


位操作对应关系图







举例:将地址



0


x20000000





2






1


。通过上述计算关系,可计算出位带别名为



0


x22000008




如程序清单



L


2.1



示。




程序清单



L


2.1 SRAM


位操作实例







LDR R0,=0x22000008



i. .w.


. .. .






LDR R1,=0x01


STR R1,[R0]


将片上外设



I


/O



口的



A




的第



0




(也即



P


ORTA0



为输出,




A




的方向寄存器地址为



0


x40004400




设置



1


< /p>



为输出,可根据上述关系计算出位带别名为


0


x42088000


。如程序 清单



L


2.2



示。




程序清单



L


2.2


片上外设位操作实例






LDR R0



=0x42088000


LDR


R1,=0x01


STR R1,[R0]


注:采用大端格式时,对位邦定别名区的访问必须以字节方式,否则访 问不可预知。




2.5






ARM Cortex-M3



异常 涉及异常的类型、优先级、向量表等,本节并以



L


uminary



列微控制器为




说明异常的具体行为。




2.5.1


异常类型






Cortex-M3


中有




















套向














N


VIC




N


ested Vectored


Interrupt


C


ontrol ler



,


定义了


1


6



系统异常和



2


40



外 设中断。


通常芯片设计者可自由设计片上外


< br>设,


因此具体的片上外设中断都不会用到多达



2


40




如表



2


.4



示 系统异常类型,




2


.5



示为外设



中断


类型。



Cortex-M3


中目前只有


11


种系统异常可用分别是:系统复位、


NMI


(不可屏蔽中断)、硬件故障、



存储器管理、总线 故障、用法故障、


SVCall


(软件中断)、调试监视器中断 、


PendSV(


系统服务请求


)




SysTick



24


位定时器中断)。


240


路外设中断 ,


是指片上外设的各模块,


比如


I/O


口、


UART


通信接口、



SSI



线接口等所需的中断。






2


.4


异常类型





编号



0


1


2


类型



-


复位



NMI


优先级



-


-3


-2


描述



复位时载入向量表的第一项作为主堆栈栈顶地址。



复位。



不可屏蔽中断(来自外部



N


MI



入脚)。



当故障由于优先级或者是可配置的故障处理程序被禁止的原因



而无法激活时,所有类型故障都会以硬故障的方式激活。



4


5


存储器管理



总线故障



可编程



可编程



MPU


不匹配,包括访问冲突和不匹配。



预 取指故障、存储器访问故障和其它地址


/


存储器相关的故障。< /p>



由于程序错误导致的异常,


通常是使用 一条无效指令,


或都是非



法的状态转换。



7-10


11


保留



SVCall


-


可编程



保留



执行



S


VC



令的系统服务调用。




3



硬故障




-1



6



用法故障




可编程



i. .w.


. .. .






12


13


14


15


调试监视器



保留



PendSV


SysTick


可编程



-


可编程



可编程



调试监视器(断点,数据观察点,或是外部调试请求)




系统服务的可触发(


pendabl e


)请求。



系统节拍定时器。





2


.5


中断类型






编号



16


17



类型



IRQ


#0


IRQ


#1


优先级



可编程



可编程



描述



外设中断



#0


外设中断



#1




255











可编程





外设中断



#239


?



IRQ


#239


?




2.5.2


优先级





Cortex-M3


的异常功能非常强大,机制非常灵活,异 常可以通过占先、末尾连锁和迟来等处理来降



低中断的延迟。优先级决定了处理器何时以及怎样处理异常。



Cortex-M3





3




固定的高优先级和多达



2


56



的可编程优先级,并且支持



1


28



抢 占,


绝大多




芯片都会精简设计,实际中支持的优先级数会更少,如


8


级、


16


级、


32


级等,通常的做法是裁掉表




优先级的几个低端有效位(防止优先级反转),以减少优先级的级数。比如

Luminary


的芯片采用


8



优先级。



Cortex-M3




NVIC


支持由软件指定的可配置的优先级(称为软件优先级 ),其寄存器地址为:



0xE000_E400-0xE00 0_E4EF


。通过对中断优先级寄存器的



8





P


RI_N



执行写操作,来将中断的优先级



指定为


0-255


。硬件优级随着中断中的增加而降低。


0


优先级最高,


255


优先级最低。指定软件优先级



后,< /p>


硬件优先级无效。


例如:


如果将


INTISR[0]


指定为优先级


1



INTISR[31]


指定为优先级


0




INTISR[0]



优先级比


< /p>


I


NTISR[31]


低。



为了对具有大量中断的系统加强优先级控制,


Co rtex-M3



持优先级分组,通过



N


VIC



制,设置




占先优先级和次优先级。可通过对应用程序中断及复位控制寄存器(

< br>AIRCR


,地址为:


0xE000_ED00





[10:8]< /p>


位进行设置。


如果有多个激活异常共用相同的组优先级,


则使用次优先级区来决定同组中的异




优先级,


这就是同组的次优先级。


如表



2


.6



用程序中断及复位控制寄存器,




2


.7



占先优先级



和次优级


的关系。






2



6


应用程序中断及复位控制寄存器(


AIRCR


,地址:


0xE000ED00






位段





[31:16]




VECTKEY


名称





RW


类型





-


复位值



描述



访问钥匙:

任何对该寄存器的写操作,


都必须同时




0x05FA


写入此段,否则写操作被忽略。若读取



此半字,则读回值为



0xFA05




15


[10:8]


ENDIANESS


PRIGROUP


R


R/W


-


0


指示端设置。


1

< br>:大端,


0


:小端。



优先级分组



i. .w.


. .. .






2


SYSRESETREQ


W


-


请求芯片控制逻辑产生一次复位



清零所有异常的活动状态信息。通常只在调试时



用,或都在



O


S



错误中恢复时用。



0


VECTRESET


W


-


复位



C


oretex-M3



控制器核。




1




VECTCLRACTIVE


W



-





2


.7


抢占优先级和次优先级分组位置的关系





分组位置



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]


所有位



注:




2


.7



示了利用优先级的



8




位来配 置处理器优先级。


如果使用小于



8




位来配置处理




的优先级,则寄存器的低位始终为


0



例如,


如果使用

< br> 3


个位来配置优先级,



PRI_N[7:5]


用来配置




先级,而



P


RI_N[4:0]



< p>
4



b0000





2.5.3


中断向量表





当发生了异常并且要响应它时,


Cortex-M3


需要定位其服务例程的入口地址。这此入口地址存储在



所谓“异常向量表”中。缺省情况下,


Cortex-M3


认为该表位于零地址处,且各向量占用


4


字节。因此



每个表项占用



4




节,复位后的向量表如表



2


.8



列。






2


.8


复位后向量表





地址



0x0000_0000


0x0000_0004


0x0000_0008


0x0000_000C




异常编号



-


1


2


3



MSP



初始值



复位向量(


PC



始值)



值(


32



整数)



NMI



务例程的入口地址





f


ault



务例程的入口地址









其它异常服务例程的入口地址



向量表中的第



1




字为指 向堆栈栈顶的指针,复位时核读取该地址的数据设置主堆栈。



向量表的基


地址可以通过



N


VIC



的向量偏移寄存器(


0xE000ED08


)来设置,如表



2


.9



示。从表



中可以看出,可以将异常向量表放在



C


ode



也可以将其放在



R


AM



,起始地址也可改变,起始地址是




要求的:


必须先求出系统中共有多少 个向量,


再把这个数字向上记到



2




整次幂 ,


而起始地址必须对



齐到后者的边界上。例如,如果一共有



3


2



中断,则共有


3


2+16


(系统异常)


=48



向量,向上记到



2



的整数次幂后值为



6


4


,因此向量表重定位的地址必须能被



6


4 X 4=256



除。



i. .w.


. .. .








2


.9


向量偏移量寄存器(< /p>


0xE000ED08






位段



29


7-28


名称



TBLOFF


TBLBASE


类型



R


R/


W


复位值



-


0


描述



向量表是在



C


ode




0


),还是在



R


AM




1




向量表的起始地址




向量表中至少需要有



4




值:< /p>


栈顶地址;


复位程序的位置;


NMI < /p>



常的位置;


硬故障的异常的位置。




中断使能时,


不管向量表的位置在哪,它指向所有使能屏蔽的异常。


并且如果使用


S


VC



令,还



需要指定



S


VCCall ISR



位置。




2.5.4


异常的进入与退出





1


.异常进入





入栈:当处理器发生异常时,首先自动把



8




寄存器 (


xPSR



PC


LR



R12

< br>、


R3



R2

< br>、


R1



R0

< br>)压



入栈,


处理器自动完成,


在自动入栈的过程中,


把寄存器写入栈的时间顺序,

< p>
并不是写入空间相对应的,



但机器会保证正确的寄存器被保存到正确的位置,如图



2


.10




,


假设入栈,栈地址为



N







地址



N-8


N-4


N-32


N-28


N-24


N-20


N-16


N-12






数据





PC


PSR


R0


R1


R2


R3


R12


LR





时间




2.10


部入栈示意图





取向量:


发生异常,


紧接着核将根据向量表找出正确的异常向量,


然后在服务程序的入口处预取



指,


处理器将取指与取数据分别能过总线 控制,


使入栈与取指这两项工作能同时进行,


以便快速进入中< /p>



断。



更新寄 存器:入栈和取向量操作完成之后,在执行服务程序之前,还必须更新一系列寄存器。



SP


:在入栈后会把堆栈指针(


PSP



MSP


)更新到新的位置。在执行服 务例程时,将由


MSP


负责


对堆



栈的访问。



PS R


:更新


IPSR


位段(地处


PSR


的最低部分)的值为新响应的异常编号。


PC


:在取向量完成后,


PC


将指向服 务例程的入口地址,



LR


:在出入< /p>


ISR


的时候,


LR

的值将得到重新的诠释,这种特殊的值称


为“


EXC_RE TURN


”,在异常进



入时由系统计 算并赋给


LR


,并在异常返回时使用它。



以上是在响应异常时通用寄存器及特殊功能寄存


器的变化。


另外在


NVIC


中,

< br>也会更新若干个相关寄



存器。



i. .w.


. .. .






2


.异常退出





当异常服务程序最后一条指令将进入异常时的


LR


的值加载到


PC


中。


该操作指示中断服务结束,




从异常返回时处理器将执行下列操作之一:


< br>如果激活异常的优先级比所有被压栈


(等待处理)


的异常 的优先级都高,


则处理器会末尾连锁到一



个激活异常。



如果没有激活异常,< /p>


或者如果被压栈的异常的最高优先级比激活异常的最高优先级要高,


则处理器



返回到上一个被压栈的中断服务程序。



如果没有激活的中断或被压栈的异常,则处理器返回线程模式。



在启动了中断返回序列后,下述


的处理就将进行:



出栈:


先前压入栈中的寄存器在这里恢复。


部的出栈顺序与入栈时的相对应,


堆栈指针的值也改

< br>


回先前的值。



更新


NVIC


寄存器:


伴随着异常的返回,


它的活动位也被硬件清除。对于外部中断,


倘若中断输入




次被置为有效,悬起位也将再次置位,新一次的中 断响应序列也可随之再次开始。



异常返回值:异常返回值存放 在


LR


中。


这是一个高


28


位全为


1


的值,只有


[3:0]


的值有特殊含


义,





2.10

< p>
所示。当异常服务例程把这个值送往


PC


时,就会 启动处理器的中断返回序列。因为


LR


的值是由


Cortex-M3


自动设置的,所以只要没有特殊需求,就不要改动它。< /p>






2


.10 EXC_RETURN


各位含义





位段



[31:4]


3


2


1


0



含义



EXC_RETURN


的标识:必须全为


1




0=


返回后进入处理器模



1=


返回后进入线程模式。



0=


从主堆栈中做出栈操作,返回后使用


MSP


1=


从进程堆栈中做出栈操作,返回使用



PSP




保留,必须为


0




0=


返回


ARM


状态



1=


返回


Thumb


状态。


Cortex-M3


中必须为< /p>


1




因此,上 述表格中


EXC_RETURN


的值有三种情

< br>况:


0xFFFF_FFF1:


返回处理器模式;



0xFFFF_FFF9:


返回线程模式,并使用主堆栈;


0xFFFF_FFFD:


返回线程模式,并使用线程堆 栈。



例如系统中使用了


PendSV


异常,服务程序结束


时由处理模式返回到线程模式前使用进程堆 栈,如



程序清单


L2.3

< p>
所示。




程序清单



L


2.3


异常返回类型实例





OSPendSV


?


?



LDR LR,=0Xfffffffd


BX LR


;异常服务程序



;返回到线程模式进程堆栈



i. .w.


. .. .






2.5.5 Cortex-M3


异常处理机制





1


.末尾连锁





末尾连锁能够在两个中断之间没有 多余的状态保存和恢复指令的情况下实现异常背对背处理。


如图



2.11


所示。在退出


ISR


并进入另一个中断时,处理器省略了


8


个寄存器的出栈和入栈操作。如果当前




起中断的优先级比所有被压栈的异常的优先级都高。


则处理 器执行末尾连锁机制。


如果挂起中断的优



级比被压栈的异常的最高优先级都高,


则省略压栈和出栈 操作,


处理器立即取出挂起的中断向量。



退


出前一个



I


SR



后,开始执行被末尾连锁的



I


SR




用户程序




优先级



3



中断



1



压栈



优先级



2



中断



2





中断



1




中断



2




中断



1



结束




出栈







2


.11


末尾连锁示意图





2


.异常迟来







C


ortex-M3



迟来中断的意思是如果前一个



I


SR



没 有进入执行阶段,


并且迟来中断的优先级比


< br>前一个中断的优先级要高,则迟来中断能够抢占前一个中断。如图



2


.12



示。




用户程序




优先级



3



中断



1



优先级



2



中断



2





中断



1







中断



2




压栈




续< /p>





出栈







2


.12


迟来异常示意图





响应迟来中断时需执行新的取向量地址和



I


SR



取 操作。


迟来中断不保存状,


因为状态保存已经被




初的中断执行过了,因此不需要重复执行。



i. .w.

-


-


-


-


-


-


-


-



本文更新与2021-02-01 23:41,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/595859.html

ARMCortex-M3内核结构的相关文章