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
协同程序在概念上与任务相似 , 但是具有以下基本差异(在协同程序文档页面上有详细说明):
- 堆栈使用应用程序中的所有协同程序共享一个堆栈 。与使用任务编写的应用程序相比 , 这大大减少了所需的RAM数量 。
- 调度和优先级协同例程相对于其他协同例程使用优先的协作调度 , 但是可以包含在使用抢占式任务的应用程序中 。
- 宏实施协同例程的实现是通过一组宏提供的 。
- 使用限制以减少RAM使用为代价 , 对如何构造协同程序有严格限制 。
- 在协同例程之间共享堆栈可降低RAM使用量 。
- 合作操作使重入成为更少问题 。
- 跨体系结构非常方便移植 。
- 相对于其他协同例程 , 它具有完全优先级 , 但是如果两者混合使用 , 则总是可以被任务抢占 。
- 缺少堆栈需要特别考虑 。
- 限制API可调用的地方 。
- 仅在协同例程之间进行协同操作 。
协同例程可以以下列状态之一存在:
- Running当协同例程实际上正在执行时 , 它被称为处于运行状态 。 当前正在使用处理器 。
- Ready就绪的协同例程是那些能够执行(它们未被阻止)但当前未执行的例程 。 协同例程可能处于“就绪”状态 , 因为:
- 另一个具有相同或更高优先级的协同例程已经处于“正在运行”状态 , 或者
- 任务处于“正在运行”状态–仅在应用程序同时使用任务和协同例程的情况下才如此 。
- Blocked如果协同例程当前正在等待临时事件或外部事件 , 则该协同例程被称为处于Blocked状态 。 例如 , 如果协同例程调用crDELAY() , 它将阻塞(置于“阻塞”状态) , 直到延迟时间到期为止–这是一个时间事件 。 阻塞的协同例程不可用于调度 。
文章插图
实施联合例行程序协同例程应具有以下结构:
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参数作为区分此类协同例程的一种方式 。
推荐阅读
- 程序员为教师妻子开发应用:将iPhone变成文档摄像头
- 飞书文档微信小程序审核被卡?字节跳动副总裁谢欣:希望腾讯停止无理由封杀
- 多家快递暂停发往河北省快件,顺丰表示先暂停三天,京东小程序已无法下单
- 字节跳动高管喊话腾讯,称“飞书文档”小程序审核被卡近两月
- 悔哭!一程序员误把7500个比特币当垃圾扔掉,估算约2.4亿美元
- 苹果改变立场 称macOS实用程序Amphetamine可继续留在Mac应用商店中
- 2.4亿美元打水漂!程序员小哥把7500个比特币当垃圾扔掉 硬盘找不回
- 程序员开发抢茅台脚本:2天就刷榜Github
- 除了 Markdown 编辑器,你还需要会用程序来处理它
- 为什么我喜欢C语言,却非常讨厌C++?一位国外程序员的回答