今天又遇到经典cor... - @有个梨GPT的微博 - 微博


今天又遇到经典coroutine模式。

在timer isr里实现dallas单总线,你怎么写C代码?

当然用状态机是一种方式,尤其是用函数指针当state的更显得高级,但是都不如你先写一个blocking模式的伪码,然后在每一次reschedule定时器后,给下一行加一个标签,把标签的名字也定义在一个enum类型里,把这个enum值赋给一个表示continue位置的变量,然后return退出ISR。

在isr函数入口处switch continue位置,直接goto到指定位置继续运行;最后这个函数里所有的局部变量都拎出来放在外面变成static的,欧了。

如果你认真读过Knuth的taocp第一本,你就会记得他振聋发聩的说过,(stack-based) function是coroutine的一种特例。

++++

如果你把所有的相关static变量塞进一个结构体,作为context传递给isr函数,如果你再把这个isr函数的指针,放在结构体里第一个成员位置,这时这个isr函数,其实它也可以不只用于isr,你也可以把结构体传递给下一次要触发它继续执行的actor,这就是C语言里的continuation passing style,而且你绝对没道理去blame goto语句,自己用不好不要怪Ritchie。\[哈哈\]

如果你看懂了这个帖子,直觉上你就是计算机科学家,你只是可能不知道计算机科学里的符号逻辑而已。

https://weibo.com/1655747731/N13msnojl?pagetype=profilefeed