openamp — מספק תמיכה סטנדרטית ב-Asymmetric Multiprocessing (AMP)

המודול openamp מספק תשתית תקשורת סטנדרטית בין מעבדים עבור MicroPython. המודול מטפל בכל פרטי OpenAMP, כגון הגדרת טבלת המשאבים המשותפת, אתחול vrings וכו«. הוא מספק API לשימוש בתשתית אפיק RPMsg באמצעות המחלקה Endpoint, ומספק תמיכת Life Cycle Management (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

הגדרת פונקציית ה-callback של השירות החדש.

הארגומנט ns_callback הוא פונקציה שתיקרא כאשר המעבד המרוחק מכריז על שירותים חדשים. בנקודה זו המעבד המארח יכול לבחור ליצור את ה-endpoint שהוכרז עליו, אם שירות מסוים זה נתמך, או להתעלם ממנו אם אינו נתמך. אם פונקציה זו אינה מוגדרת, על המעבד המארח לרשום תחילה את ה-endpoint באופן מקומי, והוא ייקשר אוטומטית כאשר הליבה המרוחקת תכריז על השירות.

מחלקת Endpoint

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

בניית Endpoint חדש של RPMsg. endpoint הוא ערוץ תקשורת דו-כיווני בין שתי ליבות.

הארגומנטים הם:

  • name הוא שם ה-endpoint.

  • callback היא פונקציה הנקראת כאשר ה-endpoint מקבל נתונים, עם כתובת המקור של הנקודה המרוחקת והנתונים כבתים המועברים בהפניה (by reference).

  • src הוא כתובת המקור של ה-endpoint. אם לא סופקה כתובת, הספרייה תקצה אחת ל-endpoint.

  • dest הוא כתובת היעד של ה-endpoint. אם ה-endpoint נוצר מ-new_service_callback, יש לספק זאת והיא חייבת להתאים לכתובת המקור של ה-endpoint המרוחק. אם ה-endpoint נרשם באופן מקומי, לפני ההכרזה, כתובת היעד תוקצה על ידי הספרייה כאשר ה-endpoint ייקשר.

deinit() None

השמדת ה-endpoint ושחרור כל משאביו.

is_ready() bool

מחזירה True אם ה-endpoint מוכן לשליחה (כלומר, יש לו גם כתובת מקור וגם כתובת יעד)

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

שליחת הודעה למעבד המרוחק דרך endpoint זה.

הארגומנטים הם:

  • buffer הוא תוכן ההודעה (כל אובייקט התומך בפרוטוקול ה-buffer, למשל bytes, bytearray או str).

  • src הוא כתובת המקור של ה-endpoint של ההודעה. אם לא סופקה, נעשה שימוש בכתובת המקור שאליה ה-endpoint קשור.

  • dest הוא כתובת היעד של ה-endpoint של ההודעה. אם לא סופקה, נעשה שימוש בכתובת היעד שאליה ה-endpoint קשור.

  • timeout מציין את הזמן באלפיות שנייה להמתנה לחוצץ (buffer) פנוי. כברירת מחדל הפונקציה חוסמת.

מחלקת 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 נאסף).