搜索
bottom↓
回复: 16

请教:uCOS/II 多任务编程时,当某一个任务A接收到任务B发送的事件后,任务A连续执行10秒,1

[复制链接]

出0入0汤圆

发表于 2010-12-8 08:41:51 | 显示全部楼层 |阅读模式
虽然我对uCOS/ii有了一定的了解,但是要想把前后台代码完全移植到ucosii多任务编程环境下,还需要很长的磨合期。
   

    问题1:

        (1)、某一个任务A接收到任务B发送的事件后,任务A连续执行10秒,10S秒后处于“等待”状态。

        (2)、过一段时间,任务A可能会再次接收到任务B发送的事件后,就继续启动,然后执行。



   问题2:

        (3)、当某一个任务C接收到任务D发送的“1”信号量后,任务C就一直执行,
        (4)、当任务C接收到任务D发送的“2”信号量后,任务C就处于等待状态。
        (5)、过一段时间,任务C可能会再次接收到任务D发送的“1”信号量,就继续启动,然后执行。

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

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2010-12-8 09:10:02 | 显示全部楼层
为什么要10秒,执行完了等待就是了啊
taskA()
{
    while(1){
        OSSemPend();//等待B发送的事件
        //执行任务
    }
}



下面这个可以保证就算任务A执行时间不满10秒,也要等到10秒后才再次接收消息
taskA()
{
    while(1){
        OSSemPend();//等待B发送的事件
        time = OSTimeGet();
        //执行任务
        while(OSTimeGet()-time<10000);//假设时钟节拍为1000Hz
    }
}

出0入0汤圆

发表于 2010-12-8 09:25:53 | 显示全部楼层
问题2:


taskC()
{
    state = IDLE;
   
    while(1){
        switch(state){
        case IDLE:
            OSSemPend();//等待信号量1
            state = RUN;
            break;
        case RUN:
            //执行任务
            if(OSSemQuery()>0){//查询信号量2状态
                OSSemPend();//将信号量2“消耗”掉
                state = IDLE;
            }
            break;
        }
}

出0入0汤圆

发表于 2010-12-8 10:15:21 | 显示全部楼层
做个标记

出0入0汤圆

 楼主| 发表于 2010-12-8 10:38:15 | 显示全部楼层
问题1:

        (1)、某一个任务A接收到任务B发送的事件后,任务A连续执行10秒,10S秒后处于“等待”状态。

        (2)、过一段时间,任务A可能会再次接收到任务B发送的事件后,就继续启动,然后执行


   当任务A接收到任务B发送的事件后,任务A“必须“在10秒内都处于运行状态,只有当10秒后,任务A才会处于挂起状态。


   打个简单的比方:

             用PID控制阀门的开度。

           (a)、任务A用于紧急状态下,立即关闭阀门。
           (b)、任务B用于检测是否处于紧急状态,如果检测到蒸汽压力>10MPa,则立即给任务A发送事件
            (c)、 任务X用于常规下管理阀门的开度。

         在正常情况下,任务A是不会执行的,是处于挂起状态;此时由任务X管理阀门的开度。

         当任务B检测到蒸汽压力>10MPa,立即给任务A发送事件,任务A立即关闭阀门。如果在10秒内不连续输出关闭阀门的指令的
   话,阀门开启后,会瞬间出现“蒸汽压力>10MPa”。因此任务A接收到紧急事件后,必须连续执行10秒。

出0入0汤圆

 楼主| 发表于 2010-12-8 10:41:08 | 显示全部楼层
(1)、任务A用于紧急状态下,立即关闭阀门。
            (2)、 任务X用于常规下管理阀门的开度。
           (3)、任务B用于检测是否处于紧急状态,如果检测到蒸汽压力>10MPa,则立即给任务A发送事件 ,要求关闭阀门。

      好象可以使用互斥型信号量。即任务A和任务X是互斥。

     但是如何实现“任务A连续执行10秒”呢?

出0入0汤圆

发表于 2010-12-8 10:52:14 | 显示全部楼层
taskA()
{
    while(1){
        OSSemPend();//等待B发送的事件
        time = OSTimeGet();
        OSTaskSuspend();//挂起任务X
        while(OSTimeGet()-time<10000){//假设时钟节拍为1000Hz
            //执行任务,连续输出关闭阀门的指令
        }
        OSTaskResume();//恢复任务X
    }
}

出0入0汤圆

 楼主| 发表于 2010-12-8 11:23:26 | 显示全部楼层
谢谢。太感谢了。


    从前后台到多任务,还需要变换思维方式呀!

出0入0汤圆

发表于 2010-12-8 15:17:09 | 显示全部楼层
如果我感觉没错的话,A和X应该合并为一个任务。

出0入0汤圆

发表于 2010-12-27 17:01:40 | 显示全部楼层
牛!学习了,感谢!

出0入0汤圆

发表于 2011-8-25 15:41:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-30 22:28:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-6 11:36:52 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-9-8 08:41:14 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-9-17 20:01:04 | 显示全部楼层
学习了。谢谢。

出0入0汤圆

发表于 2011-12-30 19:05:03 | 显示全部楼层
mark

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-10-2 23:17

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

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