openamp — підтримка стандартної асиметричної багатопроцесорної обробки (AMP)

Модуль openamp забезпечує стандартну інфраструктуру міжпроцесорного зв’язку для MicroPython. Модуль бере на себе всі деталі OpenAMP: налаштування спільної таблиці ресурсів, ініціалізацію vring тощо. Він надає API для роботи з інфраструктурою шини RPMsg через клас Endpoint, а також підтримку управління життєвим циклом процесора (LCM) — завантаження мікропрограми, запуск і зупинку віддаленого ядра — через клас RemoteProc.

Приклад використання:

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 Endpoint. Кінцева точка являє собою двонаправлений канал зв’язку між двома ядрами.

Аргументи:

  • 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 — корисне навантаження повідомлення (будь-який об’єкт, що підтримує протокол буфера, наприклад bytes, bytearray або str).

  • 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).