搜索
bottom↓
回复: 3

FreeRTOS里co-routine是什么?

[复制链接]

出0入0汤圆

发表于 2007-8-3 20:07:42 | 显示全部楼层 |阅读模式
FreeRTOS里co-routine是什么?

有点像task,但有不是。

co-routine和task有什么区别?

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

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

出0入0汤圆

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



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

出0入0汤圆

发表于 2010-12-18 11:13:19 | 显示全部楼层
也在研究

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 15:30

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

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