Cortex M3学习笔记 02 寄存器,中断控制器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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