sunsili 发表于 2022-2-25 20:51:06

FreeRTOS任务和协同程序 Tasks and Co-routines

本帖最后由 sunsili 于 2022-2-25 20:53 编辑

FreeRTOS任务和协同程序
Tasks and Co-routines


[入门]

有关基本多任务处理概念的介绍,请参阅FreeRTOS 的工作原理部分。Tasks和Co-Routine文档页面提供了信息,以允许判断何时使用协同程序可能合适,也可能不合适。下面是一个简短的总结。请注意,可以仅使用任务、协程或两者的混合来设计应用程序 - 但是任务和协程使用不同的 API 函数,因此不能使用队列(或信号量)将数据从任务传递到协程,反之亦然。协程实际上只适用于具有严格 RAM 限制的非常小的处理器。

“任务”的特征
简单来说:使用 RTOS 的实时应用程序可以构造为一组独立的任务。每个任务都在自己的上下文中执行,不会偶然依赖系统内的其他任务或 RTOS 调度程序本身。应用程序中只有一个任务可以在任何时间点执行,实时 RTOS 调度程序负责决定这应该是哪个任务。因此,RTOS 调度程序可能会在应用程序执行时重复启动和停止每个任务(将每个任务换入和换出)。由于任务不知道 RTOS 调度程序的活动,因此实时 RTOS 调度程序有责任确保交换任务时的处理器上下文(寄存器值、堆栈内容等)与同一任务时完全相同被换掉了。为了实现这一点,每个任务都提供了自己的堆栈。FreeRTOS 的工作原理部分了解更多信息。任务摘要
简单的。
没有使用限制。
支持完全抢占。
完全优先。
每个任务都维护自己的堆栈,从而导致更高的 RAM 使用率。
如果使用抢占,必须仔细考虑重入。

“协同程序”的特征注意:协同程序是为在非常小的设备上使用而实现的,但现在很少在现场使用。出于这个原因,虽然没有从代码中删除协程的计划,但也没有进一步开发它们的计划。协同程序在概念上与任务相似,但有以下根本区别(在协同程序文档页面上进一步阐述):
[*]堆栈使用应用程序中的所有协同程序共享一个堆栈。与使用任务编写的类似应用程序相比,这大大减少了所需的 RAM 量。
[*]调度和优先级协程相对于其他协程使用优先协作调度,但可以包含在使用抢占式任务的应用程序中。
[*]宏实现协程实现是通过一组宏提供的。
[*]使用限制RAM 使用量的减少是以对协同例程的结构方式的一些严格限制为代价的。
协同程序总结
在协同例程之间共享堆栈会导致 RAM 使用率低得多。
合作经营使重入不再是一个问题。
跨架构非常便携。
相对于其他协同程序具有完全优先级,但如果两者混合,则总是可以被任务抢占。
缺少堆栈需要特别考虑。
可以进行 API 调用的限制。
仅在协程本身之间进行协作操作。

页: [1]
查看完整版本: FreeRTOS任务和协同程序 Tasks and Co-routines