FreeRTOS——协同程序(Co-routine)

官网资料
Co-routinesFrom this page:

  • Co-routine States
  • Co-routine Priorities
  • Implementing a Co-routine
  • Scheduling Co-routines With Tasks
  • Limitations and Restrictions
  • Quick Co-routine Example
  • Standard Demo Examples
协同程序的特征注意:协例程已实现在非常小的设备上使用 , 但如今在现场很少使用 。因此 , 虽然没有计划从代码中删除协同程序 , 但也没有计划进一步开发它们 。
协同程序在概念上与任务相似 , 但是具有以下基本差异(在协同程序文档页面上有详细说明):
  1. 堆栈使用应用程序中的所有协同程序共享一个堆栈 。与使用任务编写的应用程序相比 , 这大大减少了所需的RAM数量 。
  2. 调度和优先级协同例程相对于其他协同例程使用优先的协作调度 , 但是可以包含在使用抢占式任务的应用程序中 。
  3. 宏实施协同例程的实现是通过一组宏提供的 。
  4. 使用限制以减少RAM使用为代价 , 对如何构造协同程序有严格限制 。
常规程序摘要
  • 在协同例程之间共享堆栈可降低RAM使用量 。
  • 合作操作使重入成为更少问题 。
  • 跨体系结构非常方便移植 。
  • 相对于其他协同例程 , 它具有完全优先级 , 但是如果两者混合使用 , 则总是可以被任务抢占 。
  • 缺少堆栈需要特别考虑 。
  • 限制API可调用的地方 。
  • 仅在协同例程之间进行协同操作 。
协同程序状态协同例程仅适用于具有严格RAM限制的超小型处理器 , 通常不用于32位微控制器 。
协同例程可以以下列状态之一存在:
  • Running当协同例程实际上正在执行时 , 它被称为处于运行状态 。 当前正在使用处理器 。
  • Ready就绪的协同例程是那些能够执行(它们未被阻止)但当前未执行的例程 。 协同例程可能处于“就绪”状态 , 因为:
  • 另一个具有相同或更高优先级的协同例程已经处于“正在运行”状态 , 或者
  • 任务处于“正在运行”状态–仅在应用程序同时使用任务和协同例程的情况下才如此 。
  • Blocked如果协同例程当前正在等待临时事件或外部事件 , 则该协同例程被称为处于Blocked状态 。 例如 , 如果协同例程调用crDELAY() , 它将阻塞(置于“阻塞”状态) , 直到延迟时间到期为止–这是一个时间事件 。 阻塞的协同例程不可用于调度 。
当前没有与“任务已暂停”状态等效的协同例程 。
FreeRTOS——协同程序(Co-routine)文章插图
实施联合例行程序协同例程应具有以下结构:
void vACoRoutineFunction( CoRoutineHandle_t xHandle,UBaseType_t uxIndex ){crSTART( xHandle );for( ;; ){-- Co-routine application code here. --}crEND();}crCOROUTINE_CODE类型定义为一个函数 , 该函数返回void并以CoRoutineHandle_t和索引作为其参数 。实现协同例程的所有函数都应该是这种类型(上面已演示) 。
通过调用xCoRoutineCreate()创建协同例程 。
注意事项:
  • 所有协同例程函数必须以对crSTART()的调用开始 。
  • 所有协同例程函数必须以对crEND()的调用结尾 。
  • 协例程函数永远不应该返回 , 因此通常实现为连续循环 。
  • 可以从一个共同例程函数创建许多共同例程 。提供uxIndex参数作为区分此类协同例程的一种方式 。
协同程序优先级每个协同例程的优先级分配为0到(configMAX_CO_ROUTINE_PRIORITIES – 1) 。configMAX_CO_ROUTINE_PRIORITIES是在FreeRTOSConfig.h中定义的 , 可以在每个应用程序的基础上进行设置 。