源码下载链接: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
}
}
串口运行结果: