جهاز المراقبة هو جهاز مصمم لاكتشاف مشاكل الأجهزة وإصلاحها. عادة ، يتم استخدام جهاز توقيت لهذا ، حيث تمنع إعادة التشغيل الدورية إرسال إشارة إلى إعادة التشغيل.
أستخدم الخادم الرئيسي في Gentoo بشكل أساسي لإجراء التجارب ، ومع ذلك ، فإنه يقوم بتشغيل عدد من الخدمات التي يجب أن تكون متاحة ، إذا أمكن ، دون انقطاع. لسوء الحظ ، تؤدي عواقب بعض التجارب إلى ذعر النواة ، وتحميل وحدة المعالجة المركزية بنسبة 100٪ ومشكلات أخرى في أكثر الأوقات غير المناسبة. لذا فقد تطلبت فكرة إضافة الوكالة الدولية منذ فترة طويلة الانتباه ، وتحققت أخيرًا في هذا الجهاز.بعد فحص دقيق لما كان متاحًا وتقييمًا للوقت المتاح ، كان جهاز المراقبة الذي تم تجميعه على أساس Arduino Nano هو الخيار الأفضل. ظهرت قائمة المتطلبات حول نفس:- بدء البرنامج الخفي وإيقافه للعمل مع مؤقت ، أداة نظام تشغيل عادية (OpenRC).
- جهاز مراقبة خاص على الجهاز ، في ATmega ، تحتاج إلى استخدامه.
- سجل الأحداث على الجهاز لإصلاح إعادة التشغيل والمؤقت.
- قم بمزامنة وقت الجهاز مع المضيف لتسجيل الوقت الصحيح في السجل.
- استقبال وعرض حالة الجهاز وإدخالات سجله.
- مسح السجل وإعادة ضبط الجهاز على حالته الأصلية.
وهكذا ، تم العثور على "المجهر" ، وتم تمييز "الظفر" ... يمكنك مطرقة.المعدات
كان أساس الجهاز هو استنساخ الصينية اردوينو نانو ، الذي تم صنعه على أساس شريحة CH340. تتمتع نواة Linux الجديدة (التي تم اختبارها منذ 3.16) ببرنامج تشغيل مناسب ، لذلك يمكن اكتشاف الجهاز بسهولة كمنفذ تسلسلي USB.إعادة تشغيل Arduino غير المرغوب فيها
في كل مرة يتم توصيل الجهاز ، يتم إعادة تشغيل Arduino. السبب هو أن الجهاز يرسل إشارة DTR (Data Terminal Ready) ، مما يؤدي إلى إعادة تشغيل الجهاز. وبالتالي ، فإن Arduino IDE يضع الجهاز في وضع لتحميل الرسومات.هناك العديد من الخيارات لحل المشكلة ، ولكن تبين أن واحدًا فقط يعمل - من الضروري تثبيت إلكتروليت 10rolF (C1 في الرسم البياني أدناه) بين جهات اتصال RST و GND. لسوء الحظ ، يؤدي هذا أيضًا إلى حظر تنزيل الرسومات على الجهاز.نتيجة لذلك - المخطط على النحو التالي:
رسم باستخدام KiCadتفسيرات للمخطط- R1 — , PC817: (5V — 1.2V / 0.02A) = 190Ω, 180Ω.
- U2 — Arduino PC. , ( USB ), .
- JP1 — , . .
- 1 — , DTR.
- MB_RST, MB_GND — RESET , RST (GND). , .
- BTN_RST, BTN_GND — , , , , .
حلقة التمهيد (إعادة التشغيل الدوري) عند العمل مع WDT
تحتوي المتحكمات الدقيقة ATmega على آلية إعادة تعيين مضمنة في WDT (WatchDog Timer). ومع ذلك ، أدت جميع محاولات استخدام هذه الوظيفة إلى حلقة تمهيد ، والتي لا يمكن الخروج منها إلا عن طريق فصل الطاقة.لم تكشف عمليات البحث الطويلة أن برامج تحميل معظم مستنسخات Arduino لا تدعم WDT. لحسن الحظ ، تم حل هذه المشكلة في أداة تحميل التشغيل البديلة Optiboot .من أجل وميض محمل الإقلاع ، تحتاج إلى مبرمج يمكنه العمل على بروتوكول SPI ، ومن المستحسن أيضًا أن يعرف Arduino IDE هذا الجهاز "شخصيًا". في هذه الحالة ، يعتبر Arduino آخر مثاليًا.إذا أخذنا Arduino UNO ، كمبرمج ، وأحدث إصدار من Arduino IDE v1.6.5 ، فستكون الخوارزمية كما يلي:- boards-1.6.txt optiboot hardware/arduino/avr/boards.txt Arduino IDE.
- Arduino Uno, File → Examples → ArduinoISP.
- Arduino Nano :
Arduino Uno () | Arduino Nano (ICSP ) |
---|
5V → Vcc | GND → GND | D11 → MOSI | D12 → MISO | D13 → SCK | D10 → Reset |
| Pin1 (MISO) ← D12 | Pin2 (Vcc) ← 5V | Pin3 (SCK) ← D13 | Pin4 (MOSI) ← D11 | Pin5 (Reset) ← D10 | Pin6 (GND) ← GND |
|
- في Arduino IDE ، في قائمة Tools ، اضبط الإعدادات كما في لقطة الشاشة:

- حدد عنصر القائمة أدوات → Burn Bootloader وتأكد من اكتمال العملية بدون أخطاء.
بعد هذا الإجراء، تحتاج إلى تحميل الرسومات إلى اردوينو نانو عن طريق اختيار الإعدادات نفسها - المجلس : Optiboot على 32 وحدات المعالجة المركزية دبوس، المعالج : ATMEGA328P، CPU سرعة : 16MHz.لحام
بعد ذلك ، تحتاج إلى لحام كل شيء ، بحيث يبدو كقطعة واحدة.
هنا كنت بحاجة إلى قابس USB نظرًا لوجود اللوحة الأم mini-ITX مع موصل واحد فقط لزوج من USB2.0 ، وهو مطلوب على اللوحة الأمامية ، ولم يكن هناك شيء للاتصال بلوحة USB3.0. إذا أمكن ، يجب توصيل هذه الأجهزة مباشرة باللوحة الأم حتى لا تلتصق الأسلاك.لا يسبب اللحام ، كقاعدة عامة ، مشاكل ، ولكن في هذه الحالة يتم استخدام لوحة توصيل ، وهذا له تفاصيله الخاصة.كيفية لحام المسارات على لوحة توصيل( , ). .
:

النتيجة:
قد يبدو أن بعض جهات الاتصال ملحومة بشكل سيء ، ولكن هذا مجرد تدفق. استهلاك اللحام على لوحة الخبز كبير جدًا ، لذلك يتم تغطية كل ما هو ممكن بالتدفق هنا. في الواقع ، هذا مثال جيد على كيفية عدم الحاجة إلى ترك المنتج بعد اللحام. يجب غسل التدفق ، وإلا فقد تكون هناك مشاكل في تآكل المركبات. سأضيف وأغسل ... هذا أفضل:
جزء البرنامج
من الناحية الموضوعية ، فإن رمز هذا المشروع ليس ذا أهمية خاصة. إن المقدمات التمهيدية بعيدة كل البعد عن التطرف ، ويتم وصف الهندسة المعمارية في عبارة واحدة: إرسال أمر - انتظر الإجابة. من أجل النظام ، سأصف الوظيفة الرئيسية هنا وسأطرح بإيجاز النقاط الأكثر إثارة للاهتمام ، من وجهة نظري.يتم نشر جميع التعليمات البرمجية على GitHub ، لذلك إذا كنت على دراية بـ Bash و C / C ++ (في سياق رسومات Arduino) ، فيمكن الانتهاء من القراءة في هذه المرحلة. إذا كنت مهتمًا ، يمكن العثور على النتيجة النهائية هنا .اتصال الوكالة الدولية للطاقة
عند توصيل جهاز المراقبة ، يتم إنشاء ملف جهاز يحتوي على الرقم التسلسلي. إذا كان النظام يحتوي على أجهزة ttyUSB أخرى (في حالتي ، مودم) ، فهناك مشكلة في الترقيم. لتعريف الجهاز بشكل فريد ، تحتاج إلى إنشاء ارتباط رمزي باسم فريد. لهذا ، تم تصميم udev ، والذي ربما يكون موجودًا بالفعل في النظام.تحتاج أولاً إلى العثور على الوكالة المتصلة بصريًا ، على سبيل المثال ، من خلال النظر إلى ملف سجل النظام. ثم ، باستبدال / dev / ttyUSB0 بالجهاز المطلوب ، اكتب في النهاية الطرفية:udevadm info -a -p "$(udevadm info -q path -n /dev/ttyUSB0)"
مثال الإخراج looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0/ttyUSB0/tty/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="tty"
...
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0/ttyUSB0':
KERNELS=="ttyUSB0"
SUBSYSTEMS=="usb-serial"
DRIVERS=="ch341-uart"
...
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0':
...
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4':
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{idVendor}=="1a86"
ATTRS{idProduct}=="7523"
ATTRS{product}=="USB2.0-Serial"
...
في هذه الحالة ، ستبدو القاعدة كما يلي:ACTION=="add", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyrst-watchdog"
تحتاج إلى وضعه في ملف منفصل في الدليل /etc/udev/rules.d ، على سبيل المثال 51-ttyrst-watchdog.rules وإخبار udev بإعادة تحميل القواعد:udevadm control --reload-rules
من هذه اللحظة ، عند توصيل الوكالة ، سيتم إنشاء رابط / dev / ttyrst- الوكالة على الجهاز المطلوب ، والذي سيتم استخدامه لاحقًا.نص Bash (ttyrst-watchdog.sh)
يتم الاتصال مع الوكالة الدولية للطاقة بسرعة 9600 بود. يعمل Arduino دون مشاكل مع الأجهزة الطرفية بسرعات عالية ، ولكن أوامر العمل مع النص (القط ، الصدى ، إلخ) تتلقى القمامة وترسلها فقط. من الممكن أن تكون هذه ميزة من نسختي فقط من Arduino Nano.بالنسبة لدورة إعادة تشغيل المؤقت الرئيسية ووظائف سطر الأوامر ، يتم استخدام برنامج نصي واحد. والسبب هو أن كلا المكونين يستخدمان موردًا مشتركًا - ملف الجهاز ، ومن الضروري توفير وصول متزامن إليه.تتكون المزامنة بشكل أساسي من حلقة انتظار:while fuser ${DEVICE} >/dev/null 2>&1; do true; done
والتقاط الجهاز للوقت المطلوب:cat <${DEVICE}
من الواضح أن مثل هذا المخطط يخضع لظروف السباق. يمكنك التعامل مع هذا بطريقة البالغين (على سبيل المثال ، لتنظيم قائمة انتظار الرسائل) ، ولكن في هذه الحالة ، يكفي ضبط المهلات بشكل صحيح لضمان حصولك على النتيجة في وقت مقبول. في الواقع ، يعمل البرنامج النصي بأكمله مع المهلات.يتم تنفيذ الشيطنة (التي تعمل في الخلفية) باستخدام حزمة OpenRC. من المفترض أن هذا البرنامج النصي موجود في الملف /usr/local/bin/ttyrst-watchdog.sh ، وأن نص OpenRC موجود في /etc/init.d/ttyrst-watchdog .عند توقف البرنامج الخفي ، يلزم إلغاء تنشيط جهاز المراقبة بشكل صحيح. للقيام بذلك ، يقوم البرنامج النصي بتعيين معالج الإشارة الذي يتطلب الإكمال:trap deactivate SIGINT SIGTERM
وهنا تظهر مشكلة - لا يمكن لـ OpenRC إيقاف البرنامج الخفي ، أو بالأحرى ، ولكن ليس في كثير من الأحيان.والحقيقة هي أن الأمر kill يرسل إشارة إلى البرنامج النصي ، ويتم تنفيذ برنامج السكون ، الذي يُستخدم لإيقاف البرنامج النصي مؤقتًا ، في عملية أخرى ولا يتلقى الإشارة. ونتيجة لذلك ، لا يتم تشغيل وظيفة إلغاء التنشيط إلا بعد اكتمال النوم ، وهي فترة طويلة جدًا.الحل هو بدء النوم في الخلفية وانتظار اكتمال العملية في البرنامج النصي:sleep ${SLEEP_TIME} & wait $!
الثوابت الأساسية:WATCHDOG_ACTIVE - نعم أو لا ، على التوالي ، إرسال إشارة لإعادة التشغيل عند تشغيل المؤقت أم لا.WATCHDOG_TIMER - الوقت بالثواني التي تم ضبط المؤقت لها.SLEEP_TIME - الوقت بالثواني التي يجب بعدها إعادة تشغيل المؤقت. يجب أن يكون أصغر بكثير من WATCHDOG_TIMER ، ولكن ليس صغيرًا جدًا ، حتى لا يتم إنشاء حمل زائد على النظام والجهاز. في المهلات الحالية ، الحد الأدنى المعقول هو حوالي 5 ثوان.DEFAULT_LOG_LINES - عدد إدخالات سجل الجهاز الأخيرة التي أرجعها أمر السجل الافتراضي.أوامر البرنامج النصي:ابدأ- بدء دورة إعادة تشغيل المؤقت الرئيسية. يمكنك إضافة عمليات تحقق إضافية إلى الدالة is_alive ، على سبيل المثال ، للتحقق من إمكانية الاتصال عبر ssh.الحالة - يعرض حالة الجهاز.إعادة تعيين - إعادة تعيين EEPROM (بيانات السجل) وإعادة تشغيل الجهاز لاستعادة المراقبة إلى حالتها الأصلية.log <عدد الإدخالات> - يعرض العدد المحدد لإدخالات السجل الأخيرة.رسم اردوينو (ttyrst-watchdog.ino)
لتجميع الرسم بنجاح ، تحتاج إلى مكتبة زمنية تابعة لجهة خارجية ، وهي ضرورية لمزامنة الوقت.يتكون الرسم من ملفين. هذا يرجع إلى حقيقة أن Arduino IDE لا يقبل الهياكل (البنية) المعلنة في الملف الرئيسي ، يجب نقلها إلى ملف رأس خارجي. أيضًا ، الكلمة الرئيسية المكتوبة ليست ضرورية للإعلان عن بنية ، ربما تكون ضارة حتى ... بعد التحقق من الخيارات القياسية ، لم أتمكن من العثور على البنية المناسبة. والباقي هو معيار C ++ أكثر أو أقل.تعمل الدالتان wdt_enable و wdt_reset مع المراقبة المدمجة في وحدة التحكم الدقيقة. بعد تهيئة WDT ، فإن الشيء الرئيسي الذي يجب تذكره هو إعادة تعيينه في الحلقة الرئيسية وداخل حلقات جميع العمليات الطويلة.تتم كتابة إدخالات السجل إلى ذاكرة EEPROM غير المتطايرة ، ويمكن تحديد حجمها المتوفر في logrecord.h ، وفي هذه الحالة يكون 1024. السجل مصنوع على شكل حلقة ، والفاصل عبارة عن هيكل بقيم صفرية. الحد الأقصى لعدد الإدخالات لـ 1 KiB EEPROM هو 203.لا يصل سجل حول تحميل الجهاز إلى السجل إلا بعد مزامنة الوقت. يتم تنفيذ التزامن في نفس الوقت الذي يتم فيه إعادة تشغيل المؤقت وقبل تنفيذ أي أمر أثناء تهيئة الجهاز. بطريقة أخرى ، لن يكون من الممكن مقارنة الوقت الصحيح مع هذا الحدث ، والمعلومات الواردة في إعادة تشغيل الجهاز ، بمعزل عن برنامج العمل ، ليست مثيرة للاهتمام للغاية.
هذا كل شيء ، شكرا للمشاهدة!توجد ملفات مصدر المشروع على GitHub