openamp --- يوفّر دعمًا قياسيًا للمعالجة المتعددة غير المتماثلة (AMP)

توفّر الوحدة openamp بنية تحتية قياسية للاتصالات بين المعالجات لـ MicroPython. تتولى الوحدة جميع تفاصيل OpenAMP، مثل إعداد جدول الموارد المشترك، وتهيئة حلقات vrings، وغير ذلك. وهي توفّر واجهة برمجية لاستخدام البنية التحتية لناقل 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 الوقت بالملي ثانية للانتظار من أجل مخزن مؤقت متاح. تكون الدالة حاجبة (blocking) افتراضيًا.

صنف 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 بواسطة كانس المهملات).