1. 什么是中断
中断:CPU暂停当前正在执行的程序,转去处理更紧急的事件(中断服务程序 ISR),处理完成后再返回原程序继续执行。 基本流程:中断请求 → CPU响应中断 → 执行中断服务函数 → 退出中断返回原程序
2. 中断优先级与分组(Cortex-M / STM32)
(1) Cortex-M优先级寄存器
Cortex-M中断优先级寄存器为 8bit,但 STM32只实现高4位[7:4],因此最多 16级优先级 (0~15)。 数值规则:数值越小优先级越高。
(2) 抢占优先级 + 子优先级
STM32中断优先级由两部分组成:
抢占优先级
- 决定是否能打断正在执行的中断
- 高抢占优先级可以打断低抢占优先级中断
子优先级
- 当两个中断抢占优先级相同时
- 子优先级小的先执行
- 不能打断正在执行的中断
(3) NVIC优先级分组
优先级的4bit在抢占和子优先级之间分配。
| 分组 | 抢占优先级 | 子优先级 |
|---|---|---|
| NVIC_PriorityGroup_0 | 0位 | 4位 |
| NVIC_PriorityGroup_1 | 1位 | 3位 |
| NVIC_PriorityGroup_2 | 2位 | 2位 |
| NVIC_PriorityGroup_3 | 3位 | 1位 |
| NVIC_PriorityGroup_4 | 4位 | 0位 |
UCOS-III推荐:
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);即 全部作为抢占优先级,方便OS管理。
其中HAL_Init()里面就已经默认配置了NVIC_PRIORITYGROUP_4无需再配置了。
(4) UCOS-III中断优先级管理范围
通过:CPU_CFG_KA_IPL_BOUNDARY
设置OS管理的中断优先级范围。 例如设置为 4:
OS管理中断优先级范围 = 4 ~ 15含义:
- 0~3:OS不管理(高优先级中断)
- 4~15:OS管理
如果 ISR中调用UCOS API,该中断必须在 OS管理范围内。
3. 中断相关寄存器
(1) 系统中断优先级寄存器
Cortex-M有三个系统优先级寄存器:
SHPR1SHPR2SHPR3地址:
SHPR1 : 0xE000ED18SHPR2 : 0xE000ED1CSHPR3 : 0xE000ED20用于配置:
- MemManage
- BusFault
- UsageFault
- SVCall
- PendSV
- SysTick
PendSV:最低优先级
作用:任务切换 原因:保证系统任务切换不会打断其他中断。
SysTick:OS管理中最高优先级
作用:系统时钟节拍,保证时基精度。
systick中断会调用OSTimeTick(),来确保时间。
比如A任务延迟100,B任务延迟100,OSTimeTick维持一个计数器,每次都—,最后A,B同时处于就绪态。
void SysTick_Handler(void){ HAL_IncTick(); OS_CPU_SysTickHandler();}
void OS_CPU_SysTickHandler (void){ CPU_SR_ALLOC(); CPU_CRITICAL_ENTER(); OSIntEnter(); /* Tell uC/OS-III that we are starting an ISR */ CPU_CRITICAL_EXIT(); OSTimeTick(); /* Call uC/OS-III's OSTimeTick()*/ OSIntExit();/* Tell uC/OS-III that we are leaving the ISR */}
/*配置SysTick时间*/void BSP_SysTick_Init(void){ SysTick_Config(SystemCoreClock / 1000);}4. 中断屏蔽寄存器
Cortex-M有3个中断屏蔽寄存器:
| 寄存器 | 作用 |
|---|---|
| PRIMASK | 屏蔽所有可屏蔽中断 |
| FAULTMASK | 只允许NMI |
| BASEPRI | 屏蔽低于某优先级的中断 |
(1) BASEPRI(UCOS核心)
[!CAUTION]
但是BASEPRI 只屏蔽抢占优先级,不能正确屏蔽子优先级,故所有优先级必须是抢占优先级,建议
NVIC_PriorityGroup_4
作用:屏蔽优先级低于某阈值的中断
示例:BASEPRI = 0x40,高4位有效,即优先级415被屏蔽 ,优先级03仍可响应
UCOS-III用它来实现:进入临界区,退出临界区
(2) PRIMASK
PRIMASK为 32bit寄存器,但只有bit0有效
| 值 | 含义 |
|---|---|
| 0 | 允许中断 |
| 1 | 屏蔽所有中断 |
汇编指令:
开启中断:
CPSIE I关闭中断:
CPSID I5. UCOS-III中断设计核心逻辑
核心思想:
1️⃣ PendSV最低优先级 → 专门用于任务切换 2️⃣ SysTick高优先级 → 保证系统tick精度 3️⃣ BASEPRI实现临界区 → 屏蔽OS管理的中断 4️⃣ 高优先级中断(0~3) → OS不管理,可用于极实时任务 5️⃣ ISR调用OS API必须在OS管理范围
UCOSIII 专栏
第 4 篇 / 共 4 篇
上一篇
UCOSIII 专栏 03:常用 API 速记