Cortex M3学习笔记 02 寄存器,中断控制器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Cortex M3学习笔记 02

寄存器,中断控制器

好像百度看了我的文章一样,上次笔记中写了一些对抱怨审核太慢的内容,结果第二天就审核好了,不知道这次速度怎么样……

1、名词定义

MSP:主堆栈指针;

PSP:进程堆栈指针;

2、寄存器

通用寄存器:32位一个,不多说,一共22个。

R0~R15,其中R13是个有两个堆栈指针寄存器的功能,一共17个;另外还有5个特殊功能寄存器。下面来理解。

a) 通用寄存器

R0~R12:

用于数据操作,使用Thumb-2可以全部访问,使用Thumb只能访问R0~R7。

R13:

堆栈指针(SP):包括主堆栈指针(MSP),进程堆栈指针(PSP)

PUSH和POP指令的用法解释:

PUSH {R0} // *(--R13)=R0;R13是long*型指针

POP {R0} // R0=*R13++

R13的最低两位强制为0,且读取同样也为0;

R14:

连接寄存器(LR):保存子程序返回时的地址;

R15:

程序计数器(PC):PC返回的地址是当前那指令的地址+4。

例如: 0x4000 MOV R0 , PC ; //R0=0x4004;

当针对执行一条写入R15指令时,写入R15的地址被当成一个指令地址,程序从这个地址处开始执行,但是不更新LR寄存器,相当于引发一次跳转;

PC的LSB读回内容始终为0,不论是直接写入PC的值,还是使用分

支跳转命令,都要求加载到PC的值是奇数(LSB=1),用以表明处理器是在Thumb状态下执行。若写入0,则视为企图跳转到ARM模式,Cortex-M3将产生一个fault异常。

b) 特殊功能寄存器

程序状态寄存器组(PSRs);

分为:

应用状态寄存器(APSR)为[27~31];

中断状态寄存器(IPSR)为[0~8];

执行状态寄存器(EPSR)为[10~15],[24~26];

共计32位

自己画个0~31的寄存器 “位”表格,很直观。

中断屏蔽寄存器组(PRIMASK、FAULTMASK、

BASEPRI);

PRIMASK相当于中断总开关,

当PRIMASK=1时,屏蔽所有中断(除NMI和fault外)。

FAULTMASK屏蔽错误中断。

BASEPRI优先级屏蔽寄存器中断。

控制寄存器(CONTROL)。

第1.定义特权级别:特权级线程模式,用户级线程模式;

CONTROL[0]=0是特权级;

CONTROL[0]=1是用户级;

第2.选择当前堆栈指针:主堆栈MSP,备用堆栈。

CONTROL[1]=0是主堆栈(复位缺省);

CONTROL[1]=1是备用堆栈,

特殊功能寄存器不存在地址,只能被专用的MSR和MRS指令访问。使用方式:

MRS , ;

读特殊功能寄存器的值到通用寄存器;

MSR , ;

写通用寄存器的值到特殊功能寄存器;

其中是通用寄存器,是特殊寄存器;

例如:

· MOV R0,#0x01;

MOV RPIMASK,R0;

· MOV R0,0x60;

MOV BASEPRI,R0;

3、CortexM3操作模式和特权级别

分为两种模式;两种级别:

a) 操作模式:线程模式(Thread mode),处理模式(handler

mode);

线程模式:在此模式中程序指令逐一运行;

处理模式:在程序执行过程中,触发了一个异常后,处理器将进入到处理模式;处理结束后返回之前的状态。

b) 特权级别:特权级,用户级;

特权级:系统开启后默认进入。无限制。

用户级:处理器将禁止对系统控制区域(SCS)(包含配置寄存器和调试组建的存储区域)的访问。

画个表格:

代码作用特权级用户级异常handler代码Handler模式错误,不可操作

线程模式主应用程序代码线程模式

(复位后默认进入的模式)

这样可以直观的看出,处理模式下,只提供特权级的代码才能访问。好处不多说了,保护关键区域代码安全,防止有意无意的篡改。·思考一下,上面说过CONTROL寄存器的可以更改特权;

程序启动后,线程模式会在CONTROL的指引下进入从特权级转为用户级运行,如果在用户级下面MSR命令自然是不能更改CONTROL特权的,那么如何解决?

答案:刚才表格中说了handler模式下肯定是特权级的,那么我们就利

用handler模式来解决这个问题。

在中断处理的时候(handler mode),加入代码:

MRS R0,CONTROL;//读取CONTROL;

BIC.W R0,R0,#0x01;//清零CONTROL[0];

MSR CONTROL,R0;//将清零的内容写入CONTROL;

这样CONTROL[0]就等于0了,变成特权级;程序返回后,继续往

下执行,就是在特权级下的指令执行了。

记得利用MSR+CONTROL返回用户级;如此再加上MPU设备,书上这样形容:安全,健壮……

4、CortexM3的异常、中断及向量表

“中断”和“异常”,经常被混合使用,强调他们对主程序的执行所体现的“中断”性质。书本不强调他们之间的区别。

若一定要区别:

可以理解“异常”由指令执行或访问存储器时产生,例如:存储单元的值改变;

而“中断”可以理解为“中断请求信号”一般由外部产生,例如:外设信息处理请求;

Cortex M3处理器在内核水平上搭载了一个中断控制器——嵌套向量中断控制器NVIC(Nested Vectored Interrupt Controller),可实现非常高校的异常处理。取消FIQ(快速中断处理),取而代之的是“嵌套中断支持”和“优先级管理”。

1. 嵌套中断支持,在下面的“优先级分组”中介绍。

2. 向量中断支持,Cortex M3会自动定位一张向量表,根据中断

号从表中找出相应中断的入口地址,然后跳转过去执行。

3. 异常类型,支持11种系统异常和240种外部中断输入。其中

1~15对应的是系统异常,大于等于16的则全是外部中断。大

部分异常的优先级是可编程的,出了部分固定的。

编号类型优先级描述

1复位-3(最高)复位

2NMI-2不可屏蔽中断(来自外部NMI引脚)

3Hard fault-1所有被除能的fault,都将上访(escalation)成硬fault。只要FAULTMASK没有置位,硬fault服务例程就会被强制执行。Fault被除能的原因包括被禁用,或者FAULTMASK被置位。

4存储器管理fault可编程

存储器管理fault,MPU访问违规或访问非法位置均可引发。企图在“非执行区”取指也会引发此

fault。

5总线fault可编程总线错误,当AHB接口收到总线系统的错误响应时发生(也称为预取中止或是数据中止)。

6用法fault可编程由于程序错误或企图访问协处理器(Cortex M3不支持协处理器)导致的异常。

7~10保留NA NA

11SVCall可编程执行系统服务调用指令(SVC)引发的异常。

12调试监视器可编程调试监视器(断点,数据观察点或外部调试请

求)

13保留NA NA

相关文档
最新文档