آردوینو آموزش آردوینو

افزایش قابلیت اطمینان در برنامه های آردوینو با تایمر WatchDog

setup-arduino-watchdog-timer-digispark
نوشته شده توسط معین صابری

اجرای پروژه های میکروکنترلری همواره با چالش قابلیت اطمینان همراه بوده و هست. قابلیت اطمینان، کلید واژه ای که در هر پروژه ای، ذهن طراح و مشتری را درگیر می کند. قابلیت اطمینان، انتطاری است که از عملکرد صحیح و مطمئن یک دستگاه داریم. به عنوان مثال در یک پردازنده خودرویی، ECU، سیستم باید همواره و در هر حال به درستی برنامه را اجرا کرده و به قسمت های مختلف خودرو به صورت بلادرنگ، به تبادل داده بپردازد. در این آموزش به چگونگی افزایش قابلیت اطمینان در پروژه های آردوینویی به کمک تایمر Watch Dog می پردازیم.  در ادامه با مرجع تخصصی آردوینو به زبان فارسی ، دیجی اسپارک همراه باشید.

 


تایمر WatchDog تعریف و کاربرد


پیش از آنکه وارد بحث تایمر WatchDog شویم، نیاز است تا کمی در رابطه با تایمر ها بدانیم. تایمرها در میکروکنترلرهای AVR، نظیر پردازنده ATMEGA328P که هسته آردوینو است، یکی از ویژگی های کلیدی این پردازنده ها به شمار می روند. تایمر ها در میکروکنترلرهای AVR به صورت موازی با برنامه اصلی، شروع به شمارش کرده و در صورت رسیدن به زمان مد نظر، با ایجاد یک وقفه، برنامه را از اتمام شمارش آگاه خواهند نمود.

تایمر watchdog در بردهای آردوینو - دیجی اسپارک

 

در کنار این، تایمر دیگری به نام Watch Dog یا سگ نگهبان وجود دارد. این تایمر زمانی که سر رسید آن فرا برسد، میکروکنترلر را ریست می کند. در این حالت برنامه از ابتدا اجرا خواهد شد. از این قابلیت می توان در کنترل خرابی و جلوگیری از هنگ سیستم در حلقه های تکرار، استفاده نمود.

آموزش راه اندازی تایمر watchdog در آردوینو - دیجی اسپارک

برای روشن تر شدن موضوع، فرض کنید برنامه وارد یک فرایند زمانبر می شود. در این قسمت برنامه متوقف شده تا نتیجه خروجی تعیین شده و برنامه ادامه یابد. در این هنگام، فرض کنید پاسخی از سمت فرایند ایجاد نشود. در این حالت برنامه در حلقه تکرار برای همیشه خواهد ماند. اما به کمک تایمر واچ داگ یا سگ نگهبان!! می توان زمانی را تعیین کرد. در صورتیکه پاسخی پس از گذشت زمان پاسخی دریافت نشود، برنامه ریست شده و از ابتدا اجرا خواهد شد.

 


دستورات تایمر 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 آردوینو - دیجی اسپارک

 


ایجاد تاخیر زمانی بیشتر برای تایمر 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);
    الان اردوینو من داره هی به صورت مکرر ریست میشه و کامپیوتر اونو نمیشناسه تا روش کد اپلود کنه
    تونستم با ریست سخت افزاری اونو پیدا کنم اما چون درحال ریسته نمیشه بازم روش کد اپلود کرد
    و الان من نمیتونم روی اردوینم کد اپلود کنم

    چکار کنم؟؟؟

    • من دو تا نانو جدید داشتم و همین مشکل برام پیش میاد؛
      روی پروژه اصلی، به صورت پیشرفته و مطمئن از یک رله اضافی برای ریست در حالت از کار افتادن فرستنده/گیرنده استفاده کرده ام. ولی با توضیحاتی که در مورد واچ داگ خوندم، برای سادگی کار اینو تست کردم ولی روی هر دو تاشون، هنگام تایم اوت شدن تایمر، به جای ریست و از نو شروع کردن آردوینو، میره به حالت ریست مکرر و اجازه بالا اومدن کد اردوینو رو نمیده.

      راه حل مشکل آپلود فقط اینه که کابل اتصال با بورد رو قطع کنی و همزمان با کلیک اپلود، وصلش کنی. اینطوری، تا کد به واچ داگ برسه، برنامه کامپایل شده و اپلود شروع میشه و میتونی اردوینو رو استفاده کنی. (البته اسکریپت بدون واچ داگ بهتره اپلود کنی)
      (مسئله واچ داگ هنوز حل نشده)