1

我正在将 MicroPython 集成到微控制器中,并且我想为我的产品添加调试逐步执行模式(通过与 PC 的连接)。

值得庆幸的是,MicroPython 包含一个REPL又名Python shell功能:我可以一次输入一行并执行。

我想使用此功能在 PC 端单步执行,并将 Python 脚本中的行一一发送。

除了可能的时间之外,一次运行 Python 脚本与运行 Python 脚本之间是否有任何python my_script.py区别?

4

3 回答 3

2

一次在标准输入上传递一行代码对于适当的调试器来说是完全不可接受的替代方案。

假设您要调试以下内容:

def foo():                            # 1
    for i in range(10):               # 2
        if i == 5:                    # 3
            raise Exception("Argh!")  # 4
                                      # 5
foo()                                 # 6

...在适当的分步调试器中,用户可以像这样使用它:

break 4
run

现在,你打算怎么做?如果您在 REPL 中输入函数,则该函数被定义为一个操作,并且它作为一个操作运行。它不会在第 6 行停止。它不会让您逐行进行。循环也是如此for:一次输入for一行的循环文本不允许您在引发异常之前对其进行单步执行。

如果您消除函数并消除循环(生成代码_something = iter(range(10)); i=_something.next(),也许?),那么您需要模拟作用域的效果。这意味着您的语言与您据称“调试”的语言截然不同。

于 2017-09-29T19:53:28.890 回答
1

我不知道 MicroPython 是否内置了 compile() 和 exec() 。但是当嵌入式 Python 有它们并且当 MCU 有足够的 RAM 时,我会执行以下操作:

  1. 向嵌入式 shell 发送一行以开始使用多行字符串创建变量。

    '_code = """\'

  2. 发送我希望执行的代码(逐行或但是)

  3. 用 """ 关闭多行字符串

  4. 发送 exec 命令以运行存储在 MCU 上的变量中的传输代码并获取输出。

如果您的 RAM 很小并且您不能一次传输整个代码,您应该将其传输到将要执行的块中。比如函数、循环等等。

如果您可以在 PC 上为 MicroPython 编译字节码,那么您应该能够传输它并为执行做好准备。这将使用更少的 RAM。但是能否将原始字节码注入 shell 并运行它取决于 MicroPython 与 CPython 的相似程度。

是的,存在差异。正如另一个答案中解释的那样,逐行执行可能很棘手。所以代码块是你最好的选择。

于 2017-09-29T19:52:22.047 回答
0

有什么区别吗...

是的。

例如,下面的代码在.py文件中工作,但SyntaxError在交互式解释器中是:

x = 1
if x == 1:
    pass
x = 2

还有许多其他差异,但仅此一项就足以让您远离这个想法。

于 2017-09-29T19:29:35.423 回答