gpt4 book ai didi

c - 如何在不重构的情况下跳出并在c代码中的任意位置恢复

转载 作者:太空宇宙 更新时间:2023-11-04 03:20:19 24 4
gpt4 key购买 nike

背景

我正在整合 micropython进入我自定义的协作多任务操作系统(不,我的公司不会更改为抢占式)

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

显而易见的解决方案

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

理想的解决方案

理想的解决方案是调用一些函数 void pause(&func_in_call_stack) ,它会跳出,保持堆栈完好无损,一直到调用堆栈顶部的函数,比如说主要。而 resume 会。 . .简历。

问题

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

更新

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

最佳答案

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

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

在由肯定的应用程序操作(您的 pause())定义的边界将任务划分为微任务将取决于 ISO C 提供的能力之外的能力。但是很有可能,它可以在某些程序集的帮助下完成,加上某种框架支持。您至少需要这些东西:

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

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

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

关于c - 如何在不重构的情况下跳出并在c代码中的任意位置恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46962950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com