2个版本
0.1.1 | 2023年11月12日 |
---|---|
0.1.0 | 2023年11月5日 |
#504 在 操作系统
36KB
488 行
RuCOS Cortex-M
将RuCos内核移植到Cortex-M。
实现说明
参考文献
- 《Cortex-M3和Cortex-M4处理器的权威指南》 by Joseph Yiu
- 《ARM Cortex-M RTOS上下文切换》 by Chris Coleman
架构
- Thumb指令集
- ARMv7-M: Cortex-M3
- ARMv7-EM: Cortex-M4, Cortex-M7
- 增加DSP指令
- 增加可选的浮点单元(FPU)
- Cortex-M7 FPU可以是双精度
模式
- 特权访问:无限制访问所有系统资源
- 所有Cortex-M设备都以这种模式开始
- 非特权访问:一些内存区域和特殊指令不可用
- 在Cortex-M0上不可用
- 处理模式
- 执行异常处理程序时使用
- 始终具有特权访问级别
- 线程模式
- 正常应用程序代码
- 可以是特权或非特权,取决于
CONTROL
寄存器
寄存器组
- 16个寄存器
R0 - R12
: 通用R13
: 栈指针 (SP
)- 用于通过
PUSH
和POP
指令访问堆栈内存 MSP
: 主栈指针,用于复位和处理模式PSP
: 进程栈指针,只能在线程模式下使用
- 用于通过
R14
: 链接寄存器 (LR
)R15
: 程序计数器 (PC
)
特殊寄存器
使用特殊的汇编指令访问
MRS <reg> , <special_reg>; Read special register into register
MSR <special_reg>, <reg> ; Write to special register
特殊寄存器的描述
- 程序状态寄存器:
xPSR
- 应用、执行和中断PSR
- 以三个单独的寄存器呈现,但可以作为一个整体访问 (
PSR
) - 主要包含指令集标志(例如,负数、进位、溢出)
- 在处理模式下还包含异常编号
- 异常或中断屏蔽:
PRIMASK
、FAULTMASK
、BASEPRI
- 所有这些字段默认为零
PRIMASK
(1b): 阻止所有中断/异常,除了硬故障和NMIFAULTMASK
(1b): 与PRIMASK类似,但还阻止硬故障BASEPRI
(n位)- 阻止所有与相同或更低优先级的异常(0:禁用)
- 宽度取决于优先级级别数量,这是MCU特定的
- 除了
MRS
/MSR
之外,还可以使用CPS
指令CPSIE i
,CPSID i
:清除或设置PRIMASKCPSIE f
,CPSID f
:清除或设置FAULTMASK
- 控制寄存器:
CONTROL
- 3个字段,每个1位宽
SPSEL
:堆栈指针选择(MSP
或PSP
)nPRIV
:线程模式中的访问级别(受保护或未受保护)FPCA
:在当前上下文中使用FPU(当前正在执行的代码)
FPCA
对Cortex-M3不适用- 只能通过受保护访问来写入此寄存器
- 建议在修改后执行一个
ISB
指令
- 3个字段,每个1位宽
浮点单元(FPU)
- Cortex-M的多项浮点扩展选项:FPv4-SP和FPv5
- 两者都有32个32位(单精度)寄存器(
S0 - S31
)- 也可以作为16个64位(双精度)寄存器进行寻址
- 额外的特殊寄存器:
FPSCR
- 类似于
xPSR
,但用于浮点操作
- 类似于
- 即使MCU有FPU,当设备复位时,它也被禁用
- 必须写入协处理器访问控制寄存器(
CPACR
)来启用它 CPACR
中的两个位还控制FPU的访问(受保护或未受保护)
- 必须写入协处理器访问控制寄存器(
堆栈
- 寄存器必须在函数调用或中断之间保持不变
- 这是通过堆栈完成的
- 在进入时推入寄存器,在退出时弹出
- 这个过程称为“堆栈”
- 硬件自动堆栈
R0 - R3
,R12
,LR
,PC
和xPSR
- 当使用FPU时,这还包括
S0 - S15
和FPSCR
(扩展)
- 当使用FPU时,这还包括
- 软件负责堆栈
R4 - R8
,R11
和SP
- 当使用FPU时,这还包括
S16 - S31
(扩展)
- 当使用FPU时,这还包括
- 要退出时恢复状态,将特殊的
EXC_RETURN
值加载到LR
0xFFFF_FFF1
:使用MSP返回处理程序模式0xFFFF_FFF9
:使用MSP返回线程模式0xFFFF_FFFD
:使用PSP返回线程模式0xFFFF_FFE1
:使用MSP返回处理程序模式(FPU扩展帧)0xFFFF_FFE9
:使用MSP返回线程模式(FPU扩展帧)0xFFFF_FFED
:使用PSP(FPU扩展帧)返回线程模式
依赖项
~1MB
~18K SLoC