openamp --- 提供标准的非对称多处理(AMP)支持

openamp 模块为 MicroPython 提供了标准的处理器间通信基础设施。该模块处理 OpenAMP 的所有细节,例如设置共享资源表、初始化 vring 等。它通过 Endpoint 类提供了使用 RPMsg 总线基础设施的 API,并通过 RemoteProc 类提供处理器生命周期管理(LCM)支持,例如加载固件以及启动和停止远程核心。

用法示例:

import openamp

def ept_recv_callback(src, data):
    print("Received message on endpoint", data)

# Create a new RPMsg endpoint to communicate with the remote core.
ept = openamp.Endpoint("vuart-channel", callback=ept_recv_callback)

# Create a RemoteProc object, load its firmware and start it.
rproc = openamp.RemoteProc("virtual_uart.elf") # Or entry point address (ex 0x081E0000)
rproc.start()

while True:
    if ept.is_ready():
        ept.send("data")

函数

openamp.new_service_callback(ns_callback: Callable[[str, int], Any]) None

设置新的服务回调。

ns_callback 参数是一个函数,当远程处理器宣告新服务时会被调用。此时主机处理器可以选择创建被宣告的端点(如果支持该特定服务),或者在不支持时忽略它。如果未设置此函数,主机处理器应先在本地注册端点,当远程宣告该服务时端点将被自动绑定。

Endpoint 类

class openamp.Endpoint(name: str, callback: Callable[[int, bytes], Any], src: int = ENDPOINT_ADDR_ANY, dest: int = ENDPOINT_ADDR_ANY)

构造一个新的 RPMsg 端点。端点是两个核心之间的双向通信通道。

参数为:

  • name 是端点的名称。

  • callback 是一个函数,当端点接收到数据时会被调用,并传入远程点的源地址,以及以引用方式传递的字节数据。

  • src 是端点的源地址。如果未提供,库将为该端点分配一个。

  • dest 是端点的目标地址。如果端点是从 new_service_callback 创建的,则必须提供此地址,且必须与远程端点的源地址匹配。如果端点是在宣告之前在本地注册的,则目标地址将在端点被绑定时由库分配。

deinit() None

销毁端点并释放其所有资源。

is_ready() bool

如果端点已准备好发送(即同时拥有源地址和目标地址),则返回 True。

send(buffer: bytes, *, src: int = -1, dest: int = -1, timeout: int = -1) int

通过此端点向远程处理器发送一条消息。

参数为:

  • buffer 是消息负载(任何支持缓冲区协议的对象,例如 bytesbytearraystr)。

  • src 是消息的源端点地址。如果未提供,则使用端点所绑定的源地址。

  • dest 是消息的目标端点地址。如果未提供,则使用端点所绑定的目标地址。

  • timeout 指定等待空闲缓冲区的时间(以毫秒为单位)。默认情况下该函数是阻塞的。

RemoteProc 类

警告

在 STM32H7 上,第二个 AMP 核心是一个无法原地停止后重启的 Cortex-M4。因此在该平台上调用 RemoteProc.stop()RemoteProc.shutdown() 会执行一次完整的系统复位,而不是单核心停止。

class openamp.RemoteProc(entry: str | int)

RemoteProc 对象提供处理器生命周期管理(LCM)支持,例如加载固件、启动和停止远程核心。

entry 参数可以是固件镜像的路径,此时固件会从文件加载到其目标内存中;也可以是一个入口点地址,此时固件必须已经加载在给定地址处。

start() None

启动远程处理器。

stop() None

停止远程处理器。具体行为取决于平台。

shutdown() None

Shutdown 停止远程处理器并释放其所有资源。具体行为取决于平台,但通常会禁用远程核心的电源和时钟。此函数也用作终结器(即在 RemoteProc 对象被回收时调用)。