OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8878|回复: 23

ucos可以挂起有延时的任务吗,挂起后时钟节拍来时延时时间要减一吗?

[复制链接]

12

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2012-4-25
在线时间
0 小时
发表于 2012-6-30 15:08:39 | 显示全部楼层 |阅读模式
如题 有说的不清楚的地方请指出来,谢谢各位大哥大婶大侠大神and乡亲们。
真正和谐
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

145

主题

477

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1264
金钱
1264
注册时间
2012-4-2
在线时间
69 小时
发表于 2012-6-30 17:27:06 | 显示全部楼层
延时有阻塞延时和非阻塞延时

挂起任务后,任务就不工作了。  
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-6-30 18:48:01 | 显示全部楼层
挂起和延时不一样概念的哦.
挂起是不会再执行本任务了,直到取消挂起.
而延时只是暂时不运行,等延时时间到了,就继续运行本任务.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2012-4-25
在线时间
0 小时
 楼主| 发表于 2012-6-30 20:57:14 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥比如在一个任务中执行以下语句
OSTimeDly();
OSTaskSuspend(OS_PRIO_SELF);
时钟节拍是不会停的,那么延时中的值在每个节拍来时要不要减1,是不是我对某些概念不清楚请解释下
真正和谐
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-7-1 00:23:56 | 显示全部楼层
回复【4楼】txz:
---------------------------------
有什么问题?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
发表于 2014-4-10 21:30:05 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥,问你个问题,举个例子,现在有A任务和B任务,A任务进入延时后就释放了cpu,接下来就该执行B任务了,我想问的就是A的这个延时函数是要在B任务执行到延时函数释放cpu后才执行,还是在B任务执行的时候A的延时函数也在同时执行?如果是同时执行的话,那么是不是说当A、B任务同时挂起的时候延时函数还是可以执行的?
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-4-10 23:18:47 | 显示全部楼层
回复【6楼】ljjdglg520:
---------------------------------
这就看你的设置了
如果A优先级高于B。
那么A可以打断B的执行,在A延时到了以后,可以打断B的运行,继续A任务。
如果A低于B,那么A就是被打断的命运了。。。只要B不主动释放CPU,A就别想跑。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
发表于 2014-4-11 13:22:15 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
如果A优先级高于B。 
那么A可以打断B的执行,在A延时到了以后,可以打断B的运行,继续A任务。
----那打断B后,继续执行A任务,那怎样才会再进入B任务?它们同时都进入延时后,它们的延时应该还是可以继续同时执行的吧,不然B任务的延时怎样执行?

就以原子哥写的的库函数版本的第51章上的例子讲,假设A(即LED1任务)优先级高于B(即LED0任务),我自己的理解是,刚开始A和B都执行到延时函数,都释放了CPU,但是它们的延时函数都是可以同时继续执行的,B第一个延时是80ms,A第一个延时的是300ms,两个延时同时执行,B执行完80ms后A还有220ms,所以B任务先跳出延时继续执行接下来的函数,等到A剩下的220ms延时执行完后就打断B转向执行A接下来的函数,等到A执行到第二个延时释放CPU后才执行B,以此循环。

如果我的理解是错误的话,那应该是怎么样呀?关键我还是不理解,A和B都释放CPU后会怎么样?如果A和B同时释放CPU,而B的延时不执行的话,那么不就是永远在执行A任务,不可能跳到B任务呀- -
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-4-11 16:05:41 | 显示全部楼层
回复【8楼】ljjdglg520:
---------------------------------
就是这么理解了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-3-27
在线时间
0 小时
发表于 2014-4-11 16:23:24 | 显示全部楼层
回复【4楼】txz:
---------------------------------
在节拍到来时会减一。
while (ptcb->OSTCBPrio != OS_TASK_IDLE_PRIO) {     /* Go through all TCBs in TCB list              */
            OS_ENTER_CRITICAL();
            if (ptcb->OSTCBDly != 0u) {                    /* No, Delayed or waiting for event with TO     */
                ptcb->OSTCBDly--;                          /* Decrement nbr of ticks to end of delay       */
                if (ptcb->OSTCBDly == 0u) {                /* Check for timeout                            */

                    if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) {
                        ptcb->OSTCBStat  &= (INT8U)~(INT8U)OS_STAT_PEND_ANY;          /* Yes, Clear status flag   */
                        ptcb->OSTCBStatPend = OS_STAT_PEND_TO;                 /* Indicate END timeout    */
                    } else {
                        ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
                    }

                    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) {  /* Is task suspended?       */
                        OSRdyGrp               |= ptcb->OSTCBBitY;             /* No,  Make ready          */
                        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                    }
                }
            }
这是时钟节拍对延时部分的处理
回复 支持 反对

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
发表于 2014-4-11 16:41:57 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
原子哥,我想问2个问题:
1.为什么A和B都释放了cpu,但是延时函数还能执行?是不是像9楼说的那样,是时钟节拍对延时部分的处理,而时钟节拍一般是不能被打断的?如果这样的话,岂不是这样,假如一种情况是,A优先级比B高,A在运行,而B释放了cpu,此时是不是B的延时函数还是能够执行的,只是该B函数的延时执行完后不能再往下执行,直到高优先级的A释放了cpu后B才能往下执行?总之延时函数是不会停止的,因为它是时钟节拍作用的?

2.我又看了一下对SysTick的讲解部分,书上说只要不把状态寄存器中的使能位清除,就永不停息——它说的永不停息除了清除相应的使能位外,还有没有什么特殊情况可以打破它?例如进入待机、睡眠或者中断什么的?
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-4-12 00:02:40 | 显示全部楼层
回复【11楼】ljjdglg520:
---------------------------------
1,延时就是在:CPU跑空闲任务(最低优先级)。B如果延时时间到,且A没有释放CPU,那么是不会运行的。所谓延时函数运行,就是在跑空闲任务...
2,待机模式当然就不跑了。。。中断的时候还是在跑的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
发表于 2014-4-12 10:11:14 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
既然延时相当于最低优先级的任务,那么B刚执行到延时释放cpu的时候,而A还没有释放CPU,所以此时空闲任务(即B的延时)就不能执行了,B要先跳出该延时,先执行高优先级的A,等到A也进入延时后,此时没有正在运行的任务,A和B都变成空闲任务,此时B才能开始执行?也就意味着B的延时要等到A执行到延时时才能执行?是不是这样理解?     好混乱吖。。。。。
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-4-12 20:32:24 | 显示全部楼层
回复【13楼】ljjdglg520:
---------------------------------
你的前提就错了。
当A还没释放CPU的时候,B怎么可能运行?

多任务,不是多线程。

一个任务运行的时候,任何其他任务都是不可能运行的,这是单片机运行os的大前提。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
发表于 2014-4-12 21:27:35 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
这个我能理解,我就是不理解,比方说,B释放了内存,但是B的延时函数还没执行完,而A还在运行,这时B的延时函数会不会跑?是要等到A释放cpu后B的延时函数才能继续跑吗?
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-4-12 23:26:08 | 显示全部楼层
回复【15楼】ljjdglg520:
---------------------------------
延时当然是继续计算的,所谓的延时,其实就是由SYSTICK中断来实现的,每个SYSTICK总断,延时1个时钟节拍.
等延时到了就让任务继续跑.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

47

主题

360

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
发表于 2014-4-13 00:21:39 | 显示全部楼层
回复【16楼】正点原子:
---------------------------------
好的,我理解了。谢谢!
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复 支持 反对

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-6-4 23:09:03 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
假如一个任务延时3S,但是他延时到2S的时候被挂起了,那等到他被恢复运行的时候,还继续延时刚刚挂起前那剩余的1S时间吗?还是从头运行这个任务?读任哲的书遇到这个问题,感觉恢复了还继续延时那剩余的1S,但是任务控制块里面的成员OSTCBDly和这个延时又有什么关系
合肥-文盲
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-6-6 00:00:36 | 显示全部楼层
回复【18楼】合肥-文盲:
---------------------------------
一但开始延时,就挂起了。
所以,你的假设就是错误的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-6-6 15:34:17 | 显示全部楼层
回复【19楼】正点原子:
---------------------------------
原来延时也是一种挂
合肥-文盲
回复 支持 反对

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-6-10 22:45:34 | 显示全部楼层
遇到和楼主一样的疑惑,楼主理解了吗?讲解讲解啊
合肥-文盲
回复 支持 反对

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-6-11 00:46:06 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
也就是一个任务(1)在延时,在另外一个任务(2)里面再调用OSTaskSuspend(prio);挂起那个正在延时的任务(1),这个时候那个被挂起的任务(1)的延时剩余时间还继续减吗?   我也遇到这个困惑,好像就算被Suspend了,延时的剩余时间也是在减的,求原子哥给个肯定答案
合肥-文盲
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-6-11 00:55:39 | 显示全部楼层
回复【22楼】合肥-文盲:
---------------------------------
我也没试过,你测试下吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

86

帖子

0

精华

高级会员

Rank: 4

积分
567
金钱
567
注册时间
2014-12-19
在线时间
139 小时
发表于 2017-3-1 17:43:14 | 显示全部楼层
感谢楼上各位。让我明白了系统里面的延时。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 19:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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