سلام به همگی
من از وقتی که با آرم شروع به برنامه نویسی کردم با یک عبارت "Callbacks" خیلی روبرو شدم. توی اینترنت سرچ کردم ولی خیلی توضیحات خوبی پیدا نکردم. ممنون میشم یکی از دوستان این مفهوم رو به صورت خیلی واضح و قابل فهم توضیح بده.
سلام به همگی
من از وقتی که با آرم شروع به برنامه نویسی کردم با یک عبارت "Callbacks" خیلی روبرو شدم. توی اینترنت سرچ کردم ولی خیلی توضیحات خوبی پیدا نکردم. ممنون میشم یکی از دوستان این مفهوم رو به صورت خیلی واضح و قابل فهم توضیح بده.
سلام ببنید دوست عزیز این یک تابع مربوط میشه به روتین وقفه ادوات میکرو شما این اموزشها را که لینکش را در پایان میگذارم بخونید اونجا توضیح دادم
[آموزش] آموزش جامع کتابخانه hal و کار با نرم افزار cubemx
و هر كس از ياد [خداى] رحمان دل بگرداند، بر او شيطانى مىگماريم تا براى وى دمسازى باشد. (36)و مسلّماً آنها ايشان را از راه باز مىدارند و [آنها] مىپندارند كه راه يافتگانند. (37)تا آن گاه كه او [با دمسازش] به حضور ما آيد، [خطاب به شيطان] گويد: «اى كاش ميان من و تو، فاصله خاور و باختر بود، كه چه بد دمسازى هستى!» (38)(سوره زخرف)بگو: «پليد و پاك يكسان نيستند، هر چند كثرت پليد [ها] تو را به شگفت آوَرَد. پس اى خردمندان، از خدا پروا كنيد، باشد كه رستگار شويد.» (100)(سوره مائده(
ممنون از اینکه جواب دادید اما بگذارید من سوالم رو کمی بازتر کنم.
معمولاً برنامه نویس ها برای روتین های وقفه تابعی با عنوان callback برای هر روتین وقفه تعریف میکنند. بعضاً روتین های مربوط به وقفه های میکروکنترلر در سورس جداگانه ای به غیر از سورس main نوشته میشوند. در این جور مواقع من مشاهده کردم که برنامه نویس میاد و در داخل سورس وقفه ها ، تابعی برای اجرا در روتین وقفه موردنظر مینویسه و داخل اون تابع هیچ چیزی وجود ندارد. همچنین شروع تعریف تابع با کلمه کلیدی weak__ میباشد. بعد در داخل تابع به صورت کامنت نوشته است که اگر کاربر نیاز به این تابع دارد باید این تابع را به صورت جداگانه در سورس main تعریف کند و در اونجا داخل تابع هر کاری که میخواهد انجام دهد. میشه در این مورد توضیحی بدید که این کلمه weak چه کاری انجام میده؟
ببینید کاربرد Callback و صفت __weak دو بحث کاملا جدا از هم هستند.
Callback:فرض کنید یه سیستم عامل داریم که قرار هست در صورت کمبود حافظه به ما اطلاع بده.خب کاری که ما
انجام میدیم به تابع تعریف میکنیم ( به صورتی که مشخص شده.تمام Callbacl ها پارامترهای ورودی و خروجی مشخص هست) و اون رو به سیستم عامل میدیدم.
کنترل اجرای برنامه دست سیستم عامل هست و وقتی که کمبود حافظه رخ داد سیستم عامل تابع ما رو اجرا میکنه تا به ما اطلاع بده که کمبود حافظه رخ داده.حالا شما یا حافظه بیشتری
رو به سیستم عامل اختصاص میدید ( برای مثال ) که در این صورت کنترل رو دوباره به سیستم عامل بر میگردونید یا یه Fault رو نمایش میدید و غیره
پس Callback ها توابعی هستند که زمانی که کنترل اجرای برنامه دست شما نیست میخوان به شما رویدادی رو اطلاع بدهند تا متناسب با اون کاری رو انجام بدید که این ، با interrupt فرق میکنه.
صفت weak : ببنید زمانی که شما یه اینتراپت رو فعال میکنید ولی تابعی برای vector مورد نظر نمی نویسید ، اگر اینتراپت رخ بده بدلیل اینکه تابعی برای اجرا وجود نداره سیستم با خطا مواجه میشه .
برای اینکه همیشه به صورت پیش فرض برای تمام اینتراپت های اصلی تابعی وجود داشته باشه ( مثل اینتراپت های NMI ) معمولا داخل یه فایل جداگانه اون توابع رو مینویسند و صفت Weak رو به اون میدن.صفت weak به کامپایلر میگه اگر تابعی با همین نام و مشخصات در جای دیگه ایی تعریف شده بود اون تابع اولویت داره و باید اون تابع اجرا بشه و اگر تابعی نیست همین تابع رو اجرا کن.یعنی اینکه اگر شما یه تابعی رو برای اینتراپت HardFault در کد خودتون بنویسید کامپایلر کد شما روکامپایل میکنه و اگر ننویسید اون تابعی رو که به صورت پیش فرض نوشته شده.
و در اخر صفت weak فقط برای اینتراپت ها کاربرد نداره و جاهای دیگه ایی هم ازش استفاده میشه