تسلسل إعادة التعيين والإقلاع¶
يتبع الجهاز الذي يشغّل MicroPython تسلسل إقلاع محدد لبدء التشغيل وتهيئة نفسه بعد إعادة التعيين.
ملاحظة
إن التسلسل _boot.py ← boot.py ← main.py ← REPL الموصوف أدناه هو ما يشغّله البرنامج الثابت في كل إعادة تعيين، بغض النظر عن كيفية اتصالك — لذا فهو ينطبق دائمًا. عندما تشغّل برنامجًا نصيًا من OpenMV IDE، فإن الـ IDE يقاطع الـ main.py الجاري تشغيله ويشغّل البرنامج النصي المفتوح في المحرر بدلاً منه، عبر بروتوكول التنقيح الخاص به. وهو لا يستخدم الـ REPL الموجود على الجهاز، لذا فإن المراجع الخاصة بـ REPL في هذه الصفحة (الموجّه التفاعلي، و Ctrl-D / Ctrl-C في طرفية تسلسلية، وما إلى ذلك) تنطبق على التشغيل المستقل وجلسات الطرفية التسلسلية المباشرة — لكن تسلسل الإقلاع نفسه ينطبق في جميع الحالات.
إعادة التعيين الصلبة¶
يحدث الإقلاع من إعادة تعيين صلبة عند تشغيل اللوحة لأول مرة، أي الإقلاع البارد. وهذا إعادة تعيين كاملة لعتاد الـ MCU.
يهيئ رمز منفذ MicroPython جميع العتاد الأساسي (بما في ذلك الساعات المضمّنة ومنظمات الطاقة، وواجهة UART التسلسلية الداخلية، وما إلى ذلك)، ثم يبدأ بيئة MicroPython. قد يُحتفظ بإعدادات RTC الموجودة بعد إعادة التعيين الصلبة، لكن يُمسح كل حالة العتاد الأخرى.
يمكن تشغيل تسلسل إقلاع إعادة التعيين الصلبة نفسه بواسطة عدد من الأحداث مثل:
تنفيذ رمز Python للدالة
machine.reset().ضغط المستخدم على زر إعادة تعيين مادي على اللوحة (حيثما ينطبق).
الاستيقاظ من السبات العميق (في معظم المنافذ).
إعادة تعيين مراقب العتاد (watchdog) في الـ MCU.
كاشف انخفاض الجهد (brown out) في عتاد الـ MCU.
تعتمد تفاصيل مُشغّلات إعادة التعيين الخاصة بالعتاد على المنفذ والعتاد المرتبط به. يمكن استخدام الدالة machine.reset_cause() لتحديد سبب إعادة التعيين بمزيد من التفصيل.
إعادة التعيين الناعمة¶
عندما يكون MicroPython قيد التشغيل بالفعل، يمكن تشغيل إعادة تعيين ناعمة عبر كتابة Ctrl-D في الـ REPL أو تنفيذ machine.soft_reset().
تمسح إعادة التعيين الناعمة مفسّر Python، وتحرر كل ذاكرة Python، وتبدأ بيئة MicroPython من جديد.
تشمل الحالة التي تُمسح بواسطة إعادة التعيين الناعمة:
جميع متغيرات Python والكائنات والوحدات المستوردة وما إلى ذلك.
معظم الطرفيات المهيأة باستخدام وحدة machine. هناك استثناءات محدودة جدًا، فعلى سبيل المثال أوضاع machine.Pin (أي ما إذا كان الدبوس مدخلًا أو مخرجًا، عاليًا أو منخفضًا) لا تُعاد تعيينها في معظم المنافذ. أما الإعدادات الأكثر تقدمًا مثل
Pin.irq()فتُعاد تعيينها دائمًا.Bluetooth.
مقابس الشبكة. تُغلق مقابس TCP المفتوحة بشكل سليم فيما يتعلق بالطرف الآخر.
الملفات المفتوحة. يُترك نظام الملفات في حالة صحيحة.
تبقى بعض حالات النظام كما هي بعد إعادة التعيين الناعمة، بما في ذلك:
تظل أي اتصالات شبكة موجودة (Ethernet، Wi-Fi، وما إلى ذلك) نشطة في طبقة شبكة IP. وقد يشير الاستعلام عن واجهة الشبكة من الرمز إلى أن واجهة الشبكة لا تزال نشطة بعنوان IP مهيأ، وما إلى ذلك.
يبدو الـ REPL النشط متصلًا قبل إعادة التعيين الناعمة وبعدها، باستثناء بعض الحالات غير المعتادة:
ستستعيد واجهة REPL التسلسلية UART إعداداتها العتادية الافتراضية (معدل الباود، وما إلى ذلك).
عادةً لا تتغير سرعة ساعة المعالج بإعادة التعيين الناعمة.
لا تتغير إعدادات RTC (أي ضبط الوقت الحالي) بإعادة التعيين الناعمة.
تسلسل الإقلاع¶
عندما يُقلع MicroPython بعد إعادة تعيين صلبة أو ناعمة، فإنه يتبع تسلسل الإقلاع هذا بالترتيب:
_boot.py¶
هذا برنامج نصي داخلي مجمّد داخل البرنامج الثابت لـ MicroPython. يوفره MicroPython في العديد من المنافذ للقيام بالتهيئة الأساسية.
على سبيل المثال، في معظم المنافذ سيكتشف _boot.py الإقلاع الأول لجهاز جديد ويهيئ نظام ملفات الفلاش الداخلي جاهزًا للاستخدام.
ما لم تكن تنشئ بنية MicroPython مخصصة أو تضيف منفذًا جديدًا، فمن المرجح أنك لست بحاجة للقلق بشأن _boot.py. ومن الأفضل عدم تغيير محتوياته ما لم تكن تعرف حقًا ما تفعله.
boot.py¶
يمكن نسخ ملف باسم boot.py إلى نظام الملفات الداخلي للوحة باستخدام mpremote.
إذا تم العثور على boot.py فإنه يُنفّذ. يمكنك إضافة رمز في boot.py لإجراء تهيئة مخصصة لمرة واحدة (على سبيل المثال، لتهيئة عتاد اللوحة).
من الممارسات الشائعة تهيئة اتصال شبكة اللوحة في boot.py بحيث يكون متاحًا دائمًا بعد إعادة التعيين للاستخدام مع REPL، و mpremote، وما إلى ذلك.
تحذير
ينبغي أن يخرج boot.py دائمًا وألا يعمل إلى ما لا نهاية.
اعتمادًا على اللوحة، يتأخر بعض تهيئة العتاد حتى بعد خروج boot.py. ويشمل ذلك تهيئة USB على كاميرات OpenMV Cam المبنية على STM32. في هذه اللوحات، قد لا يكون الناتج المطبوع من boot.py مرئيًا على منفذ USB التسلسلي المدمج حتى ينتهي boot.py من العمل.
الغرض من هذه التهيئة المتأخرة هو إتاحة إمكانية التهيئة المسبقة لعتاد معين في boot.py، ثم تشغيله بالإعدادات الصحيحة.
ملاحظة
أحيانًا يكون من الأبسط عدم وجود ملف boot.py ووضع أي رمز تهيئة في أعلى main.py بدلاً من ذلك.
main.py¶
على غرار boot.py، يمكن نسخ ملف باسم main.py إلى نظام الملفات الداخلي للوحة. وإذا تم العثور عليه فإنه يُنفّذ بعد ذلك في عملية بدء التشغيل.
يُستخدم main.py لأي رمز Python تريد تشغيله في كل مرة يبدأ فيها جهازك.
بعض النصائح لاستخدام main.py:
لا يتعين على
main.pyأن يخرج، فلا تتردد في وضع حلقة لا نهائيةwhile Trueفيه.بالنسبة لتطبيقات Python المعقدة، لست بحاجة لوضع كل رمزك في
main.py. يمكن أن يكونmain.pyنقطة دخول بسيطة تستورد تطبيقك وتبدأ التنفيذ:import my_app my_app.main()
يمكن أن يساعد هذا في إبقاء بنية تطبيقك واضحة. كما أنه يسهّل تثبيت تطبيقات متعددة على لوحة والتبديل بينها.
من الممارسات الجيدة عند كتابة تطبيقات قوية تغليف الرمز في
main.pyبمعالج استثناءات لاتخاذ الإجراء المناسب في حال تعطل الرمز. على سبيل المثال:import machine, sys import my_app try: my_app.main() except Exception as e: print("Fatal error in main:") sys.print_exception(e) # Following a normal Exception or main() exiting, reset the board. # Following a non-Exception error such as KeyboardInterrupt (Ctrl-C), # this code will drop to a REPL. Place machine.reset() in a finally # block to always reset, instead. machine.reset()
وإلا فسينتقل MicroPython إلى الـ REPL بعد أي تعطل أو إذا خرج main (انظر أدناه).
أي متغيرات عامة تم تعيينها في
boot.pyستظل معيّنة في السياق العام لـmain.py.لتحسين استخدام الفلاش واستهلاك الذاكرة بالكامل، يمكنك نسخ ملفات
main.mpyو/أوboot.mpyالمجمّعة مسبقًا إلى نظام الملفات، أو حتى تجميدها داخل بنية البرنامج الثابت بدلاً من ذلك.يُتخطى تنفيذ
main.pyعند بدء إعادة تعيين ناعمة من وضع REPL الخام (على سبيل المثال، عندما يتفاعل mpremote أو برنامج آخر مباشرةً مع MicroPython).
المفسّر التفاعلي (REPL)¶
إذا لم يتم العثور على main.py، أو إذا خرج main.py، فسيبدأ وضع المفسّر التفاعلي في MicroPython (المعروف باسم REPL) فورًا.
ملاحظة
حتى لو احتوى main.py على حلقة لا نهائية، فإن كتابة Ctrl-C على منفذ REPL التسلسلي ستُحقن KeyboardInterrupt. وإذا لم يلتقطها أي معالج استثناءات، فسيخرج main.py ويبدأ الـ REPL.
أي متغيرات عامة تم تعيينها في boot.py و main.py ستظل معيّنة في السياق العام لـ REPL.
يستمر الـ REPL في التنفيذ حتى يُشغّل رمز Python إعادة تعيين صلبة أو ناعمة.
التعطيل الناعم (فشل الإقلاع)¶
من النادر لكن من الممكن أن يصبح MicroPython غير مستجيب أثناء بدء التشغيل، وهي حالة تُسمى أحيانًا "التعطيل الناعم" (soft bricked). على سبيل المثال:
إذا علِق تنفيذ
boot.pyولم تتم تهيئة منفذ USB التسلسلي الأصلي أبدًا.إذا أعاد رمز Python تهيئة واجهة REPL، مما يجعلها غير قابلة للوصول.
كن مطمئنًا، الاستعادة ممكنة!
إذا كنت تستخدم OpenMV IDE، فغالبًا ما يكون مجرد الاتصال كافيًا — فالـ IDE يوقف الـ main.py الجاري تشغيله ويتولى الأمر. وإذا تعذّر اتصال الكاميرا تمامًا، فاستخدم إعادة ضبط المصنع أدناه. أما طريقة Ctrl-C الموصوفة لاحقًا فهي مخصصة لجلسات الطرفية التسلسلية المباشرة — فهي تعتمد على الـ REPL الموجود على الجهاز، والذي لا يستخدمه OpenMV IDE.
KeyboardInterrupt¶
في كثير من الحالات، سيؤدي فتح منفذ REPL التسلسلي وكتابة Ctrl-C إلى حقن KeyboardInterrupt وقد يتسبب في خروج البرنامج النصي الجاري تشغيله وبدء REPL. ومن الـ REPL، يمكنك استخدام os.remove() لإزالة ملف Python المسيء:
import os
os.remove('main.py')
للتأكد من الملفات التي لا تزال موجودة في نظام الملفات الداخلي:
import os
os.listdir()
إعادة ضبط المصنع¶
إذا لم تتمكن من الوصول إلى REPL باستخدام الطريقة أعلاه، فإن الخيار المتبقي هو إعادة ضبط المصنع: مسح كامل محتويات نظام ملفات الفلاش الداخلي. وهذا أيضًا هو الحل إذا أصبح نظام الملفات الداخلي تالفًا.
يحتوي OpenMV IDE على عدة طرق مدمجة للقيام بذلك. أولاً، ضع الكاميرا في وضع الاستعادة/محمّل الإقلاع — تختلف الطريقة باختلاف اللوحة، لذا راجع قسم Recovery and debug pins في المرجع السريع للوحتك لمعرفة كيفية الدخول إليه. ثم انقر زر الاتصال في OpenMV IDE واتبع المطالبات لمسح نظام الملفات وإعادة تحميل البرنامج الثابت.
تحذير
إعادة تحميل البرنامج الثابت دون مسح نظام الملفات لن تسترد عادةً من التعطيل الناعم، لأن تحديث البرنامج الثابت العادي يحافظ على محتويات نظام الملفات. تأكد من اختيار خيار المسح عندما يطالبك OpenMV IDE بذلك.
إذا واجهت صعوبة، اطرح سؤالك في منتديات OpenMV.