#Cنکات برنامه نویسی در C برای میکرو کنترلر ها :
نکته ی شماره 6 :
#StackThe Concept of
Stack and Its Usage in Microprocessors
Overview :
بطور کلی میتوانیم استک را به عنوان یک حافظه موقت برای دادهها توصیف کنیم. دسترسی به دادهها در استک بطور Last In First Out (LIFO) یا به عبارتی آخرین دادهای که در استک ذخیره شده است اولین داده است که میتواند بازیابی شود و اولین دادهای که در استک ذخیره شده است آخرین داده است که میتواند بازیابی شود. عمل افزودن داده به استک PUSH نامیده میشود و عمل بازیابی داده به POP یا PULL معروف است.
Stack Usage in Programming Languages
اکثریت قریب به اتفاق زبان های برنامه نویسی که توابع را پیاده سازی می کنند از یک
Stack(پشته) استفاده می کنند. به هر تابع بخش مخصوص به خود از حافظه داده می شود تا در آن کار کند. این بخش بخشی از
Stack است و به عنوان
Stack frame نامیده می شود. معمولاً شامل اجزای زیر است
آدرس برگشتی (وقتی تابع کامل شد به فراخوانی تابع برمی گردد)
آرگومان ها به تابع منتقل می شوند
متغیرهای محلی تابع
کپی های ذخیره شده از هر register که توسط تابع تغییر یافته و باید بازیابی شود.
وقتی یک برنامه وارد یک تابع میشود، فضایی در بالای
stack تخصیص داده میشود. وقتی برنامه از تابع خارج میشود، فضا آزاد میشود. عمر متغیرها در
stack ، محدود به مدت زمان اجرای تابع است. دادههایی که باید بین فراخوانیهای تابع ذخیره شوند، در heap ذخیره میشوند.
Usage in Microprocessors
استفاده از
Stack برای سیستم های embedded بسیار حیاتی است و تنظیم آن به درستی برای پایداری و اعتماد سیستم بسیار حائز اهمیت است. دست کم گرفتن استفاده از
Stack، مشکلات جدی مانند متغیرهای Overwrite شده ،اشاره گرهای Uninitialized و corrupted return addresses ایجاد می کند.
متغیرهای Overwrite :
به متغیرهایی اطلاق میشود که مقدار آنها به طور ناخواسته توسط برنامه دیگری تغییر داده شده است.. این اتفاق میتواند باعث خرابی برنامه و در نتیجه بروز مشکلات جدی مانند عدم پاسخگویی و حتی از دست دادن دادههای مهم شود.
اشارهگرهای Uninitialized :
اشارهگرهایی هستند که به یک مکان مشخص در حافظه اشاره میکنند، اما به آن مقداری داده نشده است. به عبارت دیگر، مقدار داخل حافظه که به آن اشاره میشود تعیین نشده است. استفاده از اشارهگرهای Uninitialized میتواند باعث بروز مشکلات جدی در برنامه شود مانند کرش کردن برنامه، تغییر غیرمنتظره مقادیر در حافظه و یا بروز خطاهای دیگر در زمان اجرای برنامه. بنابراین این مهم است که در هنگام تعریف و استفاده از اشارهگرها، ابتدا مقدار آنها تعیین شود.
corrupted return addresses:
در برنامه نویسی، زمانی که یک تابع فراخوانی می شود، برنامه به داخل تابع می رود و پس از اجرای تابع، برنامه باید به ادامه خطی که قبل از فراخوانی تابع وجود داشت، بازگردد. این خط با استفاده از یک متغیر به نام return address ذخیره می شود. اگر در حین اجرای تابع، این متغیر به هر دلیلی دچار خرابی شود، برنامه بعد از پایان تابع به جای بازگشت به ادامه خط، به جای آن به یک محل تصادفی در حافظه می رود که ممکن است عواقب خطرناکی داشته باشد. به این مشکل "corrupted return address" یا "آدرس بازگشتی خراب شده" گفته می شود.
حمایت از کانال : 🔥🔥🔥🔥🔥🔥حامی باش🔥🔥🔥🔥🔥🔥
#مهندس_الکترونیک
#الکترونیک 🆔 @elec_source