volatile برای متغیرهایی بکار میره که تغییر اونها توسط برنامه کنترل نمیشه !؟ (مثلا مقدار یه شمارنده سیستم) و unsigned long هم یه مقدار صحیح بدون علامت long .
دوستان اگه ممکنه توضیحات رو تکمیل یا اصلاح کنند
volatile به کامپایلر اعلام می کند که متغیر مورد نظر را در بهینه سازی برای سرعت یا حجم برنامه ، ... مشارکت ندهد.
یعنی در هر قسمت از برنامه که از این متغیر استفاده شده ، جدیدترین مقدار آن را محاسبه و استفاده کند.
بعضی جاها کامپایلر فرض می کند یک متغیر تغییر نکرده و بعضی محاسبات را حذف می کند ،
و مقدار آن که در جایی دیگر از برنامه بدست آمده( و مورد نظر برنامه نویس نبوده ) ، استفاده می شود و خطا ایجاد می کند.
لذا ، متغیر های global و آنهاییکه در اینتراپت ها استفاده می شوند، باید با کلمه volatile همراه شوند.
با سپاس
گشتی در لاله زار
http://www.eca.ir/forum2/index.php?topic=76138.0
البته باید به این نکته ریز هم توجه کرد که اگر متغیری که volatile تعریف شده ممکن باشه که در طی دو دسترسی مجزا مقدارش اخذ بشه و ضمنا در یک روال وقفه مقدار این متغیر تغییر کنه باید در هنگام اخذ مقدار این متغیر در یک روال عادی دسترسی به این متغیر بلوکه بشه. البته در حالت فعلی چون ARM دارای ساختار 32 بیتی هست و در صورتی که از کد حالت thumb استفاده نشه مقدار این متغیر با اجرای فقط یک دستور اخذ میشه این مورد رو نباید در نظر گرفت ولی مثلا کد زیر رو در نظر بگیرین:
volatile unsigned long long n;
void some_irq(void) __irq
{
n++
}
void main(void)
{
for( ; ; )
{
if( n == 1 )
{
// do something
}
}
}
متغیر n یک متغیر 64 بیتی هست. روی یک سیستم 32 بیتی این مقدار بایستی در طی اجرای حداقل دو دستور اخذ بشه ولی ممکنه بعد از اجرای دستور اول و قبل از اجرای دستور دوم وقفه اجرا بشه و این باعث میشه که سیستم عدد اشتباهی رو برداره. پس بایستی یک کد کمکی برای اخذ این مقدار استفاده بشه یک چیزی مثل این:
volatile unsigned long long n;
void some_irq(void) __irq
{
n++
}
unsigned long long get_n(void)
{
unsigned long long result;
__disable_interrupts();
result = n;
__enable_interrupts();
دیدگاه