你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

OSSemPend有时不成功

[复制链接]
power568 提问时间:2016-3-7 13:56 /
本帖最后由 power568 于 2016-3-15 17:04 编辑

在学些uCOSIII,最近写了个简单测试程序,简单创建了个任务, 在任务中等待信号量:while(1)
{
      OSSemPend(&TestSem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
      TeseNum ++;
}

在中断中Post信号量:
OSSemPost(&TestSem, OS_OPT_POST_NO_SCHED, &err);

周期大约20ms左右,测试过程中,发现正常运行一段时间后,任务再也无法Pend成功。

哪位大侠遇见过这种情况,求指点迷津!!!

信号量创建为:
OSSemCreate(&UsartOneDmaRecDoneSem, "URT one dma rec done", 0, &err);


收藏 评论11 发布时间:2016-3-7 13:56

举报

11个回答
废鱼 回答时间:2016-3-7 15:44:35
在中断中处理不合适,可能是无法释放导致的。
power568 回答时间:2016-3-7 16:06:30
安 发表于 2016-3-7 15:44
在中断中处理不合适,可能是无法释放导致的。

不是很明白,信号量不是可以在中断中Post吗?
求解~!!!
power568 回答时间:2016-3-7 17:08:09
安 发表于 2016-3-7 15:44
在中断中处理不合适,可能是无法释放导致的。

虽然我把中断中的Post去电,改为任务中延时后确实是可以了...

但是原因想不明白???
废鱼 回答时间:2016-3-7 17:24:06
信号量释放的问题,中断一直在工作,比如OSSemPend刚执行就进入post,会导致这样的问题。
power568 回答时间:2016-3-8 13:31:40
安 发表于 2016-3-7 17:24
信号量释放的问题,中断一直在工作,比如OSSemPend刚执行就进入post,会导致这样的问题。 ...

你的意思是OSSemPend还未执行完毕?
废鱼 回答时间:2016-3-8 16:42:28
操作的过程中,应该是信号使用冲突导致的。
power568 回答时间:2016-3-9 15:14:17
安 发表于 2016-3-8 16:42
操作的过程中,应该是信号使用冲突导致的。

这么说的话,有可能,谢谢!!!
power568 回答时间:2016-3-15 17:00:21
安 发表于 2016-3-8 16:42
操作的过程中,应该是信号使用冲突导致的。

后来想想,信号使用不可能会冲突,我在一个任务中Pend,在中断中Post,其余地方未使用。

之前以为是中断周期太短造成的,但是周期放长到100ms后仍然出现,只是出现时间迟点而已。
应该是其余的原因引起的。
power568 回答时间:2016-3-15 17:39:20
问题解决了,原因是中断中忘记添加OSIntEnter 和 OSIntExit函数。
power568 回答时间:2016-3-15 17:39:55
安 发表于 2016-3-8 16:42
操作的过程中,应该是信号使用冲突导致的。

感谢你的支持,问题解决了...
power568 回答时间:2016-3-15 17:42:45
OSIntEnter:用于中断嵌套计数;
OSIntExit:  用于退出中断嵌套后执行任务切换;

如果中断中没有使用到涉及到任务调度的系统函数,可以不使用也不会影响功能...

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版