CortexM3学习笔记02寄存器,中断控制器.doc

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

shenlan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档