uC/OS-II 2.52 OS_SEM.c的OSSemDel()中是这样处理你的请求的:
caseOS_DEL_ALWAYS:
while (pevent->OSEventGrp != 0x00) {
OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);
}
pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
pevent->OSEventPtr = OSEventFreeList; //信号量对应的指针=空余块链接表----------1
OSEventFreeList = pevent; //空余块链接表=当前事件指针----------------------------2
。。。
return ((OS_EVENT *)0);---------------------------------------------------------------3
看后面标注的三句代码知道:
1、信号量的事件控制块被回收
2、你声明的LED1_SEM被函数重新赋值成(OS_EVENT *)0了
3、删除信号量后 再次进入任务时 OSSemPend(LED1_SEM,0,&err);请求信号量,
这时,进入 OSSemPend(){
.........
#ifOS_ARG_CHK_EN > 0
if (pevent == (OS_EVENT *)0)
*err = OS_ERR_PEVENT_NULL; //pevent是空指针
return; //返回空,啥也没做,往下执行了
}
4、因为 return; 所以是可以往下执行GPIOA->ODR ^= GPIO_Pin_8;的
uC/OS-II 2.52 OS_SEM.c的OSSemDel()中是这样处理你的请求的:
caseOS_DEL_ALWAYS:
while (pevent->OSEventGrp != 0x00) {
OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);
}
pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
pevent->OSEventPtr = OSEventFreeList; //信号量对应的指针=空余块链接表----------1
OSEventFreeList = pevent; //空余块链接表=当前事件指针----------------------------2
。。。
return ((OS_EVENT *)0);---------------------------------------------------------------3
看后面标注的三句代码知道:
1、信号量的事件控制块被回收
2、你声明的LED1_SEM被函数重新赋值成(OS_EVENT *)0了
3、删除信号量后 再次进入任务时 OSSemPend(LED1_SEM,0,&err);请求信号量,
这时,进入 OSSemPend(){
.........
#ifOS_ARG_CHK_EN > 0
if (pevent == (OS_EVENT *)0)
*err = OS_ERR_PEVENT_NULL; //pevent是空指针
return; //返回空,啥也没做,往下执行了
}
4、因为 return; 所以是可以往下执行GPIOA->ODR ^= GPIO_Pin_8;的
举报