有关多任务基本概念的介绍,请参阅 FreeRTOS 的工作原理部分。
任务和协程文档页面提供信息,以便判断何时使用协程最为合适。以下是简要总结。请注意,可以仅使用任务,仅使用协程,或结合两者设计应用程序。然而,任务和协程使用不同的 API 函数,因此不能通过队列(或信号量)将数据从任务传递到协程,反之亦然。
协程实际上仅用于 RAM 限制较大,体积非常小的处理器。
“任务”的特点
简而言之 :使用 RTOS 的实时应用程序可以被构建为一组独立的任务。每个任务在自己的上下文中执行,不依赖于系统内的其他任务或 RTOS 调度器本身。在任何时间点,应用程序中只能执行一个任务,实时 RTOS 调度器负责决定所要执行的任务。因此, RTOS 调度器可以在应用程序执行时重复启停每个任务(将任务调入或调出)。由于任务不了解 RTOS 调度器活动,因此实时 RTOS 调度器负责确保任务调入时的处理器上下文(寄存器值、堆栈内容等)与任务调出时的处理器上下文完全相同。为实现这一点,每个任务都分配有自己的堆栈。当任务调出时,执行上下文被保存到该任务的堆栈中,以便以后再调入相同的任务时可以准确地恢复其执行上下文。请参阅 FreeRTOS 的工作原理部分,以获取更多信息。
任务总结
 |
操作简单。 |
 |
没有使用限制。 |
 |
支持完全抢占式机制。 |
 |
完全按优先顺序排列。 |
 |
每个任务都保留自己的堆栈,从而提高 RAM 使用率。 |
 |
如果使用抢占式机制,则必须谨慎考虑重入问题。 |
“协程”的特点
注意:协程是为了在非常小的设备上使用而实现的,但现在很少在领域中使用。因此尽管没有计划从代码中删除协程,但也没有计划进一步开发这些协程。
协程在概念上类似于任务,但有以下根本差异(详述在协程文档页面):
- 堆栈使用
应用程序中的所有协程共用一个堆栈。与使用任务编写的类似应用程序相比,这大大降低了所需的 RAM。
- 调度和优先级
协程间使用优先级协同调度,但可以包含在使用抢占式任务的应用程序中。
- 宏实现
协程是通过一组宏实现的。
- 使用限制
减少 RAM 使用是以一些严格限制协程构造为代价的。
协程总结
 |
协程间共享堆栈会降低 RAM 使用。 |
 |
协作操作减少了重入问题。 |
 |
可以在不同架构间移植。 |
 |
相对于其他协程完全优先,但如果混用协程和任务,那么总是会被任务抢占。 |
 |
需要特别考虑堆栈不足的问题。 |
 |
对 API 调用位置有限制。 |
 |
只在协程间进行协作操作。 |
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.