سلام خدمت دوستان عزیز
مقدمه: همانطور که می دانید میکروهای stm32 دارای دو واچ داگ هستند. که یکی ساده (iwdg) و دیگری پیشرفته تر(wwdg) میباشد. و البته هرکدام مزایای خودشان را دارند، از جمله اینکه واچ داگ ساده دارای اسیلاتور مجزا از اسیلاتور اصلی میکرو هست و این باعث میشه در صورت fail شدن اسیلاتور میکرو بر روی این واچ داگ تاثیری نداشته باشد. از طرف دیگر واچ داگ پیشرفته امکاناتی دارد مثلاً دارای بازه زمانی (window) برای ریست کردن هست و یا دارای امکان گرفتن وقفه می باشد.
حال با توجه به مطالب بالا سوالات من از قرار زیر می باشند.
1- همانطور که اطلاع دارید بایستی در زمان مناسب کانتر واچ داگ را دوباره با مقدار مناسب لودکنیم تا از ریست شدن میکرو جلوگیری شود. اما به نظر من این کار وقتی برنامه پیچیده می شود سخت است. مثلا فرض کنید در while(1); برنامه، چند تابع فراخوانی شود. در هر کدام از این تابع ها بایستی محاسبه کنیم که چه زمانی کانتر را دوباره لود کنیم. این کار موقعی پیچیده تر میشود که قرار باشه از wwdg استفاده کنیم (چرا که حد بالا و پایین دارد و اگر زودتر از موعد لود کنیم هم موجب ریست میکرو می شود). حالا تازه بعد از این همه محاسبه و داستان فرض کنید بعداً قرار باشه که تغییری در برنامه رخ دهد. همه این محاسبات به هم میریزه و باید دوباره همه جا تغییراتی در خصوص زمان لود کردن کانتر ایجاد کنیم. برای این منظور راه حلی هست؟ یا همینه که هست؟
البته این رو هم بگم که می دونم برای واچ داگ wwdg در رفرنس منوال گفته می تونید از وقفه اش برای لود کانتر استفاده کنید و با این کار خیلی کار راحت میشه و دیگه نباید نگران زمان بندی بود. اما این کار اصولی نیست و ممکنه حتی با اینکه میکرو هنگ کرده وقفه هنوز فعال باشه و دائم ریلود بشه و مانع از ریست میکرو بشه.
2- سوال دیگری که برای من پیش اومده اینه که ظاهراً هنگامی که مقدار کانتر از 80 به 79 تغییر می کند ریست رخ می دهد و قبل از این ریست یعنی وقتی که به 80 می رسد وقفه اتفاق می افتد. حالا سوال من اینه که وقتی به وقفه می رود کانتر واچ داگ می ایستد و وقتی که خارج شد شروع به کم شدن دوباره می کند یا اینکه در حین وقفه هم کانتر کار خود را می کند ولی چون سرعتش از سرعت میکرو کمتر است عملاً اتفاقات درون زیربرنامه وقفه بسیار سریع اجرا می شوند.
3- یکی از کاربردهای وقفه در واچ داگ ها رو این ذکر می کنند که با استفاده از آن می توان دیتا لاگینگ انجام داد تا متوجه شویم ایراد از کجاست و چه چیز باعث این شده که میکرو هنگ کند. منظور از دیتا لاگینگ ذخیره چه نوع اطلاعاتی است؟ آیا میشه با استفاده از آن متوجه شد که در کدام قسمت برنامه این مشکل به وجود اومده -مثلاً در چه تابعی به مشکل برخوردیم-؟
پی نوشت: این سوال عالی بود و از مطالب مطرح شده تو اون تاپیک خیلی استفاده کردم -بخشی از مواردی که بالا گفتم هم از اونجا یاد گرفتم- رو همین حساب :
Roholamin: 1+ for good question
مقدمه: همانطور که می دانید میکروهای stm32 دارای دو واچ داگ هستند. که یکی ساده (iwdg) و دیگری پیشرفته تر(wwdg) میباشد. و البته هرکدام مزایای خودشان را دارند، از جمله اینکه واچ داگ ساده دارای اسیلاتور مجزا از اسیلاتور اصلی میکرو هست و این باعث میشه در صورت fail شدن اسیلاتور میکرو بر روی این واچ داگ تاثیری نداشته باشد. از طرف دیگر واچ داگ پیشرفته امکاناتی دارد مثلاً دارای بازه زمانی (window) برای ریست کردن هست و یا دارای امکان گرفتن وقفه می باشد.
حال با توجه به مطالب بالا سوالات من از قرار زیر می باشند.
1- همانطور که اطلاع دارید بایستی در زمان مناسب کانتر واچ داگ را دوباره با مقدار مناسب لودکنیم تا از ریست شدن میکرو جلوگیری شود. اما به نظر من این کار وقتی برنامه پیچیده می شود سخت است. مثلا فرض کنید در while(1); برنامه، چند تابع فراخوانی شود. در هر کدام از این تابع ها بایستی محاسبه کنیم که چه زمانی کانتر را دوباره لود کنیم. این کار موقعی پیچیده تر میشود که قرار باشه از wwdg استفاده کنیم (چرا که حد بالا و پایین دارد و اگر زودتر از موعد لود کنیم هم موجب ریست میکرو می شود). حالا تازه بعد از این همه محاسبه و داستان فرض کنید بعداً قرار باشه که تغییری در برنامه رخ دهد. همه این محاسبات به هم میریزه و باید دوباره همه جا تغییراتی در خصوص زمان لود کردن کانتر ایجاد کنیم. برای این منظور راه حلی هست؟ یا همینه که هست؟

البته این رو هم بگم که می دونم برای واچ داگ wwdg در رفرنس منوال گفته می تونید از وقفه اش برای لود کانتر استفاده کنید و با این کار خیلی کار راحت میشه و دیگه نباید نگران زمان بندی بود. اما این کار اصولی نیست و ممکنه حتی با اینکه میکرو هنگ کرده وقفه هنوز فعال باشه و دائم ریلود بشه و مانع از ریست میکرو بشه.
2- سوال دیگری که برای من پیش اومده اینه که ظاهراً هنگامی که مقدار کانتر از 80 به 79 تغییر می کند ریست رخ می دهد و قبل از این ریست یعنی وقتی که به 80 می رسد وقفه اتفاق می افتد. حالا سوال من اینه که وقتی به وقفه می رود کانتر واچ داگ می ایستد و وقتی که خارج شد شروع به کم شدن دوباره می کند یا اینکه در حین وقفه هم کانتر کار خود را می کند ولی چون سرعتش از سرعت میکرو کمتر است عملاً اتفاقات درون زیربرنامه وقفه بسیار سریع اجرا می شوند.
3- یکی از کاربردهای وقفه در واچ داگ ها رو این ذکر می کنند که با استفاده از آن می توان دیتا لاگینگ انجام داد تا متوجه شویم ایراد از کجاست و چه چیز باعث این شده که میکرو هنگ کند. منظور از دیتا لاگینگ ذخیره چه نوع اطلاعاتی است؟ آیا میشه با استفاده از آن متوجه شد که در کدام قسمت برنامه این مشکل به وجود اومده -مثلاً در چه تابعی به مشکل برخوردیم-؟
پی نوشت: این سوال عالی بود و از مطالب مطرح شده تو اون تاپیک خیلی استفاده کردم -بخشی از مواردی که بالا گفتم هم از اونجا یاد گرفتم- رو همین حساب :

دیدگاه