OpenEdv-开源电子网

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

互斥信号量未释放,任务被挂起

[复制链接]

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-11-22
在线时间
8 小时
发表于 2020-12-9 10:50:01 | 显示全部楼层 |阅读模式
10金钱
我在多个任务中都会用到采集AD信号的函数,避免多任务同时访问这个函数,用互斥信号量进行保护,遇到的问题就是,其中一个任务再被挂起的时候,有可能信号量还未释放,那么其他任务想访问这个函数的时候,就只能无限等待了,想了个办法就是挂起后人为释放一次信号量,但是使用一段时间后,AD采集的值就乱了。现在暂时想不到什么好办法了,只好求助于论坛的大神们了!

最佳答案

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

已经解决:用了两种办法,第一种是在任务中判断有没有结束,也就是单次循环是否已经结束,这样可以确保信号量是被释放的,但是有延迟,不能第一时间挂起任务,第二种是增加一个高优先级的任务,单独采集AD的值,并且赋值给全局变量,其它任务如果需要AD的值,直接取全局变量的值即可,对于其它任务来说,这个值只能是只读。分别测试验证过,用的是第二种办法。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-11-22
在线时间
8 小时
 楼主| 发表于 2020-12-9 10:50:02 | 显示全部楼层
已经解决:用了两种办法,第一种是在任务中判断有没有结束,也就是单次循环是否已经结束,这样可以确保信号量是被释放的,但是有延迟,不能第一时间挂起任务,第二种是增加一个高优先级的任务,单独采集AD的值,并且赋值给全局变量,其它任务如果需要AD的值,直接取全局变量的值即可,对于其它任务来说,这个值只能是只读。分别测试验证过,用的是第二种办法。
回复

使用道具 举报

2

主题

141

帖子

0

精华

高级会员

Rank: 4

积分
673
金钱
673
注册时间
2020-11-21
在线时间
67 小时
发表于 2020-12-9 11:20:37 | 显示全部楼层
使用 DMA采集,放到一个数组中,多个任务直接去数组中读取数据就行。
回复

使用道具 举报

0

主题

113

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2538
金钱
2538
注册时间
2019-10-18
在线时间
403 小时
发表于 2020-12-9 21:52:57 | 显示全部楼层
那说明你的优先级设定有问题啊
假如你任务a获取了信号量,然后被b任务抢占,但是当任务c又抢占了任务b并且需要信号量的时候,
c任务会提升任务a的优先级和c同级,c任务挂起,这时候a任务比b任务优先级高,一直运行到任务a释放信号量后重新降级到原优先级
这时候c获取到信号量并开始后续任务,
所以你说的问题并不存在,不可能任务a一直挂起无限等
互斥信号量的重要的一点就是带有防止优先级反转的.
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-11-22
在线时间
8 小时
 楼主| 发表于 2020-12-10 08:43:26 | 显示全部楼层
511386807 发表于 2020-12-9 11:20
使用 DMA采集,放到一个数组中,多个任务直接去数组中读取数据就行。

DMA是stm32自带的,我用的单独的AD芯片
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 17:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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