请教大家一个关于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) OSEventCnt为3只是表明这个信号量被发出了3次(这个信号量目前可以被申请到3次)并不意味着等待这个信号量的任务一定为3个
信号量的发出和等待不一定对应上 也不需要什么先后关系
可以有12个任务等待同一个信号量 当发出1个信号量时 最高优先级任务申请到可以继续执行 如果这个信号量再被发出一次次高优先级的
执行其他10个依次等待
也可以在没有任务申请这个信号量之前 连续发送12次信号量 这样 OSEventCnt为12
当此时有1个任务循环等待这个信号量 也就是说这个任务被允许执行12次 每次执行后OSEventCnt -- 并且扫描任务等待列表 那我不明白了,既然目前这个信号量可以被请求三次,那么下面的四个任务还等待干什么呢?
最起码,有三个任务不用等了,应该能够直接请求到这个信号量。 znyu2009你很有心,那么晚了实在不愿开电脑查书的哪页哪页,而你已经把图附上了,哈哈,赞一个,你的理解是对的,那个只是个示意图,实际中不会出现这种情况的 xuxi2009谢谢你。 额我想了想一般情况下确实是这样不会出现表中情况 但有例外
如果对信号量的操作都是通过 OSSemAccept OSSemPostOSSemPendOSSemCreat OSSemDel 这5个的话一定不会出现
OSEventCnt 和 任务等待列表里的任务数目 同时 >= 1 一定有一个 <= 1
不过有些时候可以人为的改变OSEventCnt 用最快的速度增加这个资源的可申请数量 又不想引起任务的切换 可以直接改OSEventCnt
就可能引起表中的情况了 不过这方法一般都不用,属于脱离RTOS思想。 回复【5楼】A-smith
额我想了想一般情况下确实是这样不会出现表中情况 但有例外
如果对信号量的操作都是通过 ossemaccept ossempostossempendossemcreat ossemdel 这5个的话一定不会出现
oseventcnt 和 任务等待列表里的任务数目 同时 >= 1 一定有一个 <= 1
不过有些时候可以人为的改变oseventcnt 用最快的速度增加这个资源的可申请数量 又不想引起任务的切换 可以直接改oseventcnt
就可能引起表中的情况了 不过这方法一般都不用,属于脱离rtos思想。
-----------------------------------------------------------------------
我也是这个样子想的,OSEventCnt 和 任务等待列表里的任务数目至少有一个为0.
您最后的一个想法是人为的修改OSEventCnt的数值,在有等待任务的情况下,
实现代码为;
pevent->OSEventCnt=cnt;
OSSemQuery(*pevent,*pdata);
然后到OS_SEM_DATA里查询。应该应会有这种情况。等待任务表里有任务,而且OSEventCnt>0;
不过应该很快就会因为目前有可以被申请的信号量,而使的请求信号量的任务进入就绪列表的。
所这您的所述也应该是一个“暂态”才对。
呵呵……谢谢两位。xuxi2009&A-smith
页:
[1]