اطلاعیه

Collapse
No announcement yet.

volatile unsigned long

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    volatile unsigned long

    volatile unsigned long
    این چه نوع متغییری هست

    #2
    پاسخ : volatile unsigned long

    نوشته اصلی توسط ieee7
    volatile unsigned long
    volatile برای متغیرهایی بکار میره که تغییر اونها توسط برنامه کنترل نمیشه !؟ (مثلا مقدار یه شمارنده سیستم) و unsigned long هم یه مقدار صحیح بدون علامت long .
    دوستان اگه ممکنه توضیحات رو تکمیل یا اصلاح کنند

    دیدگاه


      #3
      پاسخ : volatile unsigned long

      با سلام

      volatile به کامپایلر اعلام می کند که متغیر مورد نظر را در بهینه سازی برای سرعت یا حجم برنامه ، ... مشارکت ندهد.

      یعنی در هر قسمت از برنامه که از این متغیر استفاده شده ، جدیدترین مقدار آن را محاسبه و استفاده کند.

      بعضی جاها کامپایلر فرض می کند یک متغیر تغییر نکرده و بعضی محاسبات را حذف می کند ،
      و مقدار آن که در جایی دیگر از برنامه بدست آمده( و مورد نظر برنامه نویس نبوده ) ، استفاده می شود و خطا ایجاد می کند.


      لذا ، متغیر های global و آنهاییکه در اینتراپت ها استفاده می شوند، باید با کلمه volatile همراه شوند.

      با سپاس
      گشتی در لاله زار
      http://www.eca.ir/forum2/index.php?topic=76138.0

      http://www.eca.ir/forum2/index.php?topic=76141

      دیدگاه


        #4
        پاسخ : volatile unsigned long

        البته باید به این نکته ریز هم توجه کرد که اگر متغیری که 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();

        return n;
        }

        void main(void)
        {
        for( ; ; )
        {
        if( get_n() == 1 )
        {
        // do something
        }
        }
        }


        بطور کلی و ساده هم volatile میگه "هر وقت احتیاج شد از این متغیر استفاده کنی (عمل read) یک کپی تازه از این متغیر بگیر و استفاده کن."

        دیدگاه

        لطفا صبر کنید...
        X