为什么 uCOS-Ⅱ一个任务通常是一个无限循环(返回值类型void)

[复制链接]
5163|11
手机看帖
扫描二维码
随时随地手机跟帖
john_lee| | 2012-7-20 22:12 | 显示全部楼层
“任务”和“人”,在某些方面有相似之处:一般意义上,人做事不会是做完后就把这个人干掉,再有事时又去生一个来做事,那样的话成本太高,成本较低的办法是让这个人在没事的时候休息就行了,同样的道理,任务没事的时候,让任务睡眠并等待下一个事情,有事了就醒来继续做事,比杀掉任务,有事再创建一个任务,成本更低。
于是,任务的基本特点之一就是:有事做事,无事休息。人又何尝不是如此?
任务做的事,总是设计好的那些,不会有什么变化,而你从小到大,宏观上虽然变化很大,但具体到某一阶段,又是非常固定,比如大学三点一线。
于是,任务的另一个基本特点就是:重复性或周期性。

下面就是一个任务的典型结构:
void task()
{
    while (1) {
        event = wait();     // 睡眠(阻塞)并等待事件,发生事件后即被唤醒
        if (event == event1) {  // 事件1到来
            do_something1();    // 做事1
        } else if (event == event2) {  // 事件2到来
            do_something2();    // 做事2
        }
        ....
    }
}
对于那些所谓的“一次性任务”,完全是没有理由存在的,如果谁用到了,一定是项目设计不合理。

使用特权

评论回复
shell.albert| | 2012-7-21 19:21 | 显示全部楼层
楼上正解!有事干活,无事休息!

使用特权

评论回复
aukey| | 2012-7-22 18:27 | 显示全部楼层
之所以要用循环,我的理解是这样的,如果不用循环,一个任务执行完以后,如果没有任务调度的话,他会怎么样,在任务的结尾如果没有任务调度的话,程序就跑飞了。用循环一方面是为了任务的多次执行,另一方面是为了防止程序的不可控。如果任务直执行一次,可以再任务的结尾加上一个删除任务自身的函数,使任务自杀。

使用特权

评论回复
sjl2006| | 2012-7-26 16:46 | 显示全部楼层
纠正楼上的一点错误,如果一个任务没有循环,在这个任务对应的enrty执行完毕后,OS会执行杀死它的工作,不用你自己做。

使用特权

评论回复
yyql008| | 2012-7-26 16:58 | 显示全部楼层
从C看,只有调用一个函数后,才能把函数的返回地址保存在堆栈中,然后函数执行完,返回到调用处(可以看看C调用时的函数栈帧结构).
而任务不是一般的函数,它不是调用进去的.还是通过堆栈初始化,然后硬生生"切"进去的(看看UCOS移植过程中需要修改的堆栈初始化函数初始化了什么酒知道),这导致任务无返回地址.
如果任务不设计成无穷循环形式,任务函数一返回,不知道返回到哪里去了-------CPU把堆栈中的"脏"数据当做返回地址.说不定CPU就死了!

使用特权

评论回复
john_lee| | 2012-7-26 21:27 | 显示全部楼层
关于任务例程是否可以返回(return),这个完全取决于RTOS的设计策略。
LS描述的,是一种设计策略,如果允许任务例程返回,那么可以在任务栈初始化时,在栈顶“压入”一个返回时调用的函数地址,当任务返回时,返回地址就不是“脏”数据了。在返回的函数中,就可以执行delete的工作。

使用特权

评论回复
liuchang890811| | 2015-8-5 17:24 | 显示全部楼层
john_lee 发表于 2012-7-20 22:12
“任务”和“人”,在某些方面有相似之处:一般意义上,人做事不会是做完后就把这个人干掉,再有事时又去生 ...

大神:小弟刚学ucos,听你一席话,胜读十年书~~~

使用特权

评论回复
阿泉爱学习| | 2019-11-5 10:52 | 显示全部楼层
john_lee 发表于 2012-7-20 22:12
“任务”和“人”,在某些方面有相似之处:一般意义上,人做事不会是做完后就把这个人干掉,再有事时又去生 ...

请收下我的膝盖

使用特权

评论回复
zchunhua25| | 2019-11-11 15:13 | 显示全部楼层
了解一下

使用特权

评论回复
maowentao0416| | 2019-11-15 20:25 | 显示全部楼层
无限循环就跟任务---循环扫描执行任务,任务或线程之间通过时间片轮转来调度,任务也有优先级

使用特权

评论回复
kesiiy| | 2019-11-18 17:10 | 显示全部楼层
可以认为每一个TASK都是一个WHILE
写应用程序的时候可以一个工作放在一个TASK里
前提是你的调度机制可以达到你应用程序的时间要求

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

80

帖子

1

粉丝