OpenEdv-开源电子网

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

信号量与信号量集的不同

[复制链接]

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-7-6
在线时间
0 小时
发表于 2015-7-13 21:41:14 | 显示全部楼层 |阅读模式
5金钱
原子哥的例程中,等待到信号量后执行任务,然后煤油清除信号量,而信号量集等待后,要把信号量集清零,请问这是必须的要做的吗?为什么信号量不要清零呢?

最佳答案

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

信号量在每次pend以后会自行减一,OSFlagPend()函数通过设置参数也可以让信号量集中不同的bit减一,UCOSII源码中对OSFlagPend()函数有如下图描述: 也就是说OSFlagPend()要想使用内部自减信号量值的话需要将函数的参数wait_type或上OS_FLAG_CONSUME,比如:OSFlagPend(flags_key,0X001F,OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME,0,&err),这样pend到信号量集的话就会将相应的bit消耗掉,也就是清零了,和信号量的处理过程一样。 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-7-13 21:41:15 | 显示全部楼层
信号量在每次pend以后会自行减一,OSFlagPend()函数通过设置参数也可以让信号量集中不同的bit减一,UCOSII源码中对OSFlagPend()函数有如下图描述:


也就是说OSFlagPend()要想使用内部自减信号量值的话需要将函数的参数wait_type或上OS_FLAG_CONSUME,比如:OSFlagPend(flags_key,0X001F,OS_FLAG_WAIT_SET_ANY|OS_FLAG_CONSUME,0,&err),这样pend到信号量集的话就会将相应的bit消耗掉,也就是清零了,和信号量的处理过程一样。你也可以直接对信号量的每一个bit发送一个0过去,这样信号量集对应的bit也会被清零,我们的例程就是用的这个方法,但是这个方法不能用于信号量,只能用于信号量集,不过不建议使用第二种方法,最好使用第一种方法。
开往春天的手扶拖拉机
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-7-6
在线时间
0 小时
 楼主| 发表于 2015-7-14 13:23:58 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
多谢多谢,这样一说就明白了。我还有一个问题,ucos里内存管理用到了另外的函数,而不是系统本身自带的,我看到下面这个宏貌似不对吧
//内存参数设定.
#define MEM_BLOCK_SIZE 32      //内存块大小为32字节
#define MEM_MAX_SIZE 35*1024   //最大管理内存 42K
#define MEM_ALLOC_TABLE_SIZE MEM_MAX_SIZE/MEM_BLOCK_SIZE          //内存表大小

怎么会出来个35*1024呢?
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-7-14 16:45:38 | 显示全部楼层
回复【3楼】卢平光同志:
---------------------------------
MEM_MAX_SIZE这个宏是自己可以修改的,35*1024就是35K的啊。这个是我们自己做的内存管理,我们是不用UCOS自带的内存管理的,UCOS自带的内存管理很垃圾的。
开往春天的手扶拖拉机
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-7-6
在线时间
0 小时
 楼主| 发表于 2015-7-15 16:37:10 | 显示全部楼层
回复【4楼】zuozhongkai:
---------------------------------
我的意思是每块大小为32字节,那总大小应该32*1024的吧
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-7-15 16:55:02 | 显示全部楼层
回复【5楼】卢平光同志:
---------------------------------
为什么每块大小为32字节,总大小就是32*1024?我们可没有写一共1024块的啊。一块32字节,一共35*1024字节,那么就有35*1024/32块。
开往春天的手扶拖拉机
回复

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-7-6
在线时间
0 小时
 楼主| 发表于 2015-7-15 17:13:36 | 显示全部楼层
回复【6楼】zuozhongkai:
---------------------------------
I see....
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-1 14:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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