1、临界区和临界资源概念
临界区是用于保护线程之间调用互斥的机制,主要是为了保护线程内的资源不会被其他线程抢占。
临界资源时临界区内的代码。
2、实现临界资源的几种方式
调度器锁、中断、信号量、互斥量
- 调度器锁
主要是控制调度器的运行状态,进入临界区后则其他线程不能访问,但是会被中断打断,需要考虑使用后是否会被其他中断所影响。
void rt_enter_critical(void); /* 进入临界区*/
void rt_exit_critical(void); /* 退出临界区*/ - 中断
线程主要是基于中断调度,但是可能会影响当前需要中断而运行其他任务。rt-thread的中断API接口由RSP实现,根据平台的不同实现方式也大不相同。为了保证一行代码的互斥运行,最快的速度是中断。可以说中断锁是最强大的和最高效的同步方法。只是使用中断锁最主要的问 题在于,在中断关闭期间系统将不再响应任何中断,也就不能响应外部的事件。所以中断锁 对系统的实时性影响非常巨大。
rt_base_t rt_hw_interrupt_disable(void);/关闭中断/
void rt_hw_interrupt_enable(rt_base_t level);/恢复中断/
下面是我基于HDSCF460MCU移植RT-Thread代码写的使用调度器锁示例程序
#define LED0 82
#define THREAD_PRIORITY 25
#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE 20
static rt_thread_t tid1 = RT_NULL;
static rt_thread_t tid2 = RT_NULL;
static void entry_critical1()
{
int i;
while(1)
{
rt_enter_critical();
for(i = 0;i < 10;i++){
rt_pin_write(LED0,1);
rt_kprintf("LED0 HIGH!\r\n");
rt_thread_mdelay(100);
rt_pin_write(LED0,0);
rt_kprintf("LED0 LOW!\r\n");
rt_thread_mdelay(100);
}
rt_exit_critical();
}
}
static void entry_critical2()
{
int i;
while(1)
{
for(i = 0;i < 10;i++){
rt_pin_write(LED0,1);
rt_thread_mdelay(400);
rt_pin_write(LED0,0);
rt_thread_mdelay(400);
}
}
}
int main(void)
{
rt_pin_mode(LED0, PIN_MODE_OUTPUT);
dma_check_task_init();
user_uart_init(USER_UART_2);
user_node_init();
tid1 = rt_thread_create("t1",entry_critical1, RT_NULL,THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
if (tid1 != RT_NULL)
rt_thread_startup(tid1);
else
return -1;
tid2 = rt_thread_create("t2",entry_critical2,RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY,THREAD_TIMESLICE-2);
if(tid1 != RT_NULL)
rt_thread_startup(tid2);
else
return -1;
return 0;
}