openamp — предоставляет стандартную поддержку асимметричной многопроцессорной обработки (AMP)

Модуль openamp предоставляет стандартную инфраструктуру межпроцессорной связи для MicroPython. Модуль берёт на себя все детали OpenAMP, такие как настройка таблицы общих ресурсов, инициализация vrings и т. д. Он предоставляет 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. Конечная точка — это двунаправленный канал связи между двумя ядрами.

Аргументы:

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