UCOSIII 专栏 04:中断与临界区

结合 Cortex-M 和 STM32 的中断机制,梳理 UCOSIII 中断优先级、临界区和 ISR 相关处理方式。

周二 2月 24 2026
857 字 · 4 分钟

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_00位4位
NVIC_PriorityGroup_11位3位
NVIC_PriorityGroup_22位2位
NVIC_PriorityGroup_33位1位
NVIC_PriorityGroup_44位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有三个系统优先级寄存器:

SHPR1
SHPR2
SHPR3

地址:

SHPR1 : 0xE000ED18
SHPR2 : 0xE000ED1C
SHPR3 : 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 I

5. UCOS-III中断设计核心逻辑

核心思想:

1️⃣ PendSV最低优先级 → 专门用于任务切换 2️⃣ SysTick高优先级 → 保证系统tick精度 3️⃣ BASEPRI实现临界区 → 屏蔽OS管理的中断 4️⃣ 高优先级中断(0~3) → OS不管理,可用于极实时任务 5️⃣ ISR调用OS API必须在OS管理范围


Thanks for reading!

UCOSIII 专栏 04:中断与临界区

周二 2月 24 2026
857 字 · 4 分钟

UCOSIII 专栏

第 4 篇 / 共 4 篇