完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在请求并且获得信号量后执行 信号量删除,那么当我再次请求信号量的时候,还会成功吗?
其他任务 OSSemPost(LED1_SEM); 然后新任务执行 OSSemPend(LED1_SEM,0,&err); GPIOA->ODR ^= GPIO_Pin_8; OSSemDel(LED1_SEM,OS_DEL_ALWAYS,&err); 删除信号量后 再次进入任务时 OSSemPend(LED1_SEM,0,&err); 还能执行到 GPIOA->ODR ^= GPIO_Pin_8;吗? |
|
相关推荐
7个回答
|
|
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出发的,如果是其他版本不一定成立。
|
|
|
|
我第一次使用OSSemDel后再执行OSSemPend是返回失败通不过的,但是第二次又通过了,很奇怪
|
|
|
|
我刚才去看了一下OSSemPend的代码,搞明白了,太谢谢了!
|
|
|
|
删除信号量,对应的事件控制块就释放了,不能再使用
|
|
|
|
只有小组成员才能发言,加入小组>>
663 浏览 0 评论
1083 浏览 1 评论
2456 浏览 5 评论
2784 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2619 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
640浏览 9评论
637浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
767浏览 6评论
611浏览 5评论
652浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 16:51 , Processed in 0.918993 second(s), Total 59, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号