大家好,欢迎来到IT知识分享网。
Cortex-M3基础
寄存器组
- 通用目的寄存器组R0-R7
- 也被称为低组寄存器,所有指令都能访问
- 字长32位
- 通用目的寄存器组R8-R12
- 高组寄存器
- 32位寄存器
复位后的初始值不可预料
- 堆栈指针R13
- CM3中共有两个堆栈指针
- 主堆栈指针(MSP)
- 这是缺省的堆栈指针,它由 OS 内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。
- 进程堆栈指针(PSP)
- 用于常规的应用程序代码(不处于异常服用例程中时)
- 主堆栈指针(MSP)
- 能引用到的是当前正在使用的那个
- 另一个必须用特殊指令来访问(MSR,MRS)
- PUSH指令和POP指针默认使用SP
- 在 PUSH 新数据时,堆栈指针先减一个单元。通常在进入一个子程序后,第一件事就是把寄存器的值先PUSH 入堆栈中,在子程序退出前再 POP 曾经 PUSH 的那些寄存器。另外, PUSH 和 POP 还能一次操作多个寄存器,
- R13最低两位被硬线连接到0,并且总是读出0
- CM3中共有两个堆栈指针
- 连接寄存器R14
- 连接寄存器(LR)
- 用于在调用子程序时存储返回地址
- LR的LSB可读可写
- 程序计数器R15
- PC
- 读PC时返回的值是当前指令的地址+4
- 如果向 PC 中写数据,就会引起一次程序的分支(但是不更新 LR 寄存器)。 CM3 中的指令至少是半字对齐的,所以 PC 的 LSB 总是读回 0。然而, 在分支时,无论是直接写 PC 的值,还是使用分支指令,都必须保证加载到 PC 的数值是奇数(即 LSB=1),用以表明这是在Thumb 状态下执行。倘若写了 0,则视为企图转入 ARM 模式,CM3 将产生一个 fault 异常。
- 特殊功能寄存器
- 程序状态寄存器组
- 应用程序PSR(APSR)
- 中断号PSR(IPSR)
- 执行PSR(EPSR)
- 中断屏蔽寄存器组
- PRIMASK
- 只有1位
- 置1时关掉所有可以屏蔽的异常,只剩下NMI和硬fault可以响应
- 缺省值位0,表示没有关中断
- FAULTMASK
- 只有1位
- 置1时只有NMI才能响应
- BASEPRI
- 最多有9位,由表达优先级的位数决定
- 定义了被屏蔽优先级的阈值,当它被设置成某个值之后所有优先级号大于等于此值的中断都被关掉
- 缺省值为0,不关闭任何中断
- 以上三个寄存器用于控制异常的使能和除能
- 对于时间关键任务来说,PRIMASK和BASSEPRI对于暂时关闭中断是非常重要的
- FAULTMASK是专门留给OS使用的
- PRIMASK
- 控制寄存器
- 用于定义特权级别
- 还用于选择当前使用哪个堆栈指针
- 它们只能被专用的 MSR 和 MRS 指令访问,而且它们也没有存储器地址。
- 程序状态寄存器组
操作模式
异常与中断
Cortex-M3支持大量异常,包括11个系统异常和最多240个外部中断——简称IRQ
由外设产生的中断信号,除了 SysTick 的之外,全都连接到 NVIC 的中断输入信号线。
Cortex-M3堆栈的实现
向下生长的满栈
SP指向最后一个被压入堆栈的32位数值
下一次压栈时,SP先自减4,在存入新的数值
POP操作恰好相反
参考文档:Cortex-M3权威指南
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/132354.html