中断管理

Pursue

PendSV 和 SysTick 中断优先级配置

PendSV 中断优先级配置

PendSV 主要用于任务切换,因此在 µC/OS-III 内核开始进行多任务处理前,也就是在 µC/OS-III 内核启动之前,就需要配置好 PendSV。在 µC/OS-III 中,将 PendSV 的中断优先级配置为 0xFF,也就是最低优先级。

1
2
3
4
5
6
7
8
9
; 关中断
CPSID I
; 配置 PendSV 为最低中断优先级
MOV32 R0, NVIC_SYSPRI14
MOV32 R1, NVIC_PENDSV_PRI
STRB R1, [R0]
; 其中 NVIC_SYSPRI14 和 NVIC_PENDSV_PRI 的定义如下所示:
NVIC_SYSPRI14 EQU 0xE000ED22
NVIC_PENDSV_PRI EQU 0xFF

SysTick 中断优先级配置

SysTick 主要用于为 µC/OS-III 内核提供时钟节拍,在调用函数 OSStart()后,需要调用函数OS_CPU_SysTickInit()对 SysTick 进行配置, 因此在通过函数OS_CPU_SysTickInit()配置后的 SysTick 的中断优先级就为4。

1
2
3
#if 1
#define CPU_CFG_NVIC_PRIO_BITS 4u
#endif

临界区

注意:

  1. 成对使用
  2. 不支持嵌套
  3. 尽量保持临界区耗时短
1
2
3
4
CPU_SR_ALLOC();       /* 必须定义在所有局部变量之后 */
CPU_CRITICAL_ENTER(); /* 进入临界区 */
/* 临界区代码 */
CPU_CRITICAL_EXIT(); /* 退出临界区 */

需要注意的是,CPU_SR_ALLOC()必须在所有局部变量定义后再定义。

任务调度锁

注意:

  1. 成对使用,支持嵌套
  2. 只是关闭任务调度器,不影响中断
1
2
3
4
OS_ERR err;
OSSchedLock(&err); /* 调度器上锁 */
/* 代码 */
OSSchedUnlock(&err); /* 调度器解锁 */
评论