FreeRTOS——协同程序(Co-routine)( 二 )
低优先级数字表示低优先级协程 。
协同例程的优先级仅与其他协同例程有关 。如果您在同一应用程序中混合使用任务和协同例程 , 则任务将始终优先于协同例程 。
调度协同例程通过重复调用vCoRoutineSchedule()来调度协同例程 。调用vCoRoutineSchedule()的最佳位置是从空闲任务挂钩中进行 。即使您的应用程序仅使用协同例程 , 也是如此 , 因为在启动调度程序时仍将自动创建空闲任务 。请参阅后面的示例 。
混合使用任务和常规程序从空闲任务中调度协同例程可以使任务和协同例程轻松混合在同一应用程序中 。完成此操作后 , 协同例程将仅在没有比执行的空闲任务高的优先级的任务时执行 。请参阅后面的示例 。
局限性与同等任务相比 , 协同例程的RAM使用量较低的好处是 , 对协同例程的使用方式存在一些限制 。协同例程比任务更具限制性和复杂性 。
- 共享堆栈
void vACoRoutineFunction( CoRoutineHandle_t xHandle,UBaseType_t uxIndex ){static char c = 'a';// Co-routines must start with a call to crSTART().crSTART( xHandle );for( ;; ){// If we set c to equal 'b' here ...c = 'b';// ... then make a blocking call ...crDELAY( xHandle, 10 );// ... c will only be guaranteed to still// equal 'b' here if it is declared static// (as it is here).}// Co-routines must end with a call to crEND().crEND();}
共享堆栈的另一个结果是 , 可能导致协同例程阻塞的对API函数的调用只能从协同例程函数本身进行 , 而不能从协同例程调用的函数内部进行 。例如:void vACoRoutineFunction( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ){// Co-routines must start with a call to crSTART().crSTART( xHandle );for( ;; ){// It is fine to make a blocking call here,crDELAY( xHandle, 10 );// but a blocking call cannot be made from within// vACalledFunction().vACalledFunction();}// Co-routines must end with a call to crEND().crEND();}void vACalledFunction( void ){// Cannot make a blocking call here!}
- 使用switch语句
void vACoRoutineFunction( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ){// Co-routines must start with a call to crSTART().crSTART( xHandle );for( ;; ){// It is fine to make a blocking call here,crDELAY( xHandle, 10 );switch( aVariable ){case 1 : // Cannot make a blocking call here!break;default: // Or here!}}// Co-routines must end with a call to crEND().crEND();}
快速例程示例这个简单的示例演示了协同例程的用法 。- 创建一个简单的例程以使LED闪烁以下代码定义了一个非常简单的协同例程 , 该例程不执行任何操作 , 但会定期使LED闪烁 。
void vFlashCoRoutine( CoRoutineHandle_t xHandle,UBaseType_t uxIndex ){// Co-routines must start with a call to crSTART().crSTART( xHandle );for( ;; ){// Delay for a fixed period.crDELAY( xHandle, 10 );// Flash an LED.vParTestToggleLED( 0 );}// Co-routines must end with a call to crEND().crEND();}
- 调度协同例程
- 程序员为教师妻子开发应用:将iPhone变成文档摄像头
- 飞书文档微信小程序审核被卡?字节跳动副总裁谢欣:希望腾讯停止无理由封杀
- 多家快递暂停发往河北省快件,顺丰表示先暂停三天,京东小程序已无法下单
- 字节跳动高管喊话腾讯,称“飞书文档”小程序审核被卡近两月
- 悔哭!一程序员误把7500个比特币当垃圾扔掉,估算约2.4亿美元
- 苹果改变立场 称macOS实用程序Amphetamine可继续留在Mac应用商店中
- 2.4亿美元打水漂!程序员小哥把7500个比特币当垃圾扔掉 硬盘找不回
- 程序员开发抢茅台脚本:2天就刷榜Github
- 除了 Markdown 编辑器,你还需要会用程序来处理它
- 为什么我喜欢C语言,却非常讨厌C++?一位国外程序员的回答