OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4337|回复: 7

信号量的请求与删除

[复制链接]

34

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2013-11-21
在线时间
19 小时
发表于 2014-11-9 00:00:41 | 显示全部楼层 |阅读模式
5金钱

在请求并且获得信号量后执行 信号量删除,那么当我再次请求信号量的时候,还会成功吗?

其他任务 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;吗?

最佳答案

查看完整内容[请看2#楼]

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->OSEven ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-11-9
在线时间
0 小时
发表于 2014-11-9 00:00:42 | 显示全部楼层
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;的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165225
金钱
165225
注册时间
2010-12-1
在线时间
2107 小时
发表于 2014-11-9 00:17:19 | 显示全部楼层
自己测试下就知道了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-11-9 10:07:30 | 显示全部楼层
正确使用OSSemDel(),那么OSSemPend()会返回失败。
从举例的代码看,你没有。
详见OSSemDel()函数说明。
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-11-9 10:09:26 | 显示全部楼层
补充:上面是以uC/OS-II出发的,如果是其他版本不一定成立。
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

34

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2013-11-21
在线时间
19 小时
 楼主| 发表于 2014-11-9 16:48:59 | 显示全部楼层
我第一次使用OSSemDel后再执行OSSemPend是返回失败通不过的,但是第二次又通过了,很奇怪
回复

使用道具 举报

34

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2013-11-21
在线时间
19 小时
 楼主| 发表于 2014-11-9 17:19:58 | 显示全部楼层
回复【6楼】whatucos:
---------------------------------
我刚才去看了一下OSSemPend的代码,搞明白了,太谢谢了!
回复

使用道具 举报

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2014-10-28
在线时间
0 小时
发表于 2014-11-10 09:06:20 | 显示全部楼层

删除信号量,对应的事件控制块就释放了,不能再使用

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 12:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表