ARM基础(1):Cortex-M3的核心寄存器和特殊寄存器

Cortex-M3处理器的寄存器包括R0~R15和一些特殊的寄存器。其中R0到R12是通用寄存器,但是一些16位的Thumb指令只能访问R0到R7(低寄存器),而32位的Thumb-2指令则可以访问所有这些寄存器。特殊寄存器只能通过特殊访问指令访问。


所有的寄存器如下图所示:
在这里插入图片描述

1 核心寄存器

AAPCS(ARM Architecture Procedure Calling Standard)定义的寄存器如下:

寄存器别名描述
r15PCProgram Counter(Current Instruction)
r14LRLink Register(Return Address)
r13SPStack Pointer
r12IPIntra-Procedure-call scratch register
r11v8Variable-register 8
r10v7Variable-register 7
r9v6,SB,TRVariable-register 6 or Platform Register
r8~r4v5~v1Variable-register 5 ~ Variable-register 1
r3~r0a4~a1Argument/scratch register 4 ~ Argument/scratch register 1

这里主要介绍R13~R15寄存器

1.1 R13(Stack Pointer):MSP和PSP

R13是堆栈指针,在CM3中,有两个独立的堆栈内存,用户只能访问当前的堆栈,如果要访问另一个需要用特殊寄存器的MRSMSR指令来进行操作。两种堆栈分别为:

  • MSP(Main Stack Pointer):默认的SP,用在操作系统内核、异常处理函数和所有需要优先权限的访问
  • PSP(Process Stack Pointer):通常由运行嵌入式操作系统的系统中的线程进程使用(不处于异常处理程序中时)

并不是两个堆栈都必须同时使用,对于简单的应用来说,只需要用到MSP。对于堆栈的访问需要用PUSHPOP指令。

PUSH {R0} ; R13=R13-4, then Memory[R13] = R0
POP {R0}  ; R0 = Memory[R13], then R13 = R13 + 4

PUSHPOP通常用于在子例程开始时将寄存器内容保存到堆栈内存中,然后在子例程结束时从堆栈中恢复寄存器。

subroutine_1
	PUSH {R0-R7, R12, R14} ; Save registers
	...                    ; Do your processing
	POP {R0-R7, R12, R14}  ; Restore registers
	BX R14                 ; Return to calling function

因为寄存器PUSHPOP操作总是按字对齐的(地址必须是0x0, 0x4, 0x8, …),故SP/R13的低两位被硬件拉低,读取它将总是为0。

1.2 R14(Link Register)

LR用于在调用函数时,保存它下一条指令的PC。

main ; Main program
...
BL function1    ; Call function1 using Branch with Link instruction.
				; PC = function1 and
				; LR = the next instruction in main
...
function1
... 			; Program code for function 1
BX LR 			; Return

尽管PC的第0位总是为0(指令是按字或半字对齐的),但LR寄存器的第0位是可读写的,这是因为在Thumb指令集中,第0位用来指示ARM/Thumb状态。为了允许Thumb-2的程序能在其它支持Thumb-2的ARM处理器中运行,所以LSB是可读写的。

1.3 R15(Program Counter)

由于Cortex-M3处理器的流水线特性,当读取PC时,该值与此时正在执行指令的地址通常会相差4。例如:

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

其他的指令,比如load指令,由于地址计算中的对齐,PC的有效值可能不是指令地址加4。但是在执行过程中,PC值仍然比指令地址提前至少2个字节。

直接向PC写入数值将触发一个跳转指令,但是LR寄存器不会更新。但无论是直接向PC写入值还是使用B/BL/BX等跳转指令,目标地址的LSB都应该设置为1,表示这是一个Thumb state操作。如果为0,尝试切换到ARM state则会触发异常。

2 特殊寄存器

Cortex-M3中的特殊寄存器如下:

  • Program Status registers (PSRs)
  • Interrupt Mask registers (PRIMASK, FAULTMASK, and BASEPRI)
  • Control register (CONTROL)

特殊寄存器只能通过MSRMRS指令访问,它们没有内存地址:

MRS <reg>, <special_reg>  ; Read special register
MSR <special_reg>, <reg>  ; write to special register

2.1 Program Status Register

程序状态寄存器PSRs被分为三个状态寄存器:

  • Application Program Status register (APSR)
  • Interrupt Program Status register (IPSR)
  • Execution Program Status register (EPSR)

这三个寄存器可以被同时访问,使用xPSR关键字表示这三个寄存器。下图所示为寄存器中具体的字段,还有ARM和ARM7 TDMI中xPSR的对比:
在这里插入图片描述

这些位的定义如下所示:

BitDecription
NNegative
ZZero
CCarry/borrow
VOverflow
QSticky saturation flag
ICI/ITInterrupt-Continuable Instruction (ICI) bits, IF-THEN instruction status bit
TThumb state, always 1; trying to clear this bit will cause a fault exception
Exception numberIndicates which exception the processor is handling

其中APSR是可读写的,而IPSREPSR是只读的。

MRS r0, APSR   ; Read Flag state into R0
MRS r0, IPSR   ; Read Exception/Interrupt state
MRS r0, EPSR   ; Read Execution state
MSR APSR, r0   ; Write Flag state

MRS r0, PSR    ; Read the combined program status word
MSR PSR, r0    ; Write combined program state word

2.2 PRIMASK, FAULTMASK, and BASEPRI Registers

PRIMASKFAULTMASKBASEPRI用来关闭异常。

Register NameDescription
PRIMASK仅1位。当为1时,表示允许NMIHard fault异常,而其它所有的中断和异常都会被屏蔽。默认值为0。
FAULTMASK仅1位。当为1时,表示仅允许NMI异常,其它所有中断和错误处理异常都会被屏蔽。默认值为0。
BASEPRI最多8位(取决于芯片应用的优先级位数)。它表示屏蔽优先级的等级,它将屏蔽所有比该优先级相同和更低的中断。默认值为0。
  • PRIMASKBASEPRI寄存器对于在对实时要求高的任务中,用来临时禁用中断非常有用
  • 而当任务崩溃时,可能会发生许多不同的错误,操作系统可以使用FAULTMASK临时禁用异常错误处理程序,这样在内核开始清理这些错误时,不会被其它错误所中断。因此,FAULTMASK为OS内核提供了处理错误条件的时间。

为了访问这些寄存器,芯片厂商CMSIS一般会在设备的驱动库中提供相应的C函数API:

x = __get_BASEPRI();   // Read BASEPRI register
x = __get_PRIMARK();   // Read PRIMASK register
x = __get_FAULTMASK(); // Read FAULTMASK register
__set_BASEPRI(x);      // Set new value for BASEPRI
__set_PRIMASK(x);      // Set new value for PRIMASK
__set_FAULTMASK(x);    // Set new value for FAULTMASK
__disable_irq();       // Clear PRIMASK, enable IRQ
__enable_irq();        // Set PRIMASK, disable IRQ

__get_BASEPRI()为例,其实现为:

__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void)
{
  uint32_t result;

  __ASM volatile ("MRS %0, basepri" : "=r" (result) );
  return(result);
}

当然在汇编中,我们可以直接通过MRSMSR来访问:

MRS r0, BASEPRI    ; Read BASEPRI register into R0
MRS r0, PRIMASK    ; Read PRIMASK register into R0
MRS r0, FAULTMASK  ; Read FAULTMASK register into R0
MSR BASEPRI, r0    ; Write R0 into BASEPRI register
MSR PRIMASK, r0    ; Write R0 into PRIMASK register
MSR FAULTMASK, r0  ; Write R0 into FAULTMASK register

注意,这三个寄存器不能再user mode下被更改。

2.3 Control Register

控制寄存器用于定义privilege levelSP的选择。我们暂时关注该寄存器的低2位:

BitFunction
1Stack status
1 = Alternate stack is used
0 = Default stack(MSP) is used
thread mode下,Alternate stack为PSP,在handler mode下没有Alternate stack,该位必须设置为0
00 = Privileged in thread mode
1 = User state in thread mode
handler mode下,总是处于privilege mode

对于bit0来说,只有当内核处于thread mode并具有privilege时,该位才可写。在user statehandler mode下,不允许写入此位。除了写入这个寄存器之外,改变这个位的另一种方法是在异常返回时改变LR的第2位。

  • user state切换回privilege state的唯一方法是触发中断并在异常处理程序中更改此状态。

同样的,CMSIS提供了C函数来访问这个寄存器,当然我们也可以使用汇编来访问。

x = __get_CONTROL(); // Read the current value of CONTROL
__set_CONTROL(x);    // Set the CONTROL value to x
MRS r0, CONTROL      ; Read CONTROL register into R0
MSR CONTROL, r0      ; Write R0 into CONTROL register
  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: ARM Cortex-M3Cortex-M4处理器权威指南是一本针对ARM架构的核心处理器的详细手册。该指南提供了有关这两款处理器的全面信息,使得读者能够充分了解它们的功能和特点。 首先,该指南介绍了Cortex-M3Cortex-M4处理器的基本架构。它解释了处理器的不同功能模块,例如中央处理单元(CPU)、内存保护单元(MPU)和系统控制单元(SCU)。此外,该指南还描述了这些处理器所支持的指令集架构和编程模型。 其次,该指南深入探讨了Cortex-M3Cortex-M4处理器的性能特点。它详细介绍了这两款处理器的时钟频率、Cache大小、浮点运算能力和并行处理能力等关键参数。此外,该指南还讨论了这些处理器在功耗管理、中断处理和异常处理等方面的出色表现。 此外,该指南还提供了丰富的编程指南和示例代码,帮助读者使用Cortex-M3Cortex-M4处理器进行软件开发。它介绍了处理器的开发工具链、调试和仿真工具,以及软件开发的最佳实践。此外,该指南还解释了处理器的专有指令和寄存器,以及如何充分利用这些功能。 最后,该指南还介绍了Cortex-M3Cortex-M4处理器的实际应用案例。它列举了一些使用这些处理器开发的典型应用,例如物联网设备、嵌入式系统和工控系统等。此外,该指南还提供了设计和优化这些应用的一些建议和技巧,帮助读者充分利用这些处理器的潜力。 综上所述,ARM Cortex-M3Cortex-M4处理器权威指南是一本全面的技术手册,为读者提供了关于这些处理器的详尽信息。它涵盖了处理器的架构、性能特点、编程指南和实际应用等方面,是开发人员和研究人员的重要参考资料。 ### 回答2: 《ARM Cortex-M3Cortex-M4处理器权威指南》是一本深入介绍ARM Cortex-M3Cortex-M4处理器的权威指南。这本书详细介绍了这两款处理器的架构、特性和应用,对于工程师、开发者和学习者来说,都是一本非常重要和实用的参考书。 首先,该书详细解释了ARM Cortex-M3Cortex-M4处理器的架构设计和功能,包括处理器的可靠性、性能优化和功耗管理等方面。读者可以深入了解这两款处理器的内部结构和工作原理,有助于在实际应用中充分发挥其优势。 另外,该书还介绍了使用Cortex-M3Cortex-M4处理器进行嵌入式系统设计的一些最佳实践和技巧。这包括了基本的编程模型、中断处理、低功耗设计和调试方法等方面。读者可以学习到如何有效地开发和优化嵌入式系统,提高系统性能和稳定性。 此外,该书还提供了丰富的实际应用案例和示例代码,以帮助读者更好地理解和掌握Cortex-M3Cortex-M4处理器的使用。这些案例涵盖了多个应用领域,如物联网、工业控制、医疗设备等,读者可以从中学习到如何将这两款处理器应用到实际项目中。 总之,《ARM Cortex-M3Cortex-M4处理器权威指南》是一本涵盖了ARM Cortex-M3Cortex-M4处理器的全面指南。无论是初学者还是有经验的开发者,都可以从中获得宝贵的知识和经验,提高在嵌入式系统设计和开发领域的能力。 ### 回答3: 《ARM Cortex-M3Cortex-M4处理器权威指南》是一本讲述ARM Cortex-M3Cortex-M4处理器的权威性指南。ARM Cortex-M系列处理器是一种低功耗、高性能处理器架构,被广泛应用于嵌入式系统。 该指南首先介绍了ARM Cortex-M系列处理器的基本架构和特点。它详细解释了这两个处理器的指令集、寄存器和内存管理单元的功能。读者可以了解不同寄存器的作用和寄存器级别的操作。 在介绍基本架构之后,指南详细描述了Cortex-M3Cortex-M4处理器的核心特性和性能差异。读者将了解到Cortex-M4相较于Cortex-M3的新增功能,比如浮点运算单元(FPU)和DSP指令集扩展。这些功能使Cortex-M4更适合用于数字信号处理(DSP)和浮点运算密集型应用。 此外,指南还讨论了Cortex-M3Cortex-M4的系统设计和软件开发。读者将了解到处理器的时钟和功耗管理、中断控制器的配置、外设接口和调试技术等方面的知识。同时,本指南还提供了开发工具和软件编程模型的指导,帮助读者更好地利用Cortex-M系列处理器进行嵌入式开发。 总之,《ARM Cortex-M3Cortex-M4处理器权威指南》是一本全面指导读者了解和使用ARM Cortex-M3Cortex-M4处理器的权威性参考书。无论是硬件工程师还是嵌入式开发人员,都可以从中获得宝贵的知识和指导,提升他们在嵌入式系统开发领域的技术水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

tilblackout

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

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

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

打赏作者

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

抵扣说明:

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

余额充值