知识点1 " Z: a+ G4 } B; ?. { /*< STM32G0xx uses 2 Bits for the Priority Levels */ # [. c3 F2 {/ ]% |- B #define __NVIC_PRIO_BITS 2 9 m0 V1 q# R+ W9 {+ A + x% b: N! K) D1 f: O 所以M0+的中断优先级:0、1、2、3% M" Z+ T( W! [7 G. v: k 0 X! l4 g, H1 {1 a4 N 知识点2 在Cortex-M0 上,FreeRTOS内核的临界区屏蔽了所有中断(除了NMI、HardFault、复位)。 知识点3 9 O0 D) {+ ^: G3 t5 r& D7 D FreeRTOS 任务优先级从0开始,作为最低的紧急 RTOS 任务优先级,而M0+ NVIC 使用0作为最高的紧急中断优先级。- r; Y1 ]* P$ }+ Y 9 i: n+ P q. v" }. W+ G 但是任务优先级和中断优先级没有关联' M# S. p% C+ {4 D$ t ; \# O! V. _/ _% p0 X7 P! {( ~4 N 知识点4 FreeRTOS 内核使用 2-3 个中断,具体取决于内核:SysTick用作时基,PendSV用于上下文切换,以及Cortex-M3/4/7 上的SVCall用于启动调度程序。 SysTick 和 PendSV 配置为最低紧急程度:RTOS 以最低紧急程度运行。% {; t% q. u5 B# [0 s# K3 n ' Y+ B6 P: n! K$ W. X# S' d% J) M" E 知识点5 0 `& I7 O( g8 w1 l* k# [& ~ 中断服务代码里必须使用中断安全的FromISR()变体 - m; {# F0 } X1 H+ m$ I# v " u! ~, y/ G3 ]/ j, J$ t |