1

背景

我正在将micropython集成到我的自定义协作多任务操作系统中(不,我的公司不会更改为抢占式)

Micropython 使用垃圾收集,这比我分配的时间片花费更多的时间,即使没有什么可收集的,即我连续两次调用它,计时它仍然需要很多时间。

明显的解决方案

是的,我可以重构 micropython 源代码,但只要有变化。. .

理想的解决方案

理想的解决方案是调用一些void pause(&func_in_call_stack)会跳出的函数,使堆栈保持完整,一直到调用堆栈顶部的函数,比如main. 并且resume会。. . 恢复。

问题

是否有可能使用 C 和汇编来实现pause

更新

在我写这篇文章时,我意识到基于 C 的异常处理代码nlr_push()/nlr_pop()已经完成了我需要的大部分工作。

4

1 回答 1

1

您的问题是关于实现上下文切换。正如我们在评论中相当详尽地介绍的那样,对上下文切换的支持是任何多任务系统的关键特征之一,尤其是多任务操作系统。既然您假定操作系统不支持上下文切换,那么您就是在谈论为单任务操作系统实现多任务处理。

您将操作系统描述为提供某种任务队列(“为了放弃控制,线程必须简单地退出其运行循环”)并没有改变这一点,尽管在某种程度上我们可以将其视为语义问题。我想这样一个系统的典型任务将通过创建和执行一系列微任务(“运行循环”的工作)来运行,为每个微任务提供一个共享的、可变的内存上下文。这样的运行循环可以安全地退出,然后再重新进入,从中断的地方继续生成微任务。

在肯定的应用程序操作(即您的)定义的边界上将任务划分为微任务pause()将取决于 ISO C 提供的能力之外的能力。然而,很可能可以借助一些程序集以及某种框架支持来完成。你至少需要这些东西:

  • 一种记录任务当前执行上下文的机制——堆栈、寄存器内容,也许还有其他细节。这本质上是特定于系统的。
  • 一个与任务相关的地方,用于存储记录的执行上下文。有多种方式可以建立这样的事情。有希望的替代方案包括 (i) 由操作系统提供;(ii) 由运行在操作系统之上的某种用户态多任务系统提供;(iii) 由编译器内置到任务中。
  • 恢复记录的执行上下文的机制——这也是系统特定的。

如果操作系统不提供此类功能,那么您可以将(现已删除的)POSIX 上下文系统视为用于记录和恢复执行上下文的模型接口。(请参阅makecontext()swapcontext()getcontext()setcontext()。)但是,您需要自己实现这些,并且您可能希望包装它们以向应用程序提供更简单的接口。细节将高度依赖于硬件和底层操作系统。

作为替代方案,您可以通过提供编译器来实现对此类系统的透明多任务支持,这些编译器发出经过特殊检测的代码(即,甚至比您需要的更特殊的检测)。例如,考虑为您自己设计的 VM 生成字节码的编译器。运行结果程序的虚拟机自然会跟踪程序在其中运行的状态,并且可以在一定数量的操作码的每个序列之后产生。

于 2017-10-27T16:12:58.923 回答