- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
CortexM3学习笔记02寄存器,中断控制器
Cortex M3学习笔记 02
寄存器,中断控制器
好像百度看了我的文章一样,上次笔记中写了一些对抱怨审核太慢的内容,结果第二天就审核好了,不知道这次速度怎么样……
名词定义
MSP:主堆栈指针;
PSP:进程堆栈指针;
寄存器
通用寄存器:32位一个,不多说,一共22个。
R0~R15,其中R13是个有两个堆栈指针寄存器的功能,一共17个;另外还有5个特殊功能寄存器。下面来理解。
通用寄存器
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异常。
特殊功能寄存器
程序状态寄存器组(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)。
定义特权级别:特权级线程模式,用户级线程模式;
CONTROL[0]=0是特权级;
CONTROL[0]=1是用户级;
选择当前堆栈指针:主堆栈MSP,备用堆栈。
CONTROL[1]=0是主堆栈(复位缺省);
CONTROL[1]=1是备用堆栈,
特殊功能寄存器不存在地址,只能被专用的MSR和MRS指令访问。
使用方式:
MRS gp_reg , special_reg;
读特殊功能寄存器的值到通用寄存器;
MSR special_reg , gp_reg;
写通用寄存器的值到特殊功能寄存器;
其中gp_reg是通用寄存器,special_reg是特殊寄存器;
例如:
· MOV R0,#0x01;
MOV RPIMASK,R0;
· MOV R0,0x60;
MOV BASEPRI,R0;
CortexM3操作模式和特权级别
分为两种模式;两种级别:
操作模式:线程模式(Thread mode),处理模式(handler mode);
线程模式:在此模式中程序指令逐一运行;
处理模式:在程序执行过程中,触发了一个异常后,处理器将进入到处理模式;处理结束后返回之前的状态。
特权级别:特权级,用户级;
特权级:系统开启后默认进入。无限制。
用户级:处理器将禁止对系统控制区域(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了,
文档评论(0)