Top Ad unit 728 × 90

Latest news

recent

Watchdog Timer & Ứng dụng

Watchdog timer là bộ đếm thời gian hoạt động liên tục nhằm tự động thực hiện một nhiệm vụ nào đó. Sau một khoảng thời gian được định trước nếu bộ đếm không được dừng hoặc refresh nó sẽ kích hoạt tác vụ đã được định sẵn ví dụ như reset thiết bị, tắt màn hình, phát tín hiệu cảnh báo, ... Trong quá trình đếm nếu bộ đếm được refresh nó cứ thế tự động đếm tiếp nhưng bắt đầu lại với thời gian là 0.

Thông thường Watchdog timer được nhắc đến như một sự hỗ trợ mang tính phần cứng, được sử dụng bởi phần mềm qua các trình điều khiển, tuy nhiên ở đây tôi muốn nhìn nhận nó một cách tổng quát mang tính khái niệm, vì vậy Watchdog timer cũng dễ dàng được triển khai trên cơ sở phần mềm.

Dưới đây là minh họa cho cơ chế hoạt động của Watchdog timer trong tình huống phần cứng được tạo ra nhằm giúp hệ thống tự động khởi động lại khi phần mềm bị treo. Chức năng này là cần thiết trong tình huống các thiết bị nhúng được đòi hỏi phải hoạt động 24/7 như camera, đầu đọc, thiết bị truyền dẫn dữ liệu ...



Mã C minh họa cho việc điều khiển phía phần mềm:

int iWatchDogId;

void intSigHandler(int signum)
{
       signal(SIGINT, intSigHandler);

       if(iWatchDogId != -1)
       {
              if(close(iWatchDogId) != 0)
              {
                    printf("Close watchdog failed in signal handler\n");
              }else{
                    printf("Close watchdog succeeded in signal handler\n");
              }
       }
}


static void *PollingThread(void *arg)
{
       int iWatchDogTimeout;
       signal(SIGINT, intSigHandler);
       iWatchDogId = open("/dev/watchdog",O_WRONLY);
       if (iWatchDogId == -1)
       {
                perror("watchdog");
        }else{
                iWatchDogTimeout = 0;
                if( ioctl (iWatchDogId, WDIOC_GETTIMEOUT, &iWatchDogTimeout) )
                {
                      fprintf(stderr,"Watchdog Timer : WDIOC_GETTIMEOUT failed\n");
                }else{
                      printf ("\nCurrent Watchdog time out value is : %d seconds\n", iWatchDogTimeout);
                }
        } 


         while(1)
         {
                if( iWatchDogId != -1 )
                {
                      if (write(iWatchDogId, "\0", 1) ! = 1)
                      {
                             fprintf(stderr,"Write to watchdog failed\n");
                      }
                }


                .....

                sleep(10);
         }
}

void main()
{
         pthread_t oPollingThread;
         pthread_create(&oPollingThread, NULL, PollingThread, NULL);
        
         ....

}

Tiến trình PollingThread sẽ luôn chạy để reset bộ đếm của watchdog trước khi timeout xảy ra, khi hệ thống trục trăc, ứng dụng treo, PollingThread không thực hiện thì bộ đếm sẽ không bị reset nên tiếp tục đếm tới khi timeout và tự động reset hệ thống.

Ví dụ trên là một watchdog timer đơn giản với 1 ngưỡng timeout, trong thực tế còn có những bộ watchdog có nhiều ngưỡng timeout khác nhau được gán tương ứng với các chức năng khác nhau. Tuy nhiên mục tiêu của bài viết này không chỉ đơn thuần giới thiệu khái niệm watchdog timer mà tôi còn muốn thông qua đó gởi đến các bạn ý tưởng về logic xử lý những tình huống khác nhau xảy ra trong một hệ thống (ở đây là tự động khởi động lại thiết bị khi treo), cũng như cách thức trong xây dựng lập lịch mà sẽ hữu ích cho nhiều trường hợp ứng dụng khác trong quá trình phát triển.


Binh Nguyen - Bioz
Watchdog Timer & Ứng dụng Reviewed by Bioz Nguyen on 5:31:00 PM Rating: 5
All Rights Reserved by IEEV © 2009 - 2016
Powered By Blogger, Designed by Sweetheme

Contact Form

Name

Email *

Message *

Powered by Blogger.