码迷,mamicode.com
首页 > 其他好文 > 详细

Cortex-M3 处理器

时间:2021-06-07 20:06:56      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:没有   异常   prim   大于等于   attribute   相关   除了   hand   block   

Cortex-M3 系列处理器是基于 ARMv7-M 架构的处理器,应用非常广泛,为了能够深入的分析在此平台上跑 RTOS 的各种细节,所以有必要写一篇关于 CM3 处理器的结构相关的文章(CM4 类似),在 OS 调度初始化、系统调用、进程调度等方面的细节均是和具体处理器息息相关,所以先让我们来看看 CM3 处理器的一些特征;

1、寄存器组

如下所示,CM3 处理器拥有 R0~R15 一共 16 个内部寄存器,其中:

R0~R12 称之为通用寄存器。在这 13 个寄存器中,根据指令集访问的特性,R0~R7 是所有指令都可以访问,而 R8~R12 只有很少的 16 位的 Thumb 指令可以访问,32 位的 Thumb-2 不受限制;

R13 默认情况下被用做堆栈指针;堆栈指针分为 MSP 和 PSP,后面会详细描述;

R14 默认情况作为 LR,也就是链接寄存器,当程序调用其他函数后,此寄存器保存了返回地址,使得子程序执行完毕后,得以返回;

R15 默认作为 PC 指针;

技术图片

2、特殊功能寄存器组

CM3 中,除了上述 16 个寄存器以外,还有几个特殊的寄存器组:

xPSR:状态寄存器;

PRIMASK:中断屏蔽寄存器;

FAULTMASK:中断屏蔽寄存器;

BASEPRI:中断屏蔽寄存器,按照优先级进行屏蔽;

CONTROL:处理器模式和堆栈选择;

 

他们的含义如下:

技术图片

 

 

 技术图片

 

 

 下面我们一个一个看

 

2.1、xPSR

xPSR 是 Program Status Register 程序状态寄存器的意思,前面有个 x 代表他是由 3 个小的寄存器构成:

APSR:应用程序状态寄存器;

IPSR:中断程序状态寄存器;

EPSR:执行程序状态寄存器;

它们 3 个一起叫做程序状态寄存器,xPSR 的组成是 32 位的寄存器,在这 32 位中,APSR、IPSR、EPSR 各占一部分:

技术图片

 

 

 

蓝色部分是 APSR,占领了高 27bit ~ 31bit

紫色部分是 EPSR,占领了高 9bit ~ 26bit

绿色部分是 IPSR,占领了低 0bit ~ 8bit

如果写汇编的话呢,APSR 的 N、Z、C、V、Q 这些标志会被使用到,详见指令集部分;

IPSR 中存储了当前服务的中断号;

2.2、PRIMASK

这个是只有单一 bit 的寄存器。当它被置位 1 后,就关掉了所有可屏蔽的异常(中断),只剩下 NMI 和 HardFault 可以响应。缺省值是 0,表示没有屏蔽中断;

PRIMASK 也可以叫一级中断开关,这里值得注意的是,即便是通过 PRIMASK 写 1 屏蔽了中断,但是中断依然会在门外被 Pending 住,只不过得不到执行,如果在 PRIMASK 为 1 的情况下,有中断在外 Pending 了,此刻往 PRIMASK 写 0,那么立马会进入 ISR;也就是说,PRIMASK 只是屏蔽掉中断,而并不是不让中断源产生中断!

 

2.3、BASEPRI

这个寄存器最多有 9 bit(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值;换言之,当这个寄存器被设置某个数值后,所有优先级号大于等于该值的中断都被关闭(优先级号越大,优先级越低);默认值是0,也就是不关闭任何中断;

 

2.4、FAULTMASK

这也是只有 1 bit 的寄存器,当设置为 1 的时候,只有 NMI 才能够响应,其他所有的异常,甚至是 HardFault 也不响应,默认值是 0,也就是都响应;

 

2.5、CONTROL

根据名字就知道,这是个控制寄存器,这个控制寄存器由两个 bit 构成,我们称之为 CONTROL[0] 和 CONTROL[1];

CONTROL[0]  用来指明运行的 CPU 的特权级别;

CONTROL[1] 用来指明使用的堆栈类型;

技术图片

 

稍后会对堆栈指针和 CPU 特权级别以及线程模式/Handler 模式做说明;

 

 

2.6、特殊寄存器组访问方式

上述的特殊寄存器组 xPSR、PRIMASK、FAULTMASK、BASEPRI 以及 CONTROL 都是 CM3 内核的寄存器,CM3 定义的访问他们的方式是只能通过 MRS 和 MSR 指令,比如:

MRS R0, BASEPRI ; 读取 BASEPRI 到 R0
MRS R0, FAULTMASK ; 读取 FAULTMASK 到 R0
MRS R0, PRIMASK ; 读取 PRIMASK 到 R0
MRS R0, CONTROL ; 读取 CONTROL 到 R0

MSR BASEPRI, R0 ; 将 R0 写入 BASEPRI
MSR FAULTMASK, R0 ; 将 R0 写入 FAULTMASK
MSR PRIMASK, R0 ; 将 R0 写入 PRIMASK
MSR CONTROL, R0 ; 将 R0 写入 CONTROL

其实,为了快速的开关中断,CM3 还专门定义了一条叫 CPS 的指令,有如下 4 种用法:

 CPSID I ;PRIMASK=1, ;关中断 

CPSIE I ;PRIMASK=0, ;开中断

CPSID F ;FAULTMASK=1 ;关异常

CPSIE F ;FAULTMASK=0 ;开异常

 

3、处理器工作模式

在 2.5、CONTROL 章节提到了工作模式和特权等级这里就需要说明一下 CM3 处理器的工作模式和特权等级做一下说明;

3.1、运行等级

CM3 有两种运行等级:

1、特权等级;

2、用户等级;

 

Cortex-M3 处理器

标签:没有   异常   prim   大于等于   attribute   相关   除了   hand   block   

原文地址:https://www.cnblogs.com/god-of-death/p/14856578.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!