FREERTOS 的协程

协程类似于一个比较特殊的函数,直接可以直接嵌在任务中。

协程于任务的关系

        协程和普通任务在多个方面存在显著的区别,这些区别主要体现在它们的工作原理、执行效率和资源消耗等方面。同时,协程也展现出了其独特的优势。

        首先,从工作原理来看,普通任务通常是基于线程或进程实现的,它们由操作系统进行调度和管理。线程是操作系统调度的单位,而进程则是资源分配的单位。这种调度方式意味着线程或进程之间的切换需要依赖操作系统的介入,这通常会带来一定的开销。而协程则不同,它的切换完全由程序自身控制,不需要操作系统的介入。这使得协程在切换任务时能够减少很多不必要的开销,从而提高执行效率。

        其次,从执行效率来看,协程的优势更为明显。由于协程的切换是由程序自身控制的,因此没有线程切换的开销。这意味着当线程数量越多时,协程的性能优势就越明显。此外,协程还不需要多线程的锁机制,因为只有一个线程,不存在同时写变量的冲突。这使得在协程中控制共享资源变得更加简单高效,只需要判断数据的状态即可,无需加锁。

        最后,从资源消耗来看,协程也具有优势。由于协程是在单个线程中执行的,因此它不会像多线程那样消耗大量的系统资源。这使得协程在资源有限的环境中能够发挥出更好的性能。

        综上所述,协程相比普通任务具有更高的执行效率、更低的资源消耗和更简单的共享资源控制方式。这使得协程在需要高效处理大量并发任务、减少系统开销和提高系统响应速度的场景中具有广泛的应用前景。例如,在嵌入式系统、网络编程、游戏开发等领域,协程都可以发挥出其独特的优势。

协程的调度

  1. 任务调度:RTOS中的任务调度器负责决定哪个任务应当运行。这通常基于任务的优先级、状态以及其他因素。当任务被调度器选中时,它将获得CPU的控制权并执行。

  2. 协程的轻量级特性:协程是轻量级的,它们不像线程那样需要操作系统进行调度。相反,协程的切换是由程序自身控制的,这减少了切换的开销。协程可以在一个任务内部运行,通过主动让出CPU来与其他协程共享执行时间。

  3. 协程的切换:在一个任务中,可以存在多个协程。这些协程通过协作式调度来共享CPU时间。当一个协程执行到某个点(例如等待I/O操作完成)时,它可以主动让出CPU,让同一个任务内的其他协程获得执行机会。这种切换是快速且高效的,因为不需要操作系统的介入。

  4. 并行运行的宏观效果:由于RTOS的调度器可以在多个任务之间快速切换,而每个任务内部又可以有多个协程在协作式调度下运行,这就形成了宏观上的并行运行效果。尽管在物理层面上只有一个CPU在执行,但通过快速的任务和协程切换,系统能够给人一种多个任务和协程同时运行的感觉。

  5. 资源共享与同步:RTOS通常提供了一套机制来管理任务和协程之间的资源共享和同步。这包括信号量、互斥锁、消息队列等机制,以确保在并行运行的环境中数据的一致性和安全性。

         需要注意的是,尽管协程和任务在宏观上表现出并行运行的特性,但在微观层面上,它们仍然是顺序执行的。RTOS通过高效的调度和切换机制,使得这种顺序执行在宏观上看起来像是并行运行。

        总的来说,RTOS通过任务调度和协程的协作式调度,实现了任务和协程在宏观上的并行运行。这种并行运行提高了系统的吞吐量和响应速度,使得RTOS能够处理复杂的实时任务。

协程的特点

        协程在阻塞时会自动让出CPU资源。协程的一个关键特点是它们可以自动让出CPU时间片,以便同线程内的其他协程得以运行。当一个协程遇到阻塞操作(如I/O操作)时,它会主动让出CPU,使得其他协程或任务有机会执行。这种机制有助于提高系统的并发性和响应速度,避免了CPU资源的浪费。

        此外,协程还有其他一些优势,如恢复CPU上下文的能力、轻量级的任务管理机制以及减少线程切换的开销等。这使得协程在需要高效处理大量并发任务、减少系统开销和提高系统响应速度的场景中具有广泛的应用前景。

        需要注意的是,协程的自动让出CPU资源机制是基于其协作式调度的特性实现的。这意味着协程的切换和调度是由程序自身控制的,而不是由操作系统来管理。因此,在使用协程时,需要正确设计和管理协程的切换逻辑,以确保系统的正确性和性能。

        然而,需要注意的是,随着 FreeRTOS 的发展,协程(co-routines)的支持已经在后续版本中被移除或不再推荐使用。因此,这个宏定义可能在你使用的 FreeRTOS 版本中已经不再有效或不存在。

        在早期版本的 FreeRTOS 中,configUSE_CO_ROUTINES 宏如果被设置为 1,那么 FreeRTOS 就会包含协程的相关代码,并允许你在系统中使用协程。如果被设置为 0,则协程相关的代码就不会被包含,从而节省一些内存空间。

        然而,由于协程在现代实时操作系统中并不常用,且其实现可能不如任务(task)调度那样高效和灵活,因此在最新的 FreeRTOS 版本中,协程的支持可能已经被完全移除。因此,如果你正在使用较新版本的 FreeRTOS,并且找不到这个宏定义,那么很可能是因为协程的支持已经不再包含在该版本中。

        在编写基于 FreeRTOS 的应用程序时,你应该使用任务(task)作为主要的并发执行单元,并利用 FreeRTOS 提供的任务调度、同步和通信机制来实现你的应用程序逻辑。如果你需要类似协程的行为,你可能需要通过手动管理任务的执行和挂起状态来模拟这种行为,但这通常比使用真正的协程要复杂得多。

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值