micropython – 访问和控制 MicroPython 内部结构

警告

虽然这个基于 MicroPython 的库可能可用于某些 CircuitPython 版本,但它不受支持,并且其功能在未来可能会发生重大变化。随着 CircuitPython 的不断发展,它可能会更改以更紧密地符合相应的标准 Python 库。如果您依赖它当前提供的任何非标准功能,您以后可能需要更改您的代码。

职能

micropython.const(expr)

用于声明表达式是一个常量,以便编译器可以优化它。这个函数的使用应该是这样的:

from micropython import const

CONST_X = const(123)
CONST_Y = const(2 * CONST_X + 1)

以这种方式声明的常量仍然可以作为全局变量从它们声明的模块外部访问。 另一方面,如果一个常量以下划线开头,那么它是隐藏的,它不能作为全局变量使用,并且不会占用执行期间的任何内存。

const函数由 MicroPython 解析器直接识别,并作为micropython 模块的一部分提供,主要是为了可以按照上述模式编写在 CPython 和 MicroPython 下运行的脚本。

micropython.opt_level([level])

如果水平给出那么这个函数设置脚本,并返回的后续编译优化级别None。否则它返回当前的优化级别。

优化级别控制以下编译功能:

  • 断言:在 0 级断言语句被启用并编译成字节码;不编译级别 1 和更高级别的断言。

  • 内置__debug__ 变量:在级别 0 此变量扩展为TrueFalse.

  • 源代码行号:在第 0、1 和 2 级,源代码行号与字节码一起存储,以便异常可以报告它们发生的行号;不存储级别 3 和更高级别的行号。

默认优化级别通常是级别 0。

micropython.mem_info([verbose])

打印有关当前使用的内存的信息。如果给出详细参数,则打印额外信息。

打印的信息取决于实现,但当前包括使用的堆栈和堆的数量。在详细模式下,它打印出整个堆,指示哪些块被使用,哪些是空闲的。

micropython.qstr_info([verbose])

打印有关当前实习字符串的信息。如果 给出详细参数,则打印额外信息。

打印的信息取决于实现,但目前包括内部字符串的数量和它们使用的 RAM 量。在详细模式下,它会打印出所有 RAM 内嵌字符串的名称。

micropython.stack_use()

返回一个整数,表示当前正在使用的堆栈量。这个的绝对值不是特别有用,而是应该用来计算不同点堆栈使用的差异。

micropython.heap_lock()
micropython.heap_unlock()
micropython.heap_locked()

锁定或解锁堆。当锁定时,不会发生内存分配, MemoryError如果尝试任何堆分配,将引发a 。 heap_locked()如果堆当前被锁定,则返回真值。

这些函数可以嵌套,即 heap_lock() 可以连续调用多次,锁深度会增加,然后heap_unlock()必须调用相同的次数才能使堆再次可用。

二者 heap_unlock()heap_locked() 返回当前锁深度作为非负整数(解锁对于前者之后),其中0意味着堆未锁定。

如果 REPL 在堆被锁定的情况下变为活动状态,那么它将被强制解锁。

注意: heap_locked() 默认情况下在大多数端口上未启用,需要MICROPY_PY_MICROPYTHON_HEAP_LOCKED.

micropython.kbd_intr(chr)

设置将引发KeyboardInterrupt 异常的字符。默认情况下,它在脚本执行期间设置为 3,对应于 Ctrl-C。将 -1 传递给此函数将禁用 Ctrl-C 的捕获,传递 3 将恢复它。

此函数可用于防止在通常用于 REPL 的传入字符流上捕获 Ctrl-C,以防该流用于其他目的。

micropython.schedule(func, arg)

安排函数func “很快”执行。该函数将值arg作为其单个参数传递。“很快”意味着 MicroPython 运行时将尽最大努力尽早执行该函数,因为它也在努力提高效率,并且满足以下条件:

  • 调度函数永远不会抢占另一个调度函数。

  • 调度函数总是在“操作码之间”执行,这意味着所有基本的 Python 操作(例如附加到列表)都保证是原子的。

  • 给定的端口可以定义“关键区域”,在该区域内调度的功能将永远不会执行。函数可以在关键区域内调度,但在退出该区域之前不会执行它们。临界区的一个例子是抢占中断处理程序(IRQ)。

此函数的用途是从抢占 IRQ 安排回调。这样的 IRQ 对在 IRQ 中运行的代码施加了限制(例如,堆可能被锁定)并且调度一个函数稍后调用将解除这些限制。

注意:如果schedule()是从抢占式 IRQ 中调用,当不允许分配内存且要传递给的回调 schedule()是绑定方法时,直接传递 this 将失败。这是因为创建对绑定方法的引用会导致内存分配。一种解决方案是在类构造函数中创建对该方法的引用并将该引用传递给schedule().

有一个有限队列来保存预定的函数,如果队列已满,schedule() 将引发 aRuntimeError