نوشته اصلی توسط
morteza_rk
توی اون پست جمله بندی من یکم بد بود. منظور من این بود که ما توی زیر روال تایمرها واچ داگ رو ریست نمی کنیم. بلکه یه متغیر اونجا می ذاریم و بعد توی برنامه ی اصلی با چک کردن اون متغیر دستور ریست واچ داگ رو میدیم.
البته به پست های بعدی دقت کنید می بینید که کاملتر توضیح دادم.
یه بار دیگه هم میگم. زیرروال تایمر به احتمال قوی اتفاق می افته (چون کلاک تایمر جداگانه بدست میاد) ولی توی زیرروال فقط یک متغیر ، تغییر وضعیت میده (واچ داگ ریست نمیشه). حالا وظیفه ی برنامه اصلی اینه که با توجه به تغییر وضعیت این متغیر بیاد واچ داگ رو ریست بکنه یا نکنه. که نمی تونه ریست کنه. چرا؟ چون میکرو هنگه و اصلا برنامه ی اصلی اجرا نمیشه.
با سلام، بنده کاملاً با آقای spartan موافقم در صورتی که میکرو هنگ کند هیچ دلیلی ندارد که بردارهای وقفه هم از کار بیفتند، به نظرم قشنگتره که سیستم را چه از لحاظ سخت افزاری و چه از لحاظ نرم افزاری طوری طراحی کنیم که احتمال هنگ کردن را به صفر برسانیم، WDT خوب است اما استفاده کمتر ویا حتی نکردن خیلی بهتر(بلی می دانم در سیستمهای Critical عالی است، خودم فیضها برده ام)، WDT سیستم را بعد از هنگ کردن زنده می کند، اما بعد از ریست تازه دردسر شروع می شود آیا سیستم شما باید از نقطه ای که هنگ کرده ادامه کار بدهد یا مهم نیست ، HANDSHAKING ها و synchronize ها چگونه می شود؟
اگر سیستمی طراحی کنید که هر ۵ دقیقه نیاز به مرحمت WDT داشته باشد؟!؟!؟ (فرض کنید هر ۵ دقیقه موبایلتان ریست شود).......
در هر حلقه از if استفاده کنید حافظه کد را به هدر داده و سرعت اجرای برنامه را کم کردید که به نظر من کار جالبی نیست.
بنده WDT را بصورت زیر طراحی می کنم:
while(1)// external main loop
}
*/
i need reset WDT only here ** small code and flash memory usage also more SPEED in code execution
/*
;resetWDTFlag
scanKeyboard(); //no internal loop
checkSerialPort(); //no internal loop
.
.
.
if i calculate above codes cycle machines or time execution will overflow the WDT */
i need to reset WDT in second time
/*
;resetWDTFlag
.
.
scanPIOBits();//no internal loop
main loop//{