M3/M4内核基础

1.寄存器组

CM3 拥有通用寄存器 R0‐R15 以及一些特殊功能寄存器。 R0‐R12 是最“通
用目的” 的, 但是绝大多数的 16 位指令只能使用 R0‐R7(低组寄存器),而 32 位的 Thumb‐2指令则可以访问所有通用寄存器。 特殊功能寄存器有预定义的功能, 而且必须通过专用的指令来访问。M4只比M3多了一个浮点运算单元FPU.
在这里插入图片描述

通用目的寄存器 R0-R7:
R0‐R7 也被称为低组寄存器。所有指令都能访问它们。它们的字长全是 32 位,复位后的初始值是不可预料的。

通用目的寄存器 R8-R12:
R8‐R12 也被称为高组寄存器。这是因为只有很少的 16 位 Thumb 指令能访问它们, 32位的指令则不受限制。它们也是 32 位字长,且复位后的初始值是不可预料的。

堆栈指针 R13:
R13 是堆栈指针。在 CM3 /4处理器内核中共有两个堆栈指针,于是也就支持两个堆栈。当引用 R13(或写作 SP)时,你引用到的是当前正在使用的那一个,另一个必须用特殊的指令来访问( MRS,MSR 指令)。
主堆栈指针(MSP),或写作 SP_main。这是缺省的堆栈指针,它由 OS 内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。

进程堆栈指针(PSP),或写作 SP_process。用于常规的应用程序代码

并不是每个应用都必须用齐两个堆栈指针。简单的应用程序只使用 MSP就够了。堆栈指针用于访问堆栈,并且 PUSH 指令和 POP 指令默认使用 SP。
汇编指令:(向下生长的满栈) 与数据结构里面的栈不同)

PUSH {R0} ; *(--R13)=R0。 R13 是 long*的指针
POP {R0} ; R0= *R13++

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

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

0x1000: MOV R0, PC ; R0 = 0x1004

特殊功能寄存器组
它们只能被专用的 MSR 和 MRS 指令访问,而且它们也没有存储器地址

程序状态寄存器(PSRs 或曰 PSR):
程序状态寄存器在其内部又被分为三个子状态寄存器:

	应用程序 PSR( APSR)
	中断号 PSR( IPSR)
	执行 PSR( EPSR)

中断屏蔽寄存器组( PRIMASK, FAULTMASK,以及 BASEPRI)
在这里插入图片描述
PRIMASK 和 BASEPRI 对于暂时关闭中断是非常重要的。而FAULTMASK 则可以被 OS 用于暂时关闭 fault 处理机能

快速关中断指令:

CPSID I ;PRIMASK=1;关中断
CPSIE I ;PRIMASK=0;开中断
CPSID F ;FAULTMASK=1, ;关异常
CPSIE F ;FAULTMASK=0 ;开异常

控制寄存器( CONTROL)

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

2.操作模式
Cortex‐M3/4 支持 2 个模式和两个特权等级。
在这里插入图片描述

修改模式:CONTROL[ 0]只有在特权级下才能访问。用户级的程序如想进入特权级,通常都是使用一条“系统服务呼叫指令( SVC)”来触发“SVC 异常”,该异常的服务例程可以选择修改CONTROL[0]

3.FPU浮点单元
在M4中有一个可选的单精度FPU单元,如果使能了FPU单元就可以使用它来对单精度浮点数进行计算,双精度浮点数的运算仍要使用到C运行库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super.Bear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值