openamp — 표준 비대칭 멀티프로세싱(AMP) 지원 제공

openamp 모듈은 MicroPython을 위한 표준 프로세서 간 통신 인프라를 제공합니다. 이 모듈은 공유 리소스 테이블 설정, vring 초기화 등 OpenAMP의 모든 세부 사항을 처리합니다. 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 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 객체가 회수될 때 호출됨).