🌱پاسخ 👇 چون کامپایلر ممکنه با خودش بگه: من این flag رو نگاه کردم، صفره و توی این حلقه هم هیچجا تغییرش نمیدی؛ پس لازم نیست هی دوباره از حافظه بخونمش بنابراین ممکنه مقدار flag رو یک بار بخونه و همون مقدار صفر رو نگه داره. اما مشکل اینجاست که Interrupt خارج از روند عادی برنامه میتونه flag رو تغییر بده اینجاست که مینویسیم: volatile int flag = 0; با volatile داریم به کامپایلر میگیم: ممکنه این متغیر هر لحظه از جای دیگه تغییر کنه؛ پس هر بار که لازم شد، واقعاً برو مقدارش رو بخون حالا وقتی Interrupt مقدار flag رو 1 کرد، CPU متوجه تغییر میشه و از while بیرون میاد. نکته: درواقع، volatile خودش متغیر رو ایمن نمیکنه؛ فقط جلوی بعضی بهینهسازیهای کامپایلر رو میگیره. در Embedded، گاهی مشکل از کد نیست؛ مشکل از چیزیه که کامپایلر فکر میکنه کد باید انجام بده!
17