znyu2009 发表于 2010-9-8 11:56:45

请教大家一个关于uC/OS-II信号量里OSEventCnt的问题。

任哲《嵌入式实时操作系统μC\OS-Ⅱ原理及应用》第一版的第116页。第二版的134页有如下图的一段话。我琢磨了半天,还是感觉怪怪的。
因为表中的OSEventCnt为3>0,但是为什么OSEventTbl[]表里还会有4个任务等待呀?

http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_581176XF3ZA0.JPG
(原文件名:111111111111111111.JPG)

A-smith 发表于 2010-9-8 14:44:43

OSEventCnt为3只是表明这个信号量被发出了3次(这个信号量目前可以被申请到3次)并不意味着等待这个信号量的任务一定为3个

信号量的发出和等待不一定对应上 也不需要什么先后关系

可以有12个任务等待同一个信号量 当发出1个信号量时 最高优先级任务申请到可以继续执行 如果这个信号量再被发出一次次高优先级的
执行其他10个依次等待

也可以在没有任务申请这个信号量之前 连续发送12次信号量 这样 OSEventCnt为12
当此时有1个任务循环等待这个信号量   也就是说这个任务被允许执行12次 每次执行后OSEventCnt -- 并且扫描任务等待列表

znyu2009 发表于 2010-9-8 23:08:37

那我不明白了,既然目前这个信号量可以被请求三次,那么下面的四个任务还等待干什么呢?
最起码,有三个任务不用等了,应该能够直接请求到这个信号量。

xuxi2009 发表于 2010-9-8 23:21:59

znyu2009你很有心,那么晚了实在不愿开电脑查书的哪页哪页,而你已经把图附上了,哈哈,赞一个,你的理解是对的,那个只是个示意图,实际中不会出现这种情况的

znyu2009 发表于 2010-9-9 08:55:27

xuxi2009谢谢你。

A-smith 发表于 2010-9-9 10:02:00

额我想了想一般情况下确实是这样不会出现表中情况 但有例外

如果对信号量的操作都是通过 OSSemAccept OSSemPostOSSemPendOSSemCreat OSSemDel 这5个的话一定不会出现

OSEventCnt 和 任务等待列表里的任务数目 同时 >= 1 一定有一个 <= 1

不过有些时候可以人为的改变OSEventCnt 用最快的速度增加这个资源的可申请数量 又不想引起任务的切换 可以直接改OSEventCnt

就可能引起表中的情况了 不过这方法一般都不用,属于脱离RTOS思想。

znyu2009 发表于 2010-9-9 11:09:11

回复【5楼】A-smith
额我想了想一般情况下确实是这样不会出现表中情况 但有例外
如果对信号量的操作都是通过 ossemaccept ossempostossempendossemcreat ossemdel 这5个的话一定不会出现
oseventcnt 和 任务等待列表里的任务数目 同时 &gt;= 1 一定有一个 &lt;= 1
不过有些时候可以人为的改变oseventcnt 用最快的速度增加这个资源的可申请数量 又不想引起任务的切换 可以直接改oseventcnt
就可能引起表中的情况了 不过这方法一般都不用,属于脱离rtos思想。
-----------------------------------------------------------------------

我也是这个样子想的,OSEventCnt 和 任务等待列表里的任务数目至少有一个为0.

您最后的一个想法是人为的修改OSEventCnt的数值,在有等待任务的情况下,
实现代码为;

pevent->OSEventCnt=cnt;
OSSemQuery(*pevent,*pdata);

然后到OS_SEM_DATA里查询。应该应会有这种情况。等待任务表里有任务,而且OSEventCnt>0;
不过应该很快就会因为目前有可以被申请的信号量,而使的请求信号量的任务进入就绪列表的。
所这您的所述也应该是一个“暂态”才对。

呵呵……谢谢两位。xuxi2009&A-smith
页: [1]
查看完整版本: 请教大家一个关于uC/OS-II信号量里OSEventCnt的问题。