临界区保护
临界资源是指一次仅允许一个线程访问的共享资源。它可以是一个具体的硬件设备,也可以是一个变量、一个缓冲区。
不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它们进行访问。
每个线程中访问(操作)临界资源的那段代码称为临界区(Critical Section),我们每次只准许一个线程进入临界区
禁止调度:
禁止调度,即是把调度器锁住,不让其进行线程切换。这样就能保证当前运行的任务不被换出,直到调度器解锁,所以禁止调度是常用的临界区保护方法
void thread_entry(void* parameter)
{
while(1)
{
/* 调度器上锁,上锁后将不再切换到其他线程,仅响应中断 */
rt_enter_critical();
/* 以下进入临界区 */
. . . .
/* 调度器解锁 */
rt_exit_critical();
}
}
关闭中断
void thread_entry(void* parameter)
{
rt_base_t level;
while(1)
{
/* 关闭中断*/
level = rt_hw_interrupt_disable();
/* 以下是临界区*/
. . . .
/* 关闭中断*/
rt_hw_interrupt_enable(level);
}
}