arm的状态寄存器

一、arm 的 PSRs

arm 中有很多程序状态寄存器(Program Status Registers,PSRs)用于存储处理器的状态信息,包括 CPSR\SPSR\FPSR\APSR 等:

  • CPSR(Current Program Status Register):当前程序状态寄存器,用于存储当前程序的状态信息,包括处理器模式、条件码、中断使能状态等。
  • SPSR(Saved Program Status Register):保存程序状态寄存器,用于保存异常处理程序执行前的状态,以确保异常处理程序执行完毕后能够正确地返回到原来的程序状态。每个异常模式都有对应的 SPSR。
  • APSR(Application Program Status Register):应用程序状态寄存器,用于存储特定于应用程序的状态信息。在 ARMv7-M 架构中,APSR 包含了条件码和标志位。

arm core寄存器

二、CPSR

The Current Program Status Register (CPSR),当前程序状态寄存器,寄存器格式如下:
CPSR寄存器
存储了以下处理器状态和控制信息:

  • APSR(N Z C V Q GE),存储特定于应用程序的状态信息,在下面 APSR 中详细介绍;
  • 程序指令集信息,bit24 J 和 bit5 T 的不同组合,区分 ARM\Thumb\Jazelle\ThumbEE 不同的指令集;
  • IT 保存了 Thumb 的 IT 指令的 If-Then 执行状态;
  • E 保存了大小端信息;
  • M 保存了 ARM 的处理器模式(usr\fiq\irq\svc\mon\abt\hyp\und\sys);
  • A I F (Abort\IRQ\FIQ)是中断和异常的使能 bit 位;

2.1 CPSR_cxsf

为了防止在某些操作 CPSR 寄存器的场景中,误操作其它 bit 位,CPSR(PSRs,其它状态寄存器也都具备这个功能)有 c x s f 几个不同的字段指代不同的 bit 位。

  • c:control 字段,PSR[7:0] bit 位;
  • x:extension 字段,PSR[15:8] bit 位;
  • s:status 字段,PSR[23:16] bit 位;
  • f:flag 字段,PSR[31:24] bit 位;

cxsf 字段可以任意单个或多个组合,例如 CPSR_c 指代只操作 CPSR 的低 8bit 位、CPSR_xs 指代只操作 CPSR 的[23:8] bit 位。

三、SPSR

The Saved Program Status Registers (SPSRs),程序状态保存寄存器,每个异常模式都有对应的 SPSR,是各个异常模式下 CPSR 的拷贝。

  • 当进入某个异常,CPSR 会被拷贝到这个异常状态下的 SPSR 中;
  • 当异常处理完成后,为了恢复导致回去的程序状态,将 SPSR restore 到 CPSR;

总的来说,CPSR 用于存储当前程序的状态,而 SPSR 则用于保存异常处理程序执行前的状态,以确保异常处理程序执行完毕后能够正确地返回到原来的程序状态。SPSR 在异常处理过程中起到了保护和恢复程序状态的作用。

四、APSR

The Application Program Status Register (APSR),在 ARMv7-A,是 application level view 下的 CPSR,包含以下 bit 位:
APSR寄存器

  • N(Negative):该位表示最近一条指令的运算结果是否为负数。当运算结果为负数时,N 位被设置为 1;否则,N 位被清零。
  • Z(Zero):该位表示最近一条指令的运算结果是否为零。当运算结果为零时,Z 位被设置为 1;否则,Z 位被清零。
  • C(Carry):该位用于处理无符号数运算中的进位。当运算产生了进位时,C 位被设置为 1;否则,C 位被清零。
  • V(Overflow):该位用于处理带符号数运算中的溢出。当运算结果超出了有符号数的表示范围时,V 位被设置为 1;否则,V 位被清零。
  • Q(Sticky Overflow):该位用于处理 SIMD(Single Instruction, Multiple Data)指令中的溢出情况。Q 位是一个粘性位,当 V 位被设置时,Q 位也会被设置,直到被显式清除。
  • GE( The Greater than or Equal flags):意为大于等于,用于控制条件分支指令的执行。
### 时间片轮转调度机制在裸机环境下的架构设计 在裸机环境中实现时间片轮转调度器涉及到硬件定时器配置、任务管理以及上下文切换等核心组件的设计[^1]。 #### 定时器中断设置 为了支持时间片的概念,必须先初始化一个周期性的硬件计数器/定时器来触发定期的中断事件。每当发生这样的中断时即意味着当前运行的任务已经消耗完了分配给它的时间配额,此时应保存其执行状态并准备加载下一个待处理进程的数据结构以便继续执行[^2]。 #### 任务控制块(TCB) 每个可被调度实体都需要关联到一个称为Task Control Block (TCB) 的数据结构上。该对象通常包含但不限于如下字段: - **寄存器快照**:用于存储CPU通用目的寄存器的状态,在进行上下文切换操作期间会被用来恢复之前暂停的地方。 - **堆栈指针**:指向对应线程私有的内存区域顶部地址;当函数调用返回或异常情况发生时需要用到此信息重新定位局部变量位置。 - **优先级级别**:虽然严格意义上讲RR算法不考虑权重差异但是实际应用中往往还是会给不同类型的作业赋予不同的重要程度标记从而允许更灵活地调整它们之间的相对顺序关系。 - **等待队列链接**:如果某个特定条件未满足则可能暂时挂起直到信号量释放或其他同步原语通知为止因此需要记录下这些依赖关系方便后续唤醒动作的发生。 ```c typedef struct TCB { uint32_t *stack_ptr; int priority; struct list_head task_list; /* 双向链表节点 */ } tcb_t; ``` #### 上下文切换逻辑 编写汇编语言子程序完成从旧过程至新目标间的转换工作主要包括两大部分——现场保护与重建。前者负责把即将离开前台活动范围内的所有必要参数压入指定缓冲区之中而后者则是相反的过程即将要进入活跃期的那个实例的相关属性取出填充回相应的位置上去最终达到无缝衔接的效果使得多道并发成为现实可行的技术方案之一[^3]。 ```assembly context_switch: push {r0-r12, lr} mrs r0, cpsr @ 获取CPSR寄存器值 push {r0} ldr r0, [sp], #8 @ 加载旧task的SPSR和LR msr spsr_cxsf, r0 @ 设置新的模式和服务位 pop {pc} @ 返回到新task new_task_entry_point: ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值