目录
一、基本原理
临界区(临界段代码):必须完整运行,不能被打断的代码段。
临界区本质:屏蔽中断。
适用场合:
1、外设 需严格按照时序初始化的外设,如IIC、SPI等等
2、系统自身需求
3、用户需求
打断当前程序的运行:中断与任务调度
以下转载自官网:
原文链接:https://www.freertos.org/zh-cn-cmn-s/RTOS-Cortex-M3-M4.html
临界区
Cortex-M 硬件详情
RTOS 内核使用 ARM Cortex-M 核心的 BASEPRI 寄存器 来实现临界区。 因此,RTOS 内核能够仅屏蔽一部分中断, 从而提供灵活的中断嵌套模型。
BASEPRI 是一个位掩码。 为 BASEPRI 设置为一个值后,它可以屏蔽所有逻辑优先级等于 或低于该值的中断。 因此,无法使用 BASEPRI 来 屏蔽优先级为 0 的中断。
题外话: 可以从中断中安全调用的 FreeRTOS API 函数 使用 BASEPRI 来实现中断安全临界区。 进入临界区时, BASEPRI 的值设置为 configMAX_SYSCALL_interrupt_PRIORITY, 退出临界区时,设置为 0。 我们收到许多故障报告 认为 BASEPRI 应在退出临界区时返回到原始值,而不仅仅是设置为 0, 但是 Cortex-M NVIC 绝不会接受一个优先级低于当前正在执行的中断的优先级的中断, 不管 BASEPRI 设置为多少。 一个总是 将 BASEPRI 设置为 0 的实现执行代码的速度比一个 存储然后恢复 BASEPRI 值的实现更快 (编译器的优化器打开的情况下)。
使用 RTOS 内核时的相关性
RTOS 内核通过将 configMAX_SYSCALL_INTRUPT_PRIORITY 的值 写入 ARM Cortex-M BASEPRI 寄存器来创建临界区。