微处理器原理与应用篇---常见基础知识(7)
微程序处理器中指令的执行过程:
一、微程序处理器的核心概念
微程序处理器通过微程序控制单元(Microprogrammed Control Unit) 实现指令执行,其本质是将传统硬布线逻辑控制的电路操作转化为存储在控制存储器(Control Memory, CM) 中的微指令(Microinstruction)序列。每条机器指令(如 ADD、JMP)对应一段微程序(微指令集合),执行过程即按序读取并执行微指令的过程。
二、指令执行的完整流程(以加法指令为例)
1. 取机器指令阶段(Fetch)
- PC 工作:程序计数器(PC)指向当前指令的内存地址,CPU 从内存读取机器指令(如
ADD R1, R2
),存入指令寄存器(IR)。 - PC 更新:PC 自动递增,指向下一条机器指令的地址(顺序执行时)。
2. 指令译码与微程序寻址
- 操作码解析:IR 中的机器指令操作码(如
ADD
的操作码)被送入微地址形成部件,该部件根据操作码查找微程序入口表,生成对应微程序的起始地址(如ADD
指令对应的微程序入口地址为μPC0
)。 - 微程序计数器初始化:微程序计数器(μPC)被置为该起始地址,指向控制存储器中第一条微指令。
3. 微指令执行阶段(Microinstruction Execution)
微指令存储在控制存储器中,每条微指令包含两部分:
- 微操作字段:指定具体硬件操作(如 “打开 ALU 加法器”“从 R2 读取数据”)。
- 下址字段:指定下一条微指令的地址(顺序执行或跳转)。
以ADD R1, R2
为例,微指令执行流程如下:
- 取操作数微指令:
- 微操作:控制数据总线从寄存器 R2 读取数据,存入暂存器 T1。
- 下址:指向 “取 R1 数据” 的微指令地址
μPC1
。
- 执行加法微指令:
- 微操作:控制 ALU 对暂存器 T1 和寄存器 R1 的数据执行加法运算,结果存入暂存器 T2。
- 下址:指向 “存储结果” 的微指令地址
μPC2
。
- 存储结果微指令:
- 微操作:将 T2 中的结果写回寄存器 R1。
- 下址:指向 “微程序结束” 的地址(如
μPC_end
)。
4. 微程序下址生成与循环控制
- 顺序执行:若微指令下址字段为
μPC+1
,则 μPC 自动递增,指向下一条微指令(如上述μPC0→μPC1→μPC2
)。 - 条件跳转:若微指令涉及条件判断(如运算结果为 0 则跳转),微地址形成部件根据状态标志(如 ZF 零标志)修改 μPC 值。例如,加法结果为 0 时,微程序跳转到特定处理流程。
5. 微程序结束与下一条机器指令准备
- 当微程序执行到最后一条微指令(如
μPC_end
),其下址字段通常指向 “取指微程序” 的入口地址,触发新一轮机器指令的取指流程。 - 至此,一条机器指令(如
ADD
)的执行完成,CPU 回到取指阶段,继续处理下一条机器指令。
三、微程序处理器的关键组件协作
组件 | 作用 |
---|---|
控制存储器(CM) | 存储微程序(微指令序列),通常为 ROM,掉电不丢失。 |
微程序计数器(μPC) | 指向当前待执行的微指令地址,功能类似普通 PC,但控制微指令的执行顺序。 |
微指令寄存器(μIR) | 存储当前微指令,解析微操作字段和下址字段。 |
微地址形成部件 | 根据机器指令操作码、状态标志等生成微指令地址,实现微程序的寻址和跳转。 |
微操作控制逻辑 | 根据 μIR 中的微操作字段,生成具体的硬件控制信号(如寄存器读写、ALU 运算选择)。 |
四、微程序执行与机器指令的关系
- 一对多映射:一条机器指令对应一段微程序(多条微指令),例如
ADD
指令可能需要 3~5 条微指令完成取数、运算、存结果。 - 时间特性:微程序执行速度受限于控制存储器的访问速度(通常比主存快,但比硬布线逻辑慢),因此微程序处理器的性能取决于微指令的执行效率。
五、微程序处理器的优势与应用
- 灵活性:通过修改微程序可轻松扩展指令集(如添加新指令),无需修改硬件电路,适用于复杂指令集架构(CISC),如 x86 处理器。
- 调试与维护:微程序可像软件一样调试,便于处理器功能迭代,早期大型计算机(如 IBM 360)和部分嵌入式微控制器(如某些 DSP)采用该架构。
总结
微程序处理器中指令的执行本质是 “机器指令→微程序→微指令” 的映射过程:先通过 PC 取机器指令,再根据操作码找到对应微程序的入口,由 μPC 控制微指令按序执行,每条微指令驱动硬件完成具体操作,最终实现机器指令的功能。这种 “以软控硬” 的方式平衡了硬件复杂度和指令集灵活性,是计算机控制单元设计的重要思想。
STM32中断优先级的两个属性:
一、中断优先级的基本概念
STM32 微控制器通过嵌套向量中断控制器(NVIC) 管理中断,每个中断向量(如定时器中断、串口中断)有两个与优先级相关的属性:
- 抢占优先级(Preemption Priority)
- 子优先级(Subpriority,又称响应优先级或次优先级)
这两个属性共同决定了中断的响应顺序和嵌套规则,具体由优先级分组机制配置。
二、两个优先级属性的具体含义
1. 抢占优先级(Preemption Priority)
- 核心作用:
决定中断是否可以嵌套。高抢占优先级的中断可以打断正在执行的低抢占优先级中断,形成中断嵌套。 - 数值特性:
- 数值越小,优先级越高。例如,抢占优先级 0 > 抢占优先级 1。
- 典型场景:
- 若中断 A(抢占优先级 0)正在执行,此时中断 B(抢占优先级 1)触发,B 不会打断 A;
- 若中断 C(抢占优先级 0)触发,C 会立即打断 A 的执行,待 C 处理完成后,A 继续执行。
2. 子优先级(Subpriority)
- 核心作用:
当多个中断的抢占优先级相同时,子优先级决定它们的响应顺序。子优先级高的中断先执行,但不能嵌套其他中断。 - 数值特性:
- 同样,数值越小,优先级越高。例如,子优先级 0 > 子优先级 1。
- 典型场景:
- 若中断 D 和 E 的抢占优先级均为 2,但 D 的子优先级为 0,E 的子优先级为 1,则 D 先于 E 执行;
- 若 D 正在执行,E 触发时需等待 D 处理完成,无法嵌套。
三、优先级分组机制
STM32 通过优先级分组(PRIGROUP) 动态分配抢占优先级和子优先级的位数,可通过 SCB->AIRCR 寄存器配置,支持 5 种分组方式:
分组方式 | 抢占优先级位数 | 子优先级位数 | 抢占优先级范围 | 子优先级范围 |
---|---|---|---|---|
Group0 | 0 位 | 4 位 | 无(固定为 0) | 0~15 |
Group1 | 1 位 | 3 位 | 0~1 | 0~7 |
Group2 | 2 位 | 2 位 | 0~3 | 0~3 |
Group3 | 3 位 | 1 位 | 0~7 | 0~1 |
Group4 | 4 位 | 0 位 | 0~15 | 无(固定为 0) |
示例:
- 若配置为Group2(2 位抢占 + 2 位子优先级):
- 抢占优先级可取 0~3,子优先级可取 0~3;
- 中断 F(抢占 2,子优先级 1)和中断 G(抢占 1,子优先级 3)同时触发时,G 先执行(抢占 1 > 抢占 2);
- 若中断 H(抢占 2,子优先级 0)和 F 同时触发,H 先执行(子优先级 0 > 子优先级 1)。
四、优先级配置步骤
- 设置优先级分组:
c
运行
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 配置为Group2
- 为每个中断设置优先级:
c
运行
NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; // 串口1中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // 子优先级2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
五、特殊情况处理
- 相同抢占和子优先级:
- 若多个中断的抢占和子优先级完全相同,它们的响应顺序由硬件固定编号(IRQn) 决定,编号越小优先级越高(如 USART1_IRQn < USART2_IRQn)。
- 系统异常优先级:
- 系统异常(如复位、NMI、HardFault)的优先级独立于用户配置,通常高于所有中断,且不可抢占。
总结
STM32 的中断优先级机制通过抢占优先级和子优先级的组合,实现了灵活的中断嵌套和响应控制:
- 抢占优先级决定中断嵌套能力,高抢占优先级可打断低抢占优先级;
- 子优先级在抢占优先级相同时决定执行顺序,且不能嵌套;
- 优先级分组则允许用户根据需求动态分配两者的位数,平衡灵活性与资源利用率。
合理配置这两个属性,可确保关键任务(如传感器数据采集、安全控制)优先处理,提升系统的实时性和可靠性。