#cortex-m #rtos #arm #操作系统

nightly ruco-s-cortex-m

RuCOS内核对ARM Cortex-M的移植

2个版本

0.1.1 2023年11月12日
0.1.0 2023年11月5日

#504操作系统

BSD-3-Clause

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)
    • 用于通过 PUSHPOP 指令访问堆栈内存
    • 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)
    • 主要包含指令集标志(例如,负数、进位、溢出)
    • 在处理模式下还包含异常编号
  • 异常或中断屏蔽:PRIMASKFAULTMASKBASEPRI
    • 所有这些字段默认为零
    • PRIMASK (1b): 阻止所有中断/异常,除了硬故障和NMI
    • FAULTMASK (1b): 与PRIMASK类似,但还阻止硬故障
    • BASEPRI (n位)
      • 阻止所有与相同或更低优先级的异常(0:禁用)
      • 宽度取决于优先级级别数量,这是MCU特定的
    • 除了MRS / MSR之外,还可以使用CPS指令
      • CPSIE iCPSID i:清除或设置PRIMASK
      • CPSIE fCPSID f:清除或设置FAULTMASK
  • 控制寄存器:CONTROL
    • 3个字段,每个1位宽
      • SPSEL:堆栈指针选择(MSPPSP
      • nPRIV:线程模式中的访问级别(受保护或未受保护)
      • FPCA:在当前上下文中使用FPU(当前正在执行的代码)
    • FPCA对Cortex-M3不适用
    • 只能通过受保护访问来写入此寄存器
    • 建议在修改后执行一个ISB指令

浮点单元(FPU)

  • Cortex-M的多项浮点扩展选项:FPv4-SP和FPv5
  • 两者都有32个32位(单精度)寄存器(S0 - S31
    • 也可以作为16个64位(双精度)寄存器进行寻址
  • 额外的特殊寄存器:FPSCR
    • 类似于xPSR,但用于浮点操作
  • 即使MCU有FPU,当设备复位时,它也被禁用
    • 必须写入协处理器访问控制寄存器(CPACR)来启用它
    • CPACR中的两个位还控制FPU的访问(受保护或未受保护)

堆栈

  • 寄存器必须在函数调用或中断之间保持不变
    • 这是通过堆栈完成的
  • 在进入时推入寄存器,在退出时弹出
    • 这个过程称为“堆栈”
  • 硬件自动堆栈R0 - R3R12LRPCxPSR
    • 当使用FPU时,这还包括S0 - S15FPSCR(扩展)
  • 软件负责堆栈R4 - R8R11SP
    • 当使用FPU时,这还包括S16 - S31(扩展)
  • 要退出时恢复状态,将特殊的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