ATmega32 发表于 2007-8-3 20:07:42

FreeRTOS里co-routine是什么?

FreeRTOS里co-routine是什么?

有点像task,但有不是。

co-routine和task有什么区别?

szyusong 发表于 2007-8-3 21:07:51

协程(coroutine)技术是一种程序控制机制,早在上世纪60年代就已提出,用它可以很方便地实现协作式多任务。在主流的程序语言(如C++、 Java、Pascal等)里我们很少能看到协程的身影,但是现在不少动态脚本语言(Python、Perl)却都提供了协程或与之相似的机制,其中最突出的便是Lua。



http://game.chinaitlab.com/arithmetic/30535.html

taijitu520 发表于 2010-12-18 11:13:19

也在研究

chucky 发表于 2011-1-23 13:12:24

其实很简单。如果你要编写过很多单片机程序的话,可能你无意中都用过这个编程技巧。举个简单的例子:
如果你的单片机要做两个任务:
task 1: 读取键盘输入,然后处理按键
task 2:周期性读取传感器输入,然后进行pid算法,然后输出控制量

假如你不想使用rtos的话,你可以这么实现你的主程序

void main(void)
{
init();
while(1)
{
do_task1();
do_task2();
}
}

其中,死循环里两个函数do_task1() 和do_task2()要能够迅速返回(非堵塞),不然就影响整个程序的性能了。于是,两个函数可以这么写:

void do_task1()
{
static state = 0;
switch(state)
{
case 0:
if(有按键)
{
   state ++;
}
break;
case 1:
读取并处理按键
state = 0;
break;
}
}

void do_task2()
{
static state = 0;
switch(state)
{
case 0:
if(定时器overflow)
{
   state = 1;
}
break;
case 1:
读取sensor采样值;
pid运算
输出控制量
state = 0;
break;
}
}

其中,两个函数都是用了switch以及一个state变量来把一个长段任务分解为一小截一小截的“时间片”来运行了。这样就模拟了os的任务调度(非抢占方式)。

这就是co-routine编程技巧。

有很多著名软件,将这种编程方式利用“宏”来实现了。比较著名的有freertos,和那个uip里面带的轻量级线程,,,,等。。。
当然,我更倾向于自己用switch语句直接写。。。虽然程序大了头有点晕,但这种从头到尾自己写程序,比较好玩。。。
页: [1]
查看完整版本: FreeRTOS里co-routine是什么?