OpenEdv-开源电子网

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

信号量和互斥信号量。

[复制链接]

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
发表于 2018-4-1 16:20:29 | 显示全部楼层 |阅读模式
1金钱
在UCOSIII中,信号量如果要PEND的话,那这个信号量的cnt必须大于等于1才可以(需要在创建的时候设置第三个参数cnt为1或者,先POST一下才可以)。这个理解对吗?
互斥信号量,在使用的时候没有cnt这个参数。但是在使用的时候可以直接PEND,并且可以嵌套250层。然后需要POST释放相同的次数。
这个过程中,嵌套只能在一个任务中。别的任务需要请求共享资源时,必须要等正在使用共享资源的任务释放才可以。  不知道以上理解对不对,路过的大侠指导一下。谢谢!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-4-2 01:43:54 | 显示全部楼层
回复

使用道具 举报

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
 楼主| 发表于 2018-4-2 11:49:33 | 显示全部楼层
自己顶一下!!!
回复

使用道具 举报

7

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
487
金钱
487
注册时间
2017-12-25
在线时间
105 小时
发表于 2018-4-2 15:14:21 | 显示全部楼层
OSSemCreate ()的第三个参数cnt表示的是资源数目。比如说,如果cnt=2,那么同一时刻可以有两个任务获得这个资源。
互斥信号量嵌套250层?这个我不太明白...
回复

使用道具 举报

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
 楼主| 发表于 2018-4-2 15:38:20 | 显示全部楼层
Lyanzh 发表于 2018-4-2 15:14
OSSemCreate ()的第三个参数cnt表示的是资源数目。比如说,如果cnt=2,那么同一时刻可以有两个任务获得这个 ...

你理解的不对。不会有两个任务同时获得一个资源。
回复

使用道具 举报

7

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
487
金钱
487
注册时间
2017-12-25
在线时间
105 小时
发表于 2018-4-2 15:54:43 | 显示全部楼层
jinfeihan57 发表于 2018-4-2 15:38
你理解的不对。不会有两个任务同时获得一个资源。

我有个疑问,如果不会有两个任务同时获得一个资源,那么多值信号量设计的目的是?
回复

使用道具 举报

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
 楼主| 发表于 2018-4-2 17:48:29 | 显示全部楼层
Lyanzh 发表于 2018-4-2 15:54
我有个疑问,如果不会有两个任务同时获得一个资源,那么多值信号量设计的目的是?

这个目的是让每次的POST都被记录到,然后你就可以做相同次数的PEND。但是每次只有优先级最高的任务PEND到。
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2018-4-2 20:33:06 | 显示全部楼层
Lyanzh 发表于 2018-4-2 15:14
OSSemCreate ()的第三个参数cnt表示的是资源数目。比如说,如果cnt=2,那么同一时刻可以有两个任务获得这个 ...

两个任务不可能完全同时跑的,即便是时间片轮转调度。应该是信号量的计数值是2,能被PEND两次,在OSSemPend()的时候,如果信号量的计数值>0,那肯定会获得信号量。
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2018-4-2 20:40:03 | 显示全部楼层
jinfeihan57 发表于 2018-4-2 15:38
你理解的不对。不会有两个任务同时获得一个资源。

楼主, 你的第一个问题:OSSemCreate()的第三个形参cnt可以为0,你可以去试,原子的例子就是创建一个计数值为0的信号量,这就会让你第一次OSSemPend()因为等不到信号量而挂起来。互斥信号量就是确认信号量的值只能为1或则0,它的作用是来防止优先级反转的,因为只有一个任务能占用互斥信号量,那肯定只能它释放才能让别的等待该互斥信号量的任务进入就就绪态。
回复

使用道具 举报

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
 楼主| 发表于 2018-4-3 08:27:50 | 显示全部楼层
1547674987 发表于 2018-4-2 20:40
楼主, 你的第一个问题:OSSemCreate()的第三个形参cnt可以为0,你可以去试,原子的例子就是创建一个计 ...

先说sem,初始化为0,是用来任务同步的,初始化不为零是用来共享资源保护的(几乎不用这个功能)。然后互斥信号量用做资源共享保护在信号量请求的时候,不管同时有多少个请求,不管CNT等于几(大于1)。cnt都只减1.但是可以选择把信号量POST给优先级最高的等待任务还是所有的等待任务。请求到的信号量会进入就绪态,但是只有最高优先级的任务被执行。
回复

使用道具 举报

7

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
487
金钱
487
注册时间
2017-12-25
在线时间
105 小时
发表于 2018-4-3 10:04:02 | 显示全部楼层
1547674987 发表于 2018-4-2 20:33
两个任务不可能完全同时跑的,即便是时间片轮转调度。应该是信号量的计数值是2,能被PEND两次,在OSSemPe ...

对的,你说的很严谨。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 08:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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