我初学UC/OSII 练习使用信号量。看不懂下面的程序怎么实现每隔2S亮或者灭的。
我的理解是这样的,不知道对不对; taskLed 首先发送信号量,然后进入
OSTimeDly 接着任务调度,执行
task1,因为已经发送了信号量,所以
信号量计数器(.OSEventCnt =1;所以在执行完第一个“OSSemPend (AckSem, 0, &err);”OSEventCnt =0,并点亮LED,第二个OSSemPend (AckSem, 0, &err)只能继续等。好像是在OSSemPend (AckSem, 0, &err)进行任务 调度又回到 taskLed 。 理解的很浅。请大家给解释解释。不胜感激。 /********************************************************************************************************* ** Function name: taskLed 优先级为2 ** Descriptions: 每隔2S发送一次信号量 ** input parameters: *pdata ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/
static void taskLed (void *parg) { (void)parg;
while (1) { OSSemPost (AckSem); OSTimeDly(OS_TICKS_PER_SEC*2); } } /********************************************************************************************************* ** Function name: task1 优先级为3 ** Descriptions: 接收信号量并控制LED的亮灭 ** input parameters: *pdata ** output parameters: 无 ** Returned value: 无 *********************************************************************************************************/ static void task1 (void *pdata) { INT8U err; pdata = pdata; while (1) { OSSemPend (AckSem, 0, &err); //等待信号量 ledOn(1); // 点亮LED1 OSSemPend (AckSem, 0, &err); ledOff(1); // 关闭LED1 } }
|