openamp --- 提供標準的非對稱多處理(Asymmetric Multiprocessing,AMP)支援

openamp 模組為 MicroPython 提供標準的處理器間通訊基礎架構。此模組處理 OpenAMP 的所有細節,例如設定共用資源表、初始化 vring 等。它透過 Endpoint 類別提供使用 RPMsg 匯流排基礎架構的 API,並透過 RemoteProc 類別提供處理器生命週期管理(Life Cycle Management,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 物件提供處理器生命週期管理(Life Cycle Management,LCM)支援,例如載入韌體、啟動與停止遠端核心。

entry 引數可以是韌體映像檔的路徑,此時韌體會從檔案載入到其目標記憶體;或者是一個進入點位址,此時韌體必須已載入於指定位址。

start() None

啟動遠端處理器。

stop() None

停止遠端處理器。確切行為視平台而定。

shutdown() None

Shutdown 會停止遠端處理器並釋放其所有資源。確切行為視平台而定,但通常會關閉遠端核心的電源與時脈。此函式也作為終結器(finaliser)使用(亦即在 RemoteProc 物件被回收時呼叫)。