什么是c ++ 20中的协同程序?
它与"Parallelism2"或/和"Concurrency2"的不同之处(见下图)?
以下图片来自ISOCPP.
环境:C和micropython虚拟机中的协作RTOS是其中的任务之一.
为了使虚拟机不会阻止其它RTOS的任务,我插入RTOS_sleep()的vm.c:DISPATCH(),这样,每次执行字节码后,虚拟机放弃控制到下一个RTOS任务.
我创建了一个uPy接口,使用生产者 - 消费者设计模式从物理数据总线异步获取数据 - 可以是CAN,SPI,以太网.
在uPy中的用法:
can_q = CANbus.queue()
message = can_q.get()
Run Code Online (Sandbox Code Playgroud)
C中的实现can_q.get()不会阻止RTOS:它轮询C队列,如果没有收到消息,它会调用RTOS_sleep()给另一个任务填充队列的机会.事物是同步的,因为C队列仅由另一个RTOS任务更新,而RTOS任务仅在RTOS_sleep()被调用时切换,即协作
C实现基本上是:
// gives chance for c-queue to be filled by other RTOS task
while(c_queue_empty() == true) RTOS_sleep();
return c_queue_get_message();
Run Code Online (Sandbox Code Playgroud)
尽管Python语句can_q.get()不会阻止RTOS,但它会阻止uPy脚本.我想重写它,所以我可以使用async defie coroutine并让它不阻止uPy脚本.
不确定语法,但这样的事情:
can_q = CANbus.queue()
message = await can_q.get()
Run Code Online (Sandbox Code Playgroud)
题
如何编写C函数以便我可以await使用它?
我更喜欢CPython和micropython的答案,但我会接受仅限CPython的答案.