Cortex-M3 内部寄存器

寄存器组

R0-R12

R0-R12,通用寄存器; 
R0-R12都是32位通用寄存器,用于数据操作;但是绝大多数16位Thumb指令只能访问R0-R7,而32位Thumb指令可以访问所有寄存器;

R13

R13,SP,堆栈指针; 
Cortex-M3有两个堆栈指针,它们是Banked,任一时刻只能使用其中一个;当引用R13/SP时,引用的是当前正在使用的那一个,另一个必须使用MRS/MSR指令来访问; 
- 主堆栈指针MSP:复位后缺省堆栈指针,用于操作系统内核操作和异常处理例程; 
- 进程堆栈指针PSP:由用户的应用程序代码使用; 
堆栈指针的最低两位永远为0,这意味着堆栈总是4字节对齐的;

R14

R14,LR,链接寄存器; 
当调用子程序时,由R14存储返回地址;如果子程序多于1级,则需要把前一级的R14压入堆栈;

R15

R15,PC,程序计数器寄存器 
读PC值,返回的是当前指令地址+4;如果修改它,就能改变程序的执行流; 
在分支时,无论直接写PC,还是使用分支指令,都必须保证加载到PC的数值是奇数(LSB=1),用以表明是在Thumb状态下执行,如果为0,将产生fault;

特殊功能寄存器

特殊功能寄存器必须通过MRS/MSR指令操作;

程序状态寄存器

程序状态寄存器(PSRs或xPSR)在内部可分为3个子状态寄存器: 
- 应用程序PSR(APSR) 
- 中断号PSR(IPSR) 
- 执行PSR(EPSR) 
通过MRS/MSR指令,这3个PSR可以单独访问,也可组合访问: 
- PSR = APSR + IPSR + EPSR 
- IAPSR = IPSR + APSR 
- IEPSR = IPSR + EPSR 
- EAPSR = EPSR + APSR

 313029282726-252423-2019-1615-1098-0
APSRNZCVQ       
IPSR           Exception Number
EPSR     ICI/ITT  ICI/IT  

中断屏蔽寄存器

PRIMASK

这个寄存器只有一个位,置1后,将关闭所有可屏蔽中断的异常,只剩NMI和硬fault,默认值为0; 
操作指令:

MRS R0, PRIMASK        ; R0=PRIMASK
MSR PRIMASK, R0        ; PRIMASK=R0
CPSID I                ; PRIMASK=0
CPSIE I                ; PRIMASK=1
  • 1
  • 2
  • 3
  • 4

FAULTMASK

这个寄存器也只有一位,置1后,屏蔽除NMI外的所有异常(包括硬fault),默认值为0; 
操作指令:

MRS R0, FAULTMASK       ; R0=FAULTMASK
MSR FAULTMASK, R0       ; FAULTMASK=R0
CPSID F                 ; FAULTMASK=0
CPSIE F                 ; FAULTMASK=1
  • 1
  • 2
  • 3
  • 4

BASEPRI

这个寄存器有9位,它定义了被屏蔽优先级的阈值;当它被设定为某个值后,所有优先级号大于等于此值得中断都被关闭,若设为0,则不关闭任何中断,默认值为0;

MRS R0, BASEPRI       ; R0=BASEPRI
MSR BASEPRI, R0       ; BASEPRI=R0
  • 1
  • 2

控制寄存器(CONTROL)

  • CONTROL[1]:为0表示选择MSP,为1表示选择PSP;
  • CONTROL[0]:为0表示特权级的线程模式,为1表示用户级的线程模式;
阅读更多
上一篇FreeRTOS 临界区总结
下一篇[bug #37271] endless loop seg = pcb->unacked; seg->next != NULL; seg = seg->next
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭