OpenEdv-开源电子网

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

关于FreeRTOS的Semaphore的使用

[复制链接]

26

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-8-1
在线时间
57 小时
发表于 2018-1-2 22:02:33 | 显示全部楼层 |阅读模式
1金钱
遇到一个这样的问题,  
osSemaphoreDef(myKeySem01);
myKeySem01Handle = osSemaphoreCreate(osSemaphore(myKeySem01), 1);
创建了一个二值信号量;
在某个中断里面释放osSemaphoreRelease(myKeySem01Handle);
创建一个任务:
  for(;;)
  {
     osSemaphoreWait(myKeySem01Handle,100);
     蜂鸣器鸣叫一声;
  }

然后遇到的问题是:中断没有进入时,蜂鸣器会叫;即使进入一次中断后,蜂鸣器鸣叫任务会一直执行;本来的目的是,来一次中断,蜂鸣器任务执行一次;是不是我哪里理解的不对,求各位大神解答一下

最佳答案

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

1.osSemaphoreRelease本身就可以在中断中调用。 2.要么用 CMSIS-RTOS v2的API,要么用freertos本身的API去创建。v2创建Semaphores的API是[mw_shl_code=c,true]osSemaphoreId_t osSemaphoreNew(uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr)[/mw_shl_code]第二个参数为0即可解决你的问题。 不过要用v2的API,你需要更新一些头文件。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2018-1-2 22:02:34 | 显示全部楼层
本帖最后由 Noctis 于 2018-1-2 23:01 编辑

1.osSemaphoreRelease本身就可以在中断中调用。

2.要么用 CMSIS-RTOS v2的API,要么用freertos本身的API去创建。v2创建Semaphores的API是[mw_shl_code=c,true]osSemaphoreId_t osSemaphoreNew(uint32_t max_count, uint32_t initial_count,
                               const osSemaphoreAttr_t *attr)[/mw_shl_code]第二个参数为0即可解决你的问题。
不过要用v2的API,你需要更新一些头文件。
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13125
金钱
13125
注册时间
2012-11-26
在线时间
3814 小时
发表于 2018-1-2 22:05:00 | 显示全部楼层
你就等100    等不到信号,任务会继续执行啊 ,仔细看下函数参数吧
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13125
金钱
13125
注册时间
2012-11-26
在线时间
3814 小时
发表于 2018-1-2 22:05:57 | 显示全部楼层
另外你中断释放信号函数是不是用错了,仔细看下freertos函数用法吧!
回复

使用道具 举报

26

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-8-1
在线时间
57 小时
 楼主| 发表于 2018-1-2 22:22:14 | 显示全部楼层
jermy_z 发表于 2018-1-2 22:05
另外你中断释放信号函数是不是用错了,仔细看下freertos函数用法吧!

恩恩,改成osWaitForever就可以了,这个好像没有 osSemaphoreReleaseFromISR;还有一个问题,创建这个二值信号量的时候就已经产生了一个二值信号量,就会默认进任务一次,有何解决之法?
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13125
金钱
13125
注册时间
2012-11-26
在线时间
3814 小时
发表于 2018-1-3 09:11:10 | 显示全部楼层
zyjs1987 发表于 2018-1-2 22:22
恩恩,改成osWaitForever就可以了,这个好像没有 osSemaphoreReleaseFromISR;还有一个问题,创建这个二 ...

建立信号量之后,立马释放一次,目前没发现有其他办法
学无止境
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 08:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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