杂项 - 将协程黑客技术植入 C 语言

主要观点:

  • 团队开发嵌入式软件时使用大量状态机,虽工作正常但理解维护困难,缺乏线性流程,引发对控制流表达方式的思考。
  • 作者在其他语言中使用协程,认为其可解决问题,无需操作系统实现并发。
  • 以 LED 闪烁器为例,展示基于轮询的 C 代码实现状态机,逻辑碎片化难以理解,而使用 FreeRTOS 可使代码更易读。
  • 介绍基于宏的协程实现,通过宏将协程转换为显式状态机,在单线程环境中实现协作式多任务,如button_recorderwait_ms协程。
  • 阐述协程运行的核心运行时系统,包括调度器coro_executor,以及协程的状态、执行和取消等机制,如led_task协程中使用ANY_CALL实现并行等待和取消。
  • 条件变量的实现中,需注意协程取消时的清理操作,防止悬空指针。
  • 最后总结此协程实现是 C 宏、状态机和意志力的结合,虽有趣但不是良好的软件开发方式,建议使用 Rust 实现协程相关功能。

关键信息:

  • 嵌入式软件常用状态机,缺乏线性流程。
  • 协程可实现无需操作系统的并发。
  • 基于宏的协程实现细节及原理。
  • 协程运行时系统的构成及功能。
  • 条件变量实现中的注意事项。
  • 最终建议使用 Rust 而非 C 实现协程。

重要细节:

  • 各种状态机的具体状态定义及功能,如led_blinkerbutton_record等状态机。
  • 协程实现代码中的具体函数和宏的使用,如COROCALL等。
  • 协程运行时系统中各个函数的作用和流程,如coro_executor_enqueue_task等。
  • 条件变量相关函数的实现及清理操作细节,如coro_cond_var_notify等。
  • 整体代码结构和各个部分的相互关系,如不同协程与运行时系统的配合。
阅读 26
0 条评论