这里将介绍任务(task)与协程(co-routines)的相关信息,你可以据此判断什么时候该使用协程,什么时候该使用任务,或两者一起使用。值得注意的是,尽管二者使用的API不同,但是却无法通过使用队列或者信号量来相互传递数据。
对于协程,实际上仅仅针对那些RAM空间很小的嵌入式系统,否则不推荐使用。

任务的特点

使用RTOS构建的实时应用是有一系列的任务组成,每个任务各自拥有自己的堆栈用于存储自己的运行上下文(context)。在任何时间,有且仅有一个任务在执行。具体哪个任务可以执行,则由调度器(scheduler)决定。当任务切换后,相应的上下文也会做相应的切入切出。任务具有以下特点:

  • 简单
  • 没有使用上的限制
  • 支持抢占式
  • 优先级至上
  • 每个任务拥有独立堆栈,造成RAM占用过高
  • 重入在抢占式的情况下需要额外注意

协程的特点

如前所述,协程的设计初衷是为了那些内存较小的设备准备的,但是如今增强型的51RAM都可以达到几十K的情况下,协程使用的必要其实是越来越小的。不过,协程这一机制仍然被保留下来,freeRTOS官方后续虽然没有移除协程的计划,但是也是不会再去开发了。
协程与任务在概念上是相似的:

  1. 堆栈利用
    多有的协程在系统内共用同一个堆栈,相比使用任务节省了很多的内存占用。

  2. 优先级及调度
    Co-routines use prioritised cooperative scheduling with respect to other co-routines, but can be included in an application that uses preemptive tasks

  3. 宏实现
    协程是由一系列的宏实现的

  4. 使用限制
    减少内存占用的同时,对协程的使用也存在一些限制

协程具有如下特点:

  • 共用同一堆栈,减少内存占用
  • 协程使得重入变少
  • 在各种架构上都可以轻松移植
  • 协程之间也是通过优先级调度,但是如果与任务混用,总是会被任务抢占
  • 堆栈空间匮乏需要额外慨率
  • API调用的位置存在限制
  • Co-operative operation only amongst co-routines themselves.