搜索
bottom↓
回复: 24

UCOS-II中的OSSemPend()和OSSemPost()函数如何理解

[复制链接]

出0入0汤圆

发表于 2010-12-10 21:42:24 | 显示全部楼层 |阅读模式
我在看邵贝贝翻译的《UC/OS-II,The Real-Time Kernel》文章中的“1.07.03 TaskN()”下,发现有段文字使我不能理解。其原文如下:

红框为不理解的地方 (原文件名:ss.JPG)


(原文件名:ss2.JPG)

在任哲的《UC/OS-II原理及应用》中提到UC/OS-II是一个抢占式内核,在调用OSTimeDly()函数让出CPU使用权之前,其他任务能运行random()吗?如果能的话,那抢占式内核如何理解?如果不能,那用OSSemPend()获取信号量,然后又用OSSemPost()函数释放信号量这一过程岂不是多余了?

我在STM32S上试过了,这两个函数有没有都不影响程序运行。我不知道是不是我验证方法有误,还是我理解有误.希望大家指教。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-12-10 23:17:02 | 显示全部楼层
Task应该不能运行,Task运行到这时OSSemPend(rondamsem,0,&err),由于不能得到信号量而被挂起。楼主应该将释放信号量函数放到别的任务里,这样Task任务就获得信号量的机会,不然该任务一直挂起等待信号量。或是改成OSSemPend(rondamsem,1,&err),Task任务没申请到信号量超时运行。
本人也是刚学ucos-ii不久,不对之处请多指教。

出0入0汤圆

发表于 2010-12-11 00:59:23 | 显示全部楼层
先肯定一下楼主的钻研精神,很多人看到此处基本上是一带而过,不会深究的,并且这个例子也确实不是很严谨,才会导致楼主得出这样的结论。

首先,例子中的任务只有主动放弃CPU资源(OSTimeDly),才能让其它任务运行,这就造成了OSSemPend至OSSemPost间的任务运行不会被抢占,事实上整个系统根本没有抢占,完全等同于协作式多任务,所以楼主得出了不需Sem一样运行无误的结果。

但如果重新设计一下系统,引入异步事件,使任务随机访问random的话,那么为random加上同步对象则是必须的。

还有一点,例子中任务的一个循环运行时间(指CPU占用时间)必须小于1/10个Tick,即不能过载,以上的运行效果及解释才有意义。

出0入0汤圆

发表于 2010-12-11 01:03:05 | 显示全部楼层
回复【1楼】lizexi486
-----------------------------------------------------------------------

randomsem肯定已经被初始化为1了,所以任务可以Pend到,然后又将其Post,周而复始,薪火相传。

出0入0汤圆

发表于 2010-12-11 01:14:38 | 显示全部楼层
回复【1楼】lizexi486
task应该不能运行,task运行到这时ossempend(rondamsem,0,&err),由于不能得到信号量而被挂起。楼主应该将释放信号量函数放到别的任务里,这样task任务就获得信号量的机会,不然该任务一直挂起等待信号量。或是改成ossempend(rondamsem,1,&err),task任务没申请到信号量超时运行。
本人也是刚学ucos-ii不久,不对之处请多指教。
-----------------------------------------------------------------------

这个例子讲的是用信号量来同步一些不能同时被多个任务访问的资源,这里的例子是随机数发生函数
任务初始化的时候,信号量是1
然后几个任务开始运行,每个任务都是得到信号量后才开始使用random函数,否则就把自己挂起来,从而避免random函数重入的情况出现

出0入0汤圆

发表于 2010-12-11 01:40:01 | 显示全部楼层
明白了,谢谢楼上的两位!

出0入24汤圆

发表于 2010-12-11 01:53:33 | 显示全部楼层
回复【5楼】lizexi486
-----------------------------------------------------------------------

LZ,你试着建立多个任务,每个任务都调用串口打印字符串,你就会体会到信号量的用途了

出0入0汤圆

发表于 2010-12-13 09:16:43 | 显示全部楼层
信号量有三种工作方式:

    1、资源同步
    2、任务间同步
    3、中断和任务同步


       楼主所描述的是资源同步。资源同步的要求是:
            (1)、OSSemPend()和OSSemPost()必须成对出现在一个任务中。如楼主上面的代码。

                   ossempend(rondamsem,0,&err)和OSSemPost(rondamsem)
             (2)、必须将信号量randomsem肯定已经被初始化为1了,所以任务可以Pend到,然后又将其Post,周而复始,薪火相传


      任务间同步的要求如下:

              (1)、一个任务调用OSSemPost()发送信号量
              (2)、另外一个任务等待信号量ossempend()


      中断和任务同步要求如下:
              (1)、中断服务程序调用OSSemPost()发送信号量
              (2)、任务等待信号量ossempend()



(原文件名:1.JPG)


(原文件名:2.JPG)


(原文件名:3.JPG)

出0入0汤圆

发表于 2010-12-13 09:47:12 | 显示全部楼层
可是那里初始化不是0吗(OSSemPend(rondamsem,0,&err)?怎么还能向下进行呢?
  我也看到过这样的例子,不太明白

出0入0汤圆

发表于 2010-12-14 10:07:52 | 显示全部楼层
ddd!

出0入0汤圆

发表于 2010-12-14 22:41:45 | 显示全部楼层
回复【8楼】embeddev
-----------------------------------------------------------------------

可是那里初始化不是0吗(OSSemPend(rondamsem,0,&err)?怎么还能向下进行呢?
----------------------------------------------------------------------
这个不是初始化为0吧,应该是信号量等待超时时间为0

出0入0汤圆

发表于 2010-12-15 09:08:28 | 显示全部楼层
信号量有三种工作方式:

    1、资源同步
    2、任务间同步
    3、中断和任务同步


       楼主所描述的是资源同步。资源同步的要求是:
            (1)、OSSemPend()和OSSemPost()必须成对出现在一个任务中。如楼主上面的代码。

                   ossempend(rondamsem,0,&err)和OSSemPost(rondamsem)
             (2)、必须将信号量randomsem肯定已经被初始化为1了,所以任务可以Pend到,然后又将其Post,周而复始,薪火相传

            (3)、或者必然有一个信号量被设置成 timeout超时后,自然从等待任务列表中删除,进入就绪列表。

出0入0汤圆

发表于 2010-12-15 12:29:15 | 显示全部楼层
7楼的资料是zlg的吗,能不能给个链接共享下啊

出0入0汤圆

发表于 2010-12-15 13:15:01 | 显示全部楼层
回复【12楼】first blood
7楼的资料是zlg的吗,能不能给个链接共享下啊
-----------------------------------------------------------------------

参见:
   http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4428744&bbs_page_no=1&bbs_id=3004

   【41】楼有下载链接。

出0入0汤圆

发表于 2010-12-15 13:19:21 | 显示全部楼层
初始化为2或更高,会是一样结果吗?

出0入9汤圆

发表于 2010-12-15 16:55:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-15 20:25:36 | 显示全部楼层
回复【14楼】embeddev
  初始化为2或更高,会是一样结果吗?
-----------------------------------------------------------------------

初始化为什么值,是根据你需要保护的资源的数量决定的,对于不可重入的函数,显然就只能是1。
在楼主的例子中,初始化为非0的任何值都可以,因为例子本身就是协作式多任务,sem在里面就是个摆设。

出0入0汤圆

发表于 2011-9-16 15:30:12 | 显示全部楼层
同意7楼的回复。

出0入0汤圆

发表于 2013-8-4 16:19:01 | 显示全部楼层

出0入0汤圆

发表于 2014-10-31 10:14:18 | 显示全部楼层
学习了,大神们讲的很透彻

出0入0汤圆

发表于 2014-11-6 09:45:14 | 显示全部楼层
路过,学习学习

出0入0汤圆

发表于 2014-11-10 08:40:20 | 显示全部楼层
路过观看,多谢

出0入26汤圆

发表于 2015-5-25 08:59:49 | 显示全部楼层
路过看看。。。。。。。。。。。。

出0入0汤圆

发表于 2016-5-16 15:18:06 | 显示全部楼层
谢谢大神们分享

出0入0汤圆

发表于 2016-5-20 16:41:00 | 显示全部楼层
周立功那个资料真好!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-28 00:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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