|
OS_EVENT *DispSem;
在开始这两个任务之前 DispSem = OSSemCreate(1); //创建一个信号量
下面是这两个任务 (AppTask1 优先级3 ,AppTask2 优先级4)
static void AppTask1 (void *p_arg)
{
INT8U err;
(void)p_arg;
while(DEF_TRUE)
{
OSSemPend(DispSem, 0, & err); // 等待信号量
if(GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_8)) // 判断现在LED1是否是亮的
GPIO_ResetBits(GPIOD, GPIO_Pin_8); // 如果是 则熄灭LED1
else GPIO_SetBits(GPIOD, GPIO_Pin_8); // 否则 点亮LED1
OSTimeDly(150);
err = OSSemPost(DispSem); // 发送信号量
}
}
static void AppTask2 (void *p_arg)
{
INT8U err;
(void)p_arg;
while(DEF_TRUE)
{
OSSemPend(DispSem, 0, & err); // 等待信号量
if(GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_9)) // 判断现在LED2是否是亮的
GPIO_ResetBits(GPIOD, GPIO_Pin_9); // 如果是 则熄灭LED2
else GPIO_SetBits(GPIOD, GPIO_Pin_9); // 否则 点亮LED2
err = OSSemPost(DispSem); // 发送信号量
}
}
我的疑问是:当OSStart();后,由于AppTask1优先级高,先执行,在第一句OSSemPend(DispSem, 0, & err);中,AppTask1进入信号量的等待队列,转为等待态,然后会调用OS_Sched(),运行当前处于就绪态的最高优先级的任务,也就是AppTask2,然后AppTask2也会想AppTask1一样,执行OSSemPend(DispSem, 0, & err);,然后也OS_Sched(),并转为等待态,那么这个时候这两个任务不都进入等待态了吗,没有任务会执行OSSemPost(DispSem);,那程序怎么同步的?
我在开发板里实验,确实同步了,两个LED轮流闪烁。
大家能给解释一下这个同步过程吗?谢谢啦先 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|