Circuit Python 的多任务

Adafruit CircuitPython相关
MicroPython重要分支
回复
头像
shaoziyang
帖子: 2381
注册时间: 2019年 10月 21日 13:48

Circuit Python 的多任务

#1

帖子 shaoziyang » 2021年 11月 24日 12:07

为什么不支持抢占式硬件中断(irq)?

我们研究了MicroPython如何支持硬件中断,并决定施加的限制使其更难使用并且更容易出错,而不是提供更好,更完整的体验。抢占式中断可以随时进入,这在解释型语言中很难控制。在MicroPython中,内存不能在中断处理程序中分配,Python做了很多分配内存的事情。而且由于存在垃圾回收器,因此不能保证中断延迟。

相反,我们认为+跟踪GPIO变化/下降/上升的"后台任务"可用于捕获中断,以便在我们准备处理它们时捕获它们。我们有两个本机模块和 ,可以在后台跟踪引脚状态更改。

此外,我们真的非常非常希望将CircuitPython代码保留为CPython代码的真正子集,以便示例可以在Feather M4或CircuitPlaygrounds以及Raspberry Pi和台式Python计算机等板上运行。

为什么不支持线程?

Python开发人员已经涉足了线程,并很快确定它们不是拥有可以与共享内存协同工作的多个任务的好方法。我们相信,这是一种更好的方法,可以安全地共享相同的内存空间的并发任务 - 而不必学习和调试并发进程,这是众所周知的困难,以至于CS学生必须参加一门关于如何安全地完成的课程(或者至少,如果他们不这样做,他们应该这样做!)。

绝大多数受支持的微控制器都有一个单核,而那些具有双核的微控制器(如乐鑫芯片组)可能会受益于将某些后台任务(如 WiFi 处理)固定到单独的内核,而不是尝试手动平衡处理。


协作式多任务处理

协作式多任务处理是一种编程风格,其中多个任务轮流运行。每个任务都会运行,直到它需要等待某些东西,或者直到它决定它已经运行了足够长的时间并且应该让另一个任务运行。

 由每个任务决定何时将控制权交给其他任务,这就是为什么它是合作的。如果一个任务的行为不好,它可能会冻结其他任务。这与先发制人的多任务处理形成鲜明对比,在多任务处理中,任务在不知情的情况下被中断,让其他任务运行。线程和进程是抢占式多任务处理的示例。

 协作式多任务处理并不意味着并行性,其中两个任务实际上是同时运行的。这些任务同时运行。他们的处决是交错的:一次可以有多个活动。

 在协作式多任务处理中,调度程序管理任务。一次只运行一个任务。当任务放弃控制权并开始等待时,计划程序将启动另一个准备运行的任务。调度程序是公平的,并为所有准备好的任务提供了运行的机会。计划程序运行一个事件循环,该循环对分配给事件循环的所有任务一遍又一遍地重复此过程。您已经熟悉事件循环,但您可能不知道该术语。作为几乎所有CircuitPython程序主要部分的循环通常用作事件循环,监视按钮按下,或者只是按计划定期运行一些代码。例程是每个Arduino程序的必需部分,也意味着用作事件循环。任务可以等待睡眠期、网络或文件 I/O 操作、超时的完成。它还可以等待某些外部异步事件,例如引脚更改状态。

下图显示了运行事件循环的计划程序,其中包含三个任务:任务 1 正在运行,任务 2 已准备好运行,正在等待任务 1 放弃控制,任务 3 正在等待其他任务,但尚未准备好运行。


图片



完整指南

https://learn.adafruit.com/cooperative- ... cuitpython
 
 
 
 
 
 
 
 
 
 
 
 

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章