Cortex-M3基础

概述

Cortex-M3是一个32位处理器内核,采用哈佛结构,拥有独立的指令总线和数据总线。

寄存器组

在这里插入图片描述

R0-R12 通用寄存器

R0-R12 都是32位的通用寄存器,绝大多数16位Thumb指令只能方位R0-R7,而32位Thumb-2指令能访问所有寄存器

Banked R13 堆栈指针SP

R13 是堆栈指针。在 CM3 处理器内核中共有两个堆栈指针,于是也就支持两个堆栈。当引用 R13(或写作 SP)时,你引用到的是当前正在使用的那一个,另一个必须用特殊的指令来访问(MRS,MSR 指令)。这两个堆栈指针分别是:

  • 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
  • 进程堆栈指针(PSP):由用户的应用程序代码使用
R14 链接寄存器LR

R14 是链接寄存器(LR)。在一个汇编程序中,你可以把它写作 both LR 和 R14。 LR 用于在调用子程序时存储返回地址。例如,当你在使用 BL(分支并连接, Branch and Link)指令时,就自动填充 LR 的值。
在这里插入图片描述

R15 程序计数寄存器PC

R15 是程序计数器,在汇编代码中你也可以使用名字“PC”来访问它。因为 CM3 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4。比如说:
在这里插入图片描述

特殊功能寄存器

Cortex‐M3 还在内核水平上搭载了若干特殊功能寄存器,包括

  • 程序状态字寄存器组(PSRs)
  • 中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)
  • 控制寄存器(CONTROL)

它们只能被专用的 MSR 和 MRS 指令访问,而且它们也没有存储器地址。
在这里插入图片描述

  • 程序状态字寄存器组(PSRs)
    在这里插入图片描述

  • 中断屏蔽寄存器组
    在这里插入图片描述
    在这里插入图片描述

  • 控制寄存器(CONTROL)

控制寄存器用于定义特权级别,还用于选择当前使用哪个堆栈指针。
在这里插入图片描述

操作模式和特权级别

操作模式
  • handler mode
  • thread mode

引入两个模式的本意,是用于区别普通应用程序的代码和异常服务例程的代码——包括中断服务例程的代码。

特权级别
  • privileged
  • user

提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作。处理器支持两种特权级,这也是一个基本的安全模型。

关系如下
在这里插入图片描述
在 CM3 运行主应用程序时(线程模式),既可以使用特权级,也可以使用用户级;但是异常服务例程必须在特权级下执行。

复位后,处理器默认进入线程模式,特权极访问。在特权级下,程序可以访问所有范围的存储器并且可以执行所有指令。

在特权级下的程序可以为所欲为,但也可能会把自己给玩进去——切换到用户级。一旦进入用户级,再想回来就得走“法律程序”了——用户级的程序不能简简单单地试图改写 CONTROL 寄存器就回到特权级,它必须先“申诉”:执行一条系统调用指令(SVC)。这会触发 SVC 异常,然后由异常服务例程(通常是操作系统的一部分)接管,如果批准了进入,则异常服务例程修改 CONTROL 寄存器,才能在用户级的线程模式下重新进入特权级。

事实上,从用户级到特权级的唯一途径就是异常:如果在程序执行过程中触发了一个异常,处理器总是先切换入特权级,并且在异常服务例程执行完毕退出时,返回先前的状态(也可以手工指定返回的状态——译注)。
在这里插入图片描述

存储器映射

在这里插入图片描述

中断和异常

CM3 的所有中断机制都由 NVIC 实现。除了支持 240 条中断之外, NVIC 还支持 16‐4‐1=11 个系统异常源,可以实现 fault 管理机制。
在这里插入图片描述
在这里插入图片描述

CM3堆栈的实现

在这里插入图片描述
在这里插入图片描述

CM3的双堆栈机制

CM3有2个堆栈指针,msp和psp,CONTROL[1]决定使用哪个
当 CONTROL[1]=0 时,只使用 MSP,此时Thread mode 和 handler mode共享同一个堆栈。这也是复位后的缺省使用方式。
在这里插入图片描述
当 CONTROL[1]=1 时,Thread mode使用 PSP,handler mode使用MSP,这里注意,进入异常前自动压栈是向PSP压栈,进入异常后才自动改为msp,退出异常后切换回PSP,就是利用这个特点来做OS上下文切换
在这里插入图片描述

复位顺序

在离开复位状态后, CM3 做的第一件事就是读取下列两个 32 位整数的值:

  • 从地址 0x0000,0000 处取出 MSP 的初始值。
  • 从地址 0x0000,0004 处取出 PC 的初始值——这个值是复位向量, LSB 必须是 1指示处于Thumb状态。然后从这个值所对应的地址处取指。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值