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 ייקשר.
- 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 יכול להיות נתיב לתמונת קושחה, ובמקרה זה הקושחה נטענת מקובץ אל זיכרון היעד שלה, או כתובת נקודת כניסה, ובמקרה זה הקושחה כבר חייבת להיות טעונה בכתובת הנתונה.