基于STM32的简易RTOS分析-预备知识

写下这篇文章的主要目的是对自己学习RTOS的历程做一个记录和总结,方便以后回忆翻看。以下内容主要来自宋岩先生翻译的《Cortex-M3权威指南》。

目录

一、Cortex-M3寄存器简介

​二、堆栈操作简介

三、汇编指令简介

LDR和STR指令

STMDB和LDMIA指令

B、BX、 BL、 BLX指令

MRS 和 MSR指令

四、中断简介

    中断响应过程简介

SVC和PensSV中断简介

软件中断

五、汇编基础


一、Cortex-M3寄存器简介

Cortex‐M3 处理器拥有 R0‐R15 的寄存器组。R0‐R12都是32位通用寄存器,用于数据操作。R13-R15是专用寄存器。

基于STM32的简易RTOS分析-预备知识_第1张图片

R0-R3:用作传入函数参数,传出函数的返回值。在子程序运行时,可将R0-R3用于任何用途。被调用函数在返回之前不必恢复R0-R3,如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。

R4-R11:被用来存放函数的局部变量。如果调用函数使用了这些寄存器,它在返回之前必须恢复寄存器的值。

R13是堆栈指针(SP),Cortex‐M3 拥有两个堆栈指针,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。需要注意的是堆栈指针的最低两位永远是 0,这意味着堆栈总是 4 字节对齐的。

  • 主堆栈指针( MSP):复位后缺省使用的堆栈指针,用于操作系统内核、异常处理例程(包括中断服务例程)以及所有需要特权访问的应用程序来使用
  • 进程堆栈指针( PSP):由用户的应用程序代码使用(不处于异常服务程序时)。

R14是链接寄存器(LR),当呼叫一个子程序时,由 R14 存储返回地址;例如,当你在使用 BL(分支并连接, Branch and Link)指令时,就自动填充 LR 的值。

main ;主程序
    …
    BL Task ; 使用“分支并连接”指令呼叫 Task,PC= Task,并且 LR=main 的下一条指令地址
    …
Task
    …       ; Task 的代码
    BX LR   ; 函数返回(如果 Task再次调用其他函数要使用 LR,必须在使用前 PUSH,否则返回时LR的值被改变程序就可能跑飞了)

R15是程序计数器(PC)指向当前的程序地址。如果修改它的值,就能改变程序的执行流程。

Cortex‐M3 还在内核水平上搭载了若干特殊功能寄存器,它们只能被专用的 MSR 和 MRS 指令访问,而且它们也没有存储器地址。这些寄存器包括:

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

程序状态寄存器PSR在其内部又被分为三个子状态寄存器:应用程序 PSR( APSR)、中断号 PSR( IPSR)、执行 PSR( EPSR)。通过 MRS/MSR 指令,这 3 个 xPSR 即可以单独访问,也可以组合访问( 2 个组合, 3 个组合都可以)。当使用三合一的方式访问时,应使用名字“xPSR”或者“ PSR”,合体后的xPSR如下图所示。

PRIMASK, FAULTMASK 和 BASEPRI这三个寄存器用于控制异常(中断)的使能和除能。

基于STM32的简易RTOS分析-预备知识_第2张图片

控制寄存器(CONTROL)控制寄存器用于定义特权级别,还用于选择当前使用MSP还是PSP。

你可能感兴趣的:(嵌入式)