1.3.1 任务和协程
优质
小牛编辑
156浏览
2023-12-01
这里将介绍任务(task
)与协程(co-routines
)的相关信息,你可以据此判断什么时候该使用协程,什么时候该使用任务,或两者一起使用。值得注意的是,尽管二者使用的API不同,但是却无法通过使用队列或者信号量来相互传递数据。 对于协程,实际上仅仅针对那些RAM空间很小的嵌入式系统,否则不推荐使用。
任务的特点
使用RTOS构建的实时应用是有一系列的任务组成,每个任务各自拥有自己的堆栈用于存储自己的运行上下文(context
)。在任何时间,有且仅有一个任务在执行。具体哪个任务可以执行,则由调度器(scheduler
)决定。当任务切换后,相应的上下文也会做相应的切入切出。任务具有以下特点:
- 简单
- 没有使用上的限制
- 支持抢占式
- 优先级至上
- 每个任务拥有独立堆栈,造成RAM占用过高
- 重入在抢占式的情况下需要额外注意
协程的特点
如前所述,协程的设计初衷是为了那些内存较小的设备准备的,但是如今增强型的51RAM都可以达到几十K的情况下,协程使用的必要其实是越来越小的。不过,协程这一机制仍然被保留下来,freeRTOS官方后续虽然没有移除协程的计划,但是也是不会再去开发了。 协程与任务在概念上是相似的:
堆栈利用 多有的协程在系统内共用同一个堆栈,相比使用任务节省了很多的内存占用。
优先级及调度 Co-routines use prioritised cooperative scheduling with respect to other co-routines, but can be included in an application that uses preemptive tasks
宏实现 协程是由一系列的宏实现的
使用限制 减少内存占用的同时,对协程的使用也存在一些限制
协程具有如下特点:
- 共用同一堆栈,减少内存占用
- 协程使得重入变少
- 在各种架构上都可以轻松移植
- 协程之间也是通过优先级调度,但是如果与任务混用,总是会被任务抢占
- 堆栈空间匮乏需要额外慨率
- API调用的位置存在限制
- Co-operative operation only amongst co-routines themselves.