UCOSIII实时操作系统(十一)---信号量和互斥信号量(上)

源码下载链接:https://taileliekaishi.lanzoui.com/ikUZPg6guve

什么是信号量:例如 铁路系统中的一条铁轨供多个火车使用,则需要一种装置来提供互制机制,即一次只能有一辆车来使用这个铁轨,这个装置可以采用关闭闸门等方式来阻止其他火车使用此铁轨,例如这种机制就是信号量机制。

可以将信号量理解为是一个变量A(这个变量可以计数),任务B和任务C都可使用信号量A,当任务B想使用信号量的时候先请求信号量(判断A是不是为0,不为0则可以使用),使用完之后再释放信号量(信号量+1),这样就可以让别的任务也可以使用信号量。

定义信号量:

// 定义之后还不能使用,还需要创建一个信号量
OS_SEM	MY_SEM;		//定义一个信号量,用于访问共享资源

创建信号量:

	//创建一个信号量
	OSSemCreate ((OS_SEM*	)&MY_SEM,
                 (CPU_CHAR*	)"MY_SEM",
                 (OS_SEM_CTR)1, //初始值为1	
                 (OS_ERR*	)&err);

任务使用信号量:

void task1_task(void *p_arg)
{
	OS_ERR err;
	u8 task1_str[]="First task Running!";
	while(1)
	{
		printf("\r\n任务1:\r\n");
		LCD_Fill(0,110,239,319,CYAN);
		OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); 	//请求信号量
		memcpy(share_resource,task1_str,sizeof(task1_str)); //向共享资源区拷贝数据
		delay_ms(300);
		printf("%s\r\n",share_resource);	//串口输出共享资源区数据	
		OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);				//发送信号量
		LED0 = ~LED0;
		OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
	}
}

//任务2的任务函数
void task2_task(void *p_arg)
{	
	OS_ERR err;
	u8 task2_str[]="Second task Running!";
	while(1)
	{
		printf("\r\n任务2:\r\n");
		LCD_Fill(0,110,239,319,BROWN);
		OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); 	//请求信号量
		memcpy(share_resource,task2_str,sizeof(task2_str));	//向共享资源区拷贝数据
		delay_ms(300);
		printf("%s\r\n",share_resource);	//串口输出共享资源区数据		
		OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);				//发送信号量
		LED1 = ~LED1;
		OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
	}
}

串口运行结果:

猜你喜欢

转载自blog.csdn.net/weixin_39903708/article/details/108294861