1. 临界区的保护实际应用中可能需要的场合:
调用公共函数的代码(不可重入函数)
读取或者修改变量(全局变量)
使用硬件资源(MCU的ram、flash、uart、spi、adc等)
对时序有精准要求的操作(I2C通讯)
某些用户不想被打断的代码(比如 printf 打印),串口接收的状态、接收中断重新开启等操作
2. 临界区保护方法:
在实时操作系统(RTOS)中操作I2C通常涉及到多任务/中断环境,因此需要确保I2C的使用是线程安全的。关闭中断和使用互斥量是两种常见的方法来确保线程安全。RT-Thread中提供了多种保护临界区的方法,具体分为以下几类
(1) 禁用系统调度器 ,中断可以响应
rt_enter_critical(); //将线程调度器上锁,此时线程调度器仅能响应中断
/* 以下进入临界区 */
. . . .
/*临界区执行完成*/
rt_exit_critical(); //调度器解锁
(2)禁用中断
关闭中断通常用于确保在执行I2C传输时不会被其他中断打断。但是,这种方法应谨慎使用,因为它会影响系统的实时性。
rt_base_t level; //创建变量以使用中断关闭和中断开启函数
level = rt_hw_interrupt_disable(); //中断关闭函数
/* 以下是临界区*/
. . . .
rt_hw_interrupt_enable(level); 中断开启函数