《Cortex-M0权威指南》之体系结构---系统模型

转载请注明来源:cuixiaolei的技术博客

Cortex-M0体系结构包括:系统模型、存储器映射、异常中断。这篇文章主要讲解Cortex-M0的系统模型。


操作模式和状态

如上图所示,Cortex-M0包括两种操作模式和两种状态

  • Thumb状态(Thumb state)
  1. 处理模式
  2. 线程模式
  • 调试状态

  处理器启动后处于Thumb状态,在这种状态下,处理器可以处于线程模式和处理模式,线程模式时执行普通代码,处理模式时执行异常处理。线程模式和处理模式的系统模型几乎一模一样,唯一的不同在于线程模式通过配置CONTROL特殊寄存器,可以使用进程指针。

  调试状态仅用于调试操作,暂停处理器内核后,执行不会再执行。在这种状态下,调试器可以读取甚至改变内核寄存器的值。

  处理器上电后默认处于Thumb状态的线程模式,执行普通代码。


寄存器和特殊寄存器

  

  数据的解析和控制器的处理过程中,需要处理器内核寄存器的参与。如果需要处理控制器中的数据,这些数据需要先加载到处理器内核的寄存器(寄存器组中的摸个),处理完成后,如果有需必要,它们还会被送到存储器中,这种方式被称为“加载-存储架构”(load-store architecture)。

  Cortex-M0有13个32位通用寄存器R0-R12,以及多个特殊寄存器。

  寄存器组包含16个32位寄存器,其中13个时通用的,其余三个具有特殊用途。


R0-R12 通用寄存器

  R0-R12为32位通用寄存器,由于16位thumb指令集在空间上的限制,许多Thumb指令只能操作R0-R7,它们被称为低寄存器,而想MOV之类的一些指令则可以使用全部的寄存器。R0-R12寄存器的初始化值未定义。


R13,栈指针(SP)

  R13为栈指针,对栈空间进行存取操作(通过PUSH和POP指令),Cortex-M0在不同的物理地址上有两个栈指针,一个为主栈指针(MSP),也被称为SP_main,一个指针称为进程栈指针(PSP),也为称为SP_process,只能用在线程模式。可以通过CONTROL寄存器,选择使用那个栈指针。

  在ARM处理器中,由于寄存器是32位的,所以PUSH和POP指令永远是32位操作,而且存取地址是32位字对齐(32位对齐)。在处理器上电过程中,中断向量表的头4字节会被去除(中断向量表在0x000000000地址),然后填充到MSP,作为MSP的初始值,PSP的初始值为定义。

  一般使用操作系统是PSP进程栈指针才会被使用,这是因为操作系统内核的栈空间和线程级的应用程序的栈空间是相互独立的。


R14,链接寄存器(LR)

  R14为链接寄存器,用于存储子程序或者函数调用的返回地址。子程序或者函数执行完毕,存储在LR中的返回地址将被装在到程序计数器PC中,以便调用程序可以继续执行。当发生异常中断时,LR会提供一个特定值,用于中断返回机制。

  尽管Cortex-M0处理器的函数返回地址始终时偶数(最低位为0,因为最小的指令都是16位的),LR的0位时可读写的。为了指明当前处于thumb状态,一些指令需要函数地址最低位为1。


R15,程序计数器(PC)

  R15为程序计数器,为可读写。读操作返回当前正在执行的指令加上4(这是由流水线的特性决定的),而写入R15会导致程序跳转执行,这和函数调用不同,链接寄存器不会更新。

  Cortex-M0处理器指令是16位对齐的,所以PC寄存器的最低位必须始终为0.不过在使用跳转指令BX或者BLX执行跳转执行时,PC的最低位应该被置1,以表明目标分支处于thumb程序区域。如果试图切换到Cortex-M0未知的ARM状态,错误异常中断会被触发。


xPSR,组合程序状态寄存器

            xPSR寄存器

            xPSR寄存器

  组合程序状态寄存器提供了程序执行信息和ALU(算数逻辑单元)标志,改寄存器由三个程序状态寄存器(PSR)组成,如上图:

  • 应用程序状态寄存器(APSR)
  • 中断程序状态寄存器(IPSR)
  • 执行程序状态寄存器(EPSR)

应用程序状态寄存器

  APSR包含了ALU算数逻辑单元标志,位于xPSR最高4位,一般用于控制程序跳转:

  • N表示负号标志
  • Z表示零标志
  • C表示进位或借位标志
  • V表示溢出标志

中断程序状态寄存器

  IPSR包含了当前正在执行的中断服务程序(ISR)编号,Cortex-M0的每个异常中断都会由一个特定的中断编号(表示中断类型)。这对调试时识别当前的中断非常有用,而且在多个中断共用一个中断处理的情况下,可以看出放生的时哪个中断。

执行程序状态寄存器

  EPSR包含了T位,该位用来表示当前是否处于Thumb状态。由于Cortex-M0处理器只支持Thumb状态,所以T位一般为1.清除该位(置零)后,执行吓一跳置零会触发硬件异常中断。


PRIMASK,中断屏蔽特殊寄存器

  PRIMASK仅有一位位宽,置位后,除了不可屏蔽中断(NMI)和硬件错误异常外的其他中断都会被屏蔽。实际上,此时当前中断优先级被置为0,也就是最高等级。

  要访问PRIMASK寄存器,可以通过特殊寄存器操作置零(MSR和MRS),也可以使用“改变处理器状态”置零(CPS)。在处理器对事件敏感的应用时,需要操作PRIMASK寄存器。


CONTROL,特殊寄存器

  前面已经提到,Cortex-M0处理器具有两个栈指针。处理器模式决定了使用的栈指针,而处理器模式以来与CONTROL寄存器的配置。

  复位以后,系统默认使用主栈指针,在线程模式下,通过配置CONTROL寄存器的第一位置1,处理器可以切换至使用进程栈指针(前提是当前不是处在异常中断处理中)。在处理异常中断时(运行在处理模式下),系统只能使用主栈指针,CONTROL寄存器读出的值为0。要改变CONTROL寄存器的值,应该在线程模式下进行操作,或者借助异常中断进入和返回机制。

  为了兼容Cortex-M3,CONTROL寄存器的0位保留。在Cortex-M3中,第0位用于将处理器切换至用户模式,这个特性在M0中没有。

《Cortex-M0权威指南》之体系结构---系统模型相关推荐

  1. ARM Cortex M0权威指南_PDF电子书下载 带书签目录 高清完整版 http://pan.baidu.com/s/1jGKQSwY MariaDB入门很简单_PDF电子书下载 带

    ARM  Cortex  M0权威指南_PDF电子书下载 带书签目录 高清完整版   http://pan.baidu.com/s/1jGKQSwY   MariaDB入门很简单_PDF电子书下载 带 ...

  2. 《Cortex-CM3权威指南》——存储器系统

    一.存储器系统的功能概览 1.Cortex-CM3存储器系统功能 1).存储器映射是预定义的,并且还规定好了那个位置使用那条总线. 2).Cortex-CM3的存储器系统支持"位带" ...

  3. 《Cortex-M0权威指南》之体系结构---存储器系统

    <Cortex-M0权威指南>之体系结构---存储器系统 转载请注明来源:cuixiaolei的技术博客 Cortex-M0处理器为32位处理器,所以具有最大4G的寻址空间.在体系结构上, ...

  4. 《Cortex-M0权威指南》之体系结构---栈空间操作

    <Cortex-M0权威指南>之体系结构---栈空间操作 转载请注明来源:cuixiaolei的技术博客 栈空间作为一种存储器使用机制,是"先入先出"的结构,在系统空间 ...

  5. 《Cortex-M0权威指南》之体系结构---嵌套中断控制器(NVIC)

    <Cortex-M0权威指南>之体系结构---嵌套中断控制器(NVIC) 转载请注明来源:cuixiaolei的技术博客 为了管理中断请求的优先级并处理其他异常,Cortex-M0处理器内 ...

  6. 爬虫书籍-Python网络爬虫权威指南OCR库 NLTK 数据清洗 BeautifulSoup Lambda表达式 Scrapy 马尔可夫模型

    Python网络爬虫权威指南 编辑推荐 适读人群 :需要抓取Web 数据的相关软件开发人员和研究人员 作为一种采集和理解网络上海量信息的方式,网页抓取技术变得越来越重要.而编写简单的自动化程序(网络爬 ...

  7. 《Cortex-M0权威指南》之体系结构---异常和中断

    <Cortex-M0权威指南>之体系结构---异常和中断 参考文章: (1)<Cortex-M0权威指南>之体系结构---异常和中断 (2)https://www.cnblog ...

  8. 《嵌入式系统数字视频处理权威指南》——第1章 现实世界中的视频

    本节书摘来自华章计算机<嵌入式系统数字视频处理权威指南>一书中的第1章,作者:(美)Michael Parker Suhel Dhanani 更多章节内容可以访问云栖社区"华章计 ...

  9. 《低功耗蓝牙开发权威指南》——第3章低功耗蓝牙的体系结构

    本节书摘来自华章社区<低功耗蓝牙开发权威指南>一书中的第3章低功耗蓝牙的体系结构,作者 (英)Robin Heydon,更多章节内容可以访问云栖社区"华章社区"公众号查 ...

最新文章

  1. python 位运算与等号_Python 运算符
  2. Cisco2811基本操作
  3. Galgame研发日志:独立游戏制作前应当进行的第一步
  4. 简单入门——深度学习笔记(Part II)
  5. 类名.this与this的区别
  6. java求数组和值_用java编写数组求和,array[]和ArrayList()?
  7. 分表扩展全局序列原理_高可用_单表存储千万级_海量存储_分表扩展---MyCat分布式数据库集群架构工作笔记0025
  8. 如何在C# 中使用WMI 实现远程查询和共享
  9. 论文阅读笔记(七)——Thin MobileNet
  10. 手把手Java爬虫教学 - 1. 了解爬虫
  11. Qt知识点梳理 —— 实现汉字转拼音全拼简拼及首字母
  12. 深度 | 苹果略胜微软一筹,为什么说 ARKit 是 AR 的最好选择?
  13. 中国小微企业调查数据CMES:小型微型家庭作坊式企业收支工商税收营商情况
  14. 凤凰牌老熊对支付的系统讲解
  15. 安卓蓝牙实现即时通讯功能
  16. Telephony之TelephonyManager(原)
  17. 使用Layui制作界面及功能
  18. 破解验证码(2)滑动验证码
  19. 微信小程序实现星级评价和效果展示
  20. 光场相机lytro的安装和使用

热门文章

  1. latex格式简要说明
  2. 【html xml】gt; 大于 lt; 小于
  3. c++二分答案 之 跳石头
  4. form表单的提交地址一定要是完整的绝对地址
  5. UCOS2_STM32移植详细过程(汇总)
  6. nginx 平滑升级
  7. ecshop 手机端没做和电脑一样显示
  8. SharePoint2007安装图文详解三:安装SqlServer2005
  9. java 数组转字符串 字符串转数组,java高级面试笔试题
  10. (转)postgresql+postgis空间数据库使用总结