主要观点:
- 团队开发嵌入式软件时使用大量状态机,虽工作正常但理解维护困难,缺乏线性流程,引发对控制流表达方式的思考。
- 作者在其他语言中使用协程,认为其可解决问题,无需操作系统实现并发。
- 以 LED 闪烁器为例,展示基于轮询的 C 代码实现状态机,逻辑碎片化难以理解,而使用 FreeRTOS 可使代码更易读。
- 介绍基于宏的协程实现,通过宏将协程转换为显式状态机,在单线程环境中实现协作式多任务,如
button_recorder
和wait_ms
协程。 - 阐述协程运行的核心运行时系统,包括调度器
coro_executor
,以及协程的状态、执行和取消等机制,如led_task
协程中使用ANY_CALL
实现并行等待和取消。 - 条件变量的实现中,需注意协程取消时的清理操作,防止悬空指针。
- 最后总结此协程实现是 C 宏、状态机和意志力的结合,虽有趣但不是良好的软件开发方式,建议使用 Rust 实现协程相关功能。
关键信息:
- 嵌入式软件常用状态机,缺乏线性流程。
- 协程可实现无需操作系统的并发。
- 基于宏的协程实现细节及原理。
- 协程运行时系统的构成及功能。
- 条件变量实现中的注意事项。
- 最终建议使用 Rust 而非 C 实现协程。
重要细节:
- 各种状态机的具体状态定义及功能,如
led_blinker
、button_record
等状态机。 - 协程实现代码中的具体函数和宏的使用,如
CORO
、CALL
等。 - 协程运行时系统中各个函数的作用和流程,如
coro_executor_enqueue_task
等。 - 条件变量相关函数的实现及清理操作细节,如
coro_cond_var_notify
等。 - 整体代码结构和各个部分的相互关系,如不同协程与运行时系统的配合。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。