اجرای پروژه های میکروکنترلری همواره با چالش قابلیت اطمینان همراه بوده و هست. قابلیت اطمینان، کلید واژه ای که در هر پروژه ای، ذهن طراح و مشتری را درگیر می کند. قابلیت اطمینان، انتطاری است که از عملکرد صحیح و مطمئن یک دستگاه داریم. به عنوان مثال در یک پردازنده خودرویی، ECU، سیستم باید همواره و در هر حال به درستی برنامه را اجرا کرده و به قسمت های مختلف خودرو به صورت بلادرنگ، به تبادل داده بپردازد. در این آموزش به چگونگی افزایش قابلیت اطمینان در پروژه های آردوینویی به کمک تایمر Watch Dog می پردازیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی ، دیجی اسپارک همراه باشید.
تایمر WatchDog تعریف و کاربرد
پیش از آنکه وارد بحث تایمر WatchDog شویم، نیاز است تا کمی در رابطه با تایمر ها بدانیم. تایمرها در میکروکنترلرهای AVR، نظیر پردازنده ATMEGA328P که هسته آردوینو است، یکی از ویژگی های کلیدی این پردازنده ها به شمار می روند. تایمر ها در میکروکنترلرهای AVR به صورت موازی با برنامه اصلی، شروع به شمارش کرده و در صورت رسیدن به زمان مد نظر، با ایجاد یک وقفه، برنامه را از اتمام شمارش آگاه خواهند نمود.
در کنار این، تایمر دیگری به نام Watch Dog یا سگ نگهبان وجود دارد. این تایمر زمانی که سر رسید آن فرا برسد، میکروکنترلر را ریست می کند. در این حالت برنامه از ابتدا اجرا خواهد شد. از این قابلیت می توان در کنترل خرابی و جلوگیری از هنگ سیستم در حلقه های تکرار، استفاده نمود.
برای روشن تر شدن موضوع، فرض کنید برنامه وارد یک فرایند زمانبر می شود. در این قسمت برنامه متوقف شده تا نتیجه خروجی تعیین شده و برنامه ادامه یابد. در این هنگام، فرض کنید پاسخی از سمت فرایند ایجاد نشود. در این حالت برنامه در حلقه تکرار برای همیشه خواهد ماند. اما به کمک تایمر واچ داگ یا سگ نگهبان!! می توان زمانی را تعیین کرد. در صورتیکه پاسخی پس از گذشت زمان پاسخی دریافت نشود، برنامه ریست شده و از ابتدا اجرا خواهد شد.
دستورات تایمر WatchDog در آردوینو UNO
جهت استفاده از تایمر سگ نگهبان در آردوینو، باید ابتدا کتابخانه آن را مطابق دستور زیر به برنامه اضافه کنید.
#include <avr/wdt.h>
در ادامه به کمک تابع زیر، برنامه پس از طی زمان تعیین شده در ورودی، ریست شده و از ابتدا اجرا خواهد شد.
wdt_enable
برای تابع فوق، ورودی های زیر معتبر هستند. این ورودی ها به همراه مقدارشان در جدول زیر درج شده اند.
مدت زمان | ورودی |
۱۵ میلی ثانیه | WDTO_15MS |
۳۰ میلی ثانیه | WDTO_30MS |
۶۰میلی ثانیه | WDTO_60MS |
۲۵۰میلی ثانیه | WDTO_250MS |
۵۰۰میلی ثانیه | WDTO_500MS |
۱ثانیه | WDTO_1S |
۲ثانیه | WDTO_2S |
۴ثانیه | WDTO_4S |
۸ثانیه | WDTO_8S |
همچنین به کمک تابع زیر می توان تایمر سگ نگهبان را ریست نمود.
wdt_reset()
در نهایت به کمک تابع زیر می توانید تایمر را متوقف کنید.
wdt_disable()
پس از معرفی تایمر watch dog، نوبت به ارائه یک نمونه برنامه می رسد. در ادامه به این موضوع می پردازیم.
افزایش قابلیت اطمینان با تایمر watchdog
پس از بررسی مفاهیم و توابع پایه، نوبت به اجرای یک نمونه برنامه می رسد. در برنامه زیر، برنامه در یک حلقه تکرار بی نهایت قرار می گیرد. چنانچه ظرف مدت ۴ ثانیه پاسخی از سریال مانیتور دریافت نکند، روال اجرای برنامه از ابتدا آغاز خواهد شد. کد زیر این برنامه را اجرا می کند.
#include <avr/wdt.h> void setup() { Serial.begin(115200); delay(500); Serial.println("Start Program!"); delay(1500); } void loop() { wdt_enable(WDTO_4S); while(Serial.available() ==0 ); wdt_disable(); Serial.println("DATA RECEIVED"); delay(1500); }
در برنامه فوق، زمانیکه طی ۴ ثانیه کاراکتری در سریال ارسال نشود، برد ریست شده و برنامه از ابتدا اجرا می گردد. عبارت Start Program اجرای برنامه از ابتدا و عبارت DATA RECEIVED دریافت داده ها از سریال و ادامه روند برنامه را نمایش می دهد.
ایجاد تاخیر زمانی بیشتر برای تایمر WatchDog
همانطور که در قسمت پیش مشاهده کردید، تایمر وقفه واچ داگ نهایت تا ۸ ثانیه می تواند به شمارش بپردازد. اما گاهی اوقات پروسه ها بسیار زمانبرتر خواهند بود. به عنوان مثال در پروسه های شبکه ای ماژول SIM800L، گاهی ارسال داده ها به سرور و دریافت پاسخ نیاز به زمانی در حدود ۶۰ ثانیه و یا حتی بیشتر، بسته به حجم داده های ارسالی نیاز است. در این حالت می بایست زمان واچ داگ افزایش یابد. برای این مورد، می توانیم از تابع millis به عنوان یک ابزار کاربردی استفاده کنیم. همانطور که می دانید این تابع زمان را برای ما می شمارد. برای اطلاعات بیشتر در رابطه با این تابع، می توانید آموزش آن را با کلیک بر روی این لینک، مطالعه کنید. به کمک تابع millis می توانیم زمان بیشتری را به یک TASK اختصاص دهیم. سپس در صورتیکه این زمان بگذرد، از تابع ریست واچ داگ بخواهیم که برنامه را ریست کرده و از ابتدا اجرا نماید. برنامه زیر به مدت ۲۰ ثانیه صبر می کند؛ سپس چنانچه عبارتی در سریال مانیتور یافت نشود، برد آردوینو را با تاخیر ۱۵ میلی ثانیه ریست خواهد کرد.
#include <avr/wdt.h> bool data_rcv=false; //در صورتیکه داده از سریال دریافت شود، این متغیر true خواهد شد. void setup() { Serial.begin(115200); delay(500); Serial.println("Start Program!"); delay(1500); } void loop() { unsigned long tm = millis(); //دریافت زمان while ((millis() - tm ) < 15000) { if(Serial.available() > 0){ //در صورت دریافت داده متغیر data_rcv برابر با ture می شود. Serial.readString();//خواندن داده از بافر و تخلیه بافر از داده های پیشین برای استفاده در دفعات بعدی data_rcv=true; break; } } if(data_rcv==false) //در صورتیکه داده ای دریافت نشده باشد wdt_enable(WDTO_15MS); else{ data_rcv=false; //برای استفاده دفعات بعدی Serial.println("DATA RECEIVED"); Serial.flush(); } }
با اجرای برنامه فوق، درون حلقه تکرار ۱۵ ثانیه برنامه صبر می کند. در این جا اگر داده ای از سریال دریافت شود، از حلقه خارج شده و پیام دریافت داده در سریال مانیتور چاپ می شود. چنانچه این اتفاق رخ ندهد، برنامه ریست شده و از ابتدا اجرا خواهد شد.
لوازم متناسب با آموزش
جمع بندی
اجرای صحیح و مطمئن یک برنامه، یکی از پارامترهای مهم در طراحی سیستم ها به شمار می رود. در پروژه هایی با سطح بالا، اجرای بدون نقص و غلبه بر خطاهای احتمالی حین اجرا، یکی از انتظاراتی است که از یک سیستم می توان داشت. در این آموزش به ارائه یک روش، جهت غلبه بر خطاهای حین اجرا پرداختیم. در این روش به کمک تایمر Watch Dog، در هنگام بروز خطا برنامه از موقعیت خطا خارج شده و اجرای آن از ابتدا آغاز می گردد. بدین ترتیب دستگاه به طور هوشمند و بدون دخالت انسان، خود را از موقعیت خطا خارج کرده و روال اجرای برنامه از ابتدا آغاز می گردد. این موضوع سبب افزایش اطمینان از عملکرد سیستم و بهبود کارایی خواهد شد.
چنانچه در مطالب گفته شده ابهامی می بینید و یا اینکه احساس می کنید که بعضی از مطالب برای شما گنگ است، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید
سلام مهندس . با تشکر ازشما . در مورد بردهای ESP8266 هم واچ داگ داریم ؟ به چه صورت هست ؟ اگر نداریم چطور میتوانیم برای این بردها هم واچ داگ داشته باشیم .
سلام و متشکرم
بله در ESP8266 هم این مورد تعبیه شده است. تابع فعال سازی به صورت زیر است:
wdtEnable(uint32_t timeout_ms = 0)
مقدار پیش فرض تابع ۰ بوده و به معنی اینست که بلافاصله پس از فراخوانی فعال شده و برد را ریست می کند. شما می توانید این مقدار را در ورودی تابع بسته به نیاز خود تغییر دهید.
سلام من با atmega32 a کار میکنم وقتی واچ داگ رو روی ۸ ثانیه میزارم هنوز یک ثانیه نگذشته ریست میشه میکرو باید چه کار کنم ؟
سلام به طور کلی به این قابلیت در برد ها و میکروکنترلر های دیگر چی میگویند؟
با سلام
واچداگ یا Watchdog در میکروکنترلرها یک ویژگی امنیتی است که برای جلوگیری از تعطیلی یا خطاهای نرمافزاری کاربرد دارد. این ویژگی به صورت یک تایمر سختافزاری عمل میکند که هر زمانی که فرآیند اجرایی میکروکنترلر به هر دلیلی به نحوی متوقف شود یا کنترل به کدی نامعتبر برخورد کند، تایمر واچداگ فعال میشود. به صورت کلی همین اسم را دارد. بنده اطلاع کاملتری ندارم.
سلام
من اومدم رو اردوینو میکروی خودم این رو استفاده کردم
wdt_enable(WDTO_15MS);
delay(30);
الان اردوینو من داره هی به صورت مکرر ریست میشه و کامپیوتر اونو نمیشناسه تا روش کد اپلود کنه
تونستم با ریست سخت افزاری اونو پیدا کنم اما چون درحال ریسته نمیشه بازم روش کد اپلود کرد
و الان من نمیتونم روی اردوینم کد اپلود کنم
چکار کنم؟؟؟
با سلام
ممکن است مشکل مربوط به مورد دیگری باشد.
من دو تا نانو جدید داشتم و همین مشکل برام پیش میاد؛
روی پروژه اصلی، به صورت پیشرفته و مطمئن از یک رله اضافی برای ریست در حالت از کار افتادن فرستنده/گیرنده استفاده کرده ام. ولی با توضیحاتی که در مورد واچ داگ خوندم، برای سادگی کار اینو تست کردم ولی روی هر دو تاشون، هنگام تایم اوت شدن تایمر، به جای ریست و از نو شروع کردن آردوینو، میره به حالت ریست مکرر و اجازه بالا اومدن کد اردوینو رو نمیده.
راه حل مشکل آپلود فقط اینه که کابل اتصال با بورد رو قطع کنی و همزمان با کلیک اپلود، وصلش کنی. اینطوری، تا کد به واچ داگ برسه، برنامه کامپایل شده و اپلود شروع میشه و میتونی اردوینو رو استفاده کنی. (البته اسکریپت بدون واچ داگ بهتره اپلود کنی)
(مسئله واچ داگ هنوز حل نشده)
با سلام
سپاس از همراهی و انتقال تجربهتان