RT-Thread临界区和临界资源

1、临界区和临界资源概念

临界区是用于保护线程之间调用互斥的机制,主要是为了保护线程内的资源不会被其他线程抢占。
临界资源时临界区内的代码。

2、实现临界资源的几种方式

调度器锁、中断、信号量、互斥量

  1. 调度器锁
    主要是控制调度器的运行状态,进入临界区后则其他线程不能访问,但是会被中断打断,需要考虑使用后是否会被其他中断所影响。
    void rt_enter_critical(void); /* 进入临界区*/
    void rt_exit_critical(void); /* 退出临界区*/
  2. 中断
    线程主要是基于中断调度,但是可能会影响当前需要中断而运行其他任务。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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42560250/article/details/105571650