اطلاعیه

Collapse
No announcement yet.

منظور از volatile تو code vision چیه؟

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

    منظور از volatile تو code vision چیه؟

    سلام
    بعضی جاها دیدم که متغیری رو با volatile تعریف میکنند کسی میدونه واسه چی.......

    ذكات علم ياد دادنه ....

    #2
    پاسخ : منظور از volatile تو code vision چیه؟

    به متغیرهایی که کامپایلر به هیچ وجه آنها را Optimize نمیآ‌کند volatile گفته میآ‌شه.
    چون مقدار این متغیرها ممکنه هر لحظه تغییر کنه ، مثلا در زیرروال یک وقفه.

    برای روشن شدن قضیه به مثال زیر توجه کنید :

    در برنامهٔ زیر مقدار متغیر foo برابر با صفر شده است. و تا زمانی که مقدار آن مخالف با 255 باشد برنامه در حلقهٔ while گیر میآ‌کند.

    کد PHP:
    static int foo;
     
    void bar (void) {
      
    foo 0;
     
      while (
    foo != 255)
        ;


    از آنجاییکه صفر مخالف با 255 است ، کامپایلر در مرحلهٔ Optimizing کد ما را به این صورت تغییر میآ‌دهد :

    کد PHP:
    void bar_optimized(void) {
      
    foo 0;
     
      while (
    true)
        ;



    حالا مثلا اگر متغیر foo توسط یک عامل خارجی بخواهد تغییر کند ، برنامهٔ ما دیگر بدرستی کار نخواهد کرد.
    چون در کد جدید متغیر foo هرگز چک نمیآ‌شود و برنامهٔ ما برای همیشه در حلقه گیر خواهد کرد.

    در اینطور مواقع متغیر را volatile تعریف میآ‌کنند.

    برای مطالعهٔ دقیقتر :
    http://en.wikipedia.org/wiki/Volatile_variable

    چگونه هوشمندانه بپرسیم

    دیدگاه


      #3
      پاسخ : منظور از volatile تو code vision چیه؟

      حمیدا دست شما درد نکنه توضیحاتتوت کامل و مفید بود

      یعنی اگه متغیرمون از نوع volatile باشه دیگه برنامه تو حلقه while گیر نمیوفته ؟ یعنی اگه مقدار foo رو تغیر بدیم برنامه میتونه اون مقدار جدید رو چک کنه و اگه مثلا بازم مخالف 255 بود بازم تو حلقه while میره و گرنه از حلقه خارج میشه درسته؟ حمید اقا :nerd:


      ذكات علم ياد دادنه ....

      دیدگاه


        #4
        پاسخ : منظور از volatile تو code vision چیه؟

        نوشته اصلی توسط majid.4206
        حمیدا دست شما درد نکنه توضیحاتتوت کامل و مفید بود

        یعنی اگه متغیرمون از نوع volatile باشه دیگه برنامه تو حلقه while گیر نمیوفته ؟ یعنی اگه مقدار foo رو تغیر بدیم برنامه میتونه اون مقدار جدید رو چک کنه و اگه مثلا بازم مخالف 255 بود بازم تو حلقه while میره و گرنه از حلقه خارج میشه درسته؟ حمید اقا :nerd:
        بله دقیقا
        چگونه هوشمندانه بپرسیم

        دیدگاه


          #5
          پاسخ : منظور از volatile تو code vision چیه؟

          سلام
          یه سوال دیگه حمید جان وقتی ما متغیر را بصورت global تعریف میکنیم باز هم این مشکل پیش میآد؟
          یعنی اینطور بنویسیم:

          کد:
            
          #include <mega32.h>
          int foo;
          void main ()
          .
          .
          .
          فرزندم در راه است

          دیدگاه


            #6
            پاسخ : منظور از volatile تو code vision چیه؟

            نوشته اصلی توسط علیرضا کیانی
            سلام
            یه سوال دیگه حمید جان وقتی ما متغیر را بصورت global تعریف میکنیم باز هم این مشکل پیش میآد؟
            یعنی اینطور بنویسیم:

            کد:
             
            #include <mega32.h>
            int foo;
            void main ()
            .
            .
            .
            بله ، مشکل پیش میاد.
            در مثالی هم که آورده شد متغیر global بود.
            چگونه هوشمندانه بپرسیم

            دیدگاه


              #7
              پاسخ : منظور از volatile تو code vision چیه؟

              سلام آقای رستمی
              من این برنامه را نوشتم ولی کاملا صحیح جواب میده پس.............. چطوریاس؟؟

              #include <mega32.h>
              char i;
              void main (void)
              {
              DDRD=0;PORTD=255;
              DDRA=255;
              #asm("sei"
              GICR=0x40;
              MCUCR=0x03;
              i=0;
              while(i!=255);
              PORTA=0b10101010;
              }
              interrupt [2] void isd ()
              {
              i=255;
              }

              یعنی از while بیرون میآد وقتی وقفه رخ میده میشه توضیح بدین
              ممنون
              فرزندم در راه است

              دیدگاه


                #8
                پاسخ : منظور از volatile تو code vision چیه؟

                نوشته اصلی توسط علیرضا کیانی
                سلام آقای رستمی
                من این برنامه را نوشتم ولی کاملا صحیح جواب میده پس.............. چطوریاس؟؟

                #include <mega32.h>
                char i;
                void main (void)
                {
                DDRD=0;PORTD=255;
                DDRA=255;
                #asm("sei"
                GICR=0x40;
                MCUCR=0x03;
                i=0;
                while(i!=255);
                PORTA=0b10101010;
                }
                interrupt [2] void isd ()
                {
                i=255;
                }

                یعنی از while بیرون میآد وقتی وقفه رخ میده میشه توضیح بدین
                ممنون
                آیا Optimization کامپایلر فعال است ؟
                برنامه را با سطوح مختلف Optimize دوباره کامپایل و تست کنید.
                چگونه هوشمندانه بپرسیم

                دیدگاه


                  #9
                  پاسخ : منظور از volatile تو code vision چیه؟

                  سلام جناب رستمی
                  ببینید من اسمبلی این برنامه را میزارم ببینید تو حلقه while همیشه i یا همون R5 رو تست میکنه پس...........
                  ;char i;
                  ;void main (void)
                  ; 0000 0004 {

                  .CSEG
                  _main:
                  ; 0000 0005 DDRD=0;PORTD=255;
                  LDI R30,LOW(0)
                  OUT 0x11,R30
                  LDI R30,LOW(255)
                  OUT 0x12,R30
                  ; 0000 0006 DDRA=255;
                  OUT 0x1A,R30
                  ; 0000 0008 #asm("sei"
                  sei
                  ; 0000 0009 GICR=0x40;
                  LDI R30,LOW(64)
                  OUT 0x3B,R30
                  ; 0000 000A MCUCR=0x03;
                  LDI R30,LOW(3)
                  OUT 0x35,R30
                  ; 0000 000B i=0;
                  CLR R5
                  ; 0000 000C while(i!=255);
                  _0x3:
                  LDI R30,LOW(255)
                  CP R30,R5
                  BRNE _0x3
                  ; 0000 000D PORTA=0b10101010;
                  LDI R30,LOW(170)
                  OUT 0x1B,R30
                  ; 0000 000E }
                  _0x6:
                  RJMP _0x6
                  ;interrupt [2] void isd ()
                  ; 0000 0010 {
                  _isd:
                  ST -Y,R30
                  ; 0000 0011 i=255;
                  LDI R30,LOW(255)
                  MOV R5,R30
                  ; 0000 0012 }
                  LD R30,Y+
                  RETI

                  .CSEG

                  .CSEG
                  ;END OF CODE MARKER
                  __END_OF_CODE:
                  فرزندم در راه است

                  دیدگاه


                    #10
                    پاسخ : منظور از volatile تو code vision چیه؟

                    نوشته اصلی توسط علیرضا کیانی
                    سلام جناب رستمی
                    ببینید من اسمبلی این برنامه را میزارم ببینید تو حلقه while همیشه i یا همون R5 رو تست میکنه پس...........
                    نوشته اصلی توسط حمید رستمی
                    آیا Optimization کامپایلر فعال است ؟
                    برنامه را با سطوح مختلف Optimize دوباره کامپایل و تست کنید.
                    ؟
                    چگونه هوشمندانه بپرسیم

                    دیدگاه


                      #11
                      پاسخ : منظور از volatile تو code vision چیه؟

                      اگه منظورتون اینجاست بله فعاله و در هر صورتی که شما بگید گذاشتم.فقط کمی کد اسمبلی تغییر میکنه ولی تو عمل درست جواب میده
                      فرزندم در راه است

                      دیدگاه


                        #12
                        پاسخ : منظور از volatile تو code vision چیه؟

                        پس احتمالا Codevision در Optimize کردن کد به این نکته توجه نمیآ‌کند.
                        چگونه هوشمندانه بپرسیم

                        دیدگاه


                          #13
                          پاسخ : منظور از volatile تو code vision چیه؟

                          علاوه بر مطلبی که آقای رستمی گفتن Volatile به معنای مقیم باعث می شه که از رجیستر های CPU که همون R0 تا R31 هستند استفاده نکنه و متغیر رو در فضای SRAM قرار بده .
                          همونطور که می دونید در زبان اسمبلی اگر متغیری در فضای SRAM باشه کامپیایلر بخواد از اون متغیر استفاده کنه ، اول باید اون متغیر رو به یکی از رجیستر های سی پی یو(به عنوان مثال R2) انتقال بده و بعد از اون از متغیر برای انتقال ، مقایسه یا هر منظور دیگری استفاده کنه .. اگر از Volatile برای تعریف متغیر استفاده نکرده باشید و مجددا از این متغیر استفاده کنید ، کامپایلر دوباره مقدار متغیر را از SRAM نمیخونه و مستقیما از رجیستر CPU مجددا استفاده می کنه ، هر چند که ممکنه قبل از اون مقدار متغیر در SRAM تغییر کرده باشه ولی در رجیستر CPU مقدار همون مقدار قبلی باشه .
                          قرار دادن Volatile در هنگام تعریف متغیر باعث میشه با هر بار استفاده از متغیر ، کامپایلر مستقیما از فضای اختصاص داده شده از SRAM مقدار جدید رو بگیره و تغییرات مقدار متغیر در قسمتهای دیگر برنامه تشخیص داده بشه .
                          اگر حجم رم مورد نیاز برنامه کم باشه و عبارت Volatile رو قرار ندید ، مثل مثالی که خودتون گزاشتید ، کامپایلر از رجیستر های CPU برا اختصاص فضا به متغیر استفاده می کنه (در برنامه ی شما R5 ) که مشکل فوق به وجود نمیاد .چرا که برای نوشتن و یا خواندن از رجیستر از R5 استفاده میکنه . ولی اگر برنامه حجیم تر بشه و فضای RAM بیشتری نیاز باشه ، کامپایلر مجبوره که از فضای SRAM برای بعضی از متغیر ها استفاده کنه ، که اگر هنگام تعریف این متغیر ها از volatile استفاده نکنید ، به مشکل فوف بر می خورید( مثلا گیر کردن برنامه توی یک While مشابه مثال شما )(در این حالت برای نوشتن در متغیر از حافظه ی SRAM استفاده می شه و برای خواندن از متغیر از رجیستر CPU استفاده میشه )
                          That`s It ...I`m out of here

                          دیدگاه


                            #14
                            پاسخ : منظور از volatile تو code vision چیه؟

                            سلام
                            اولا ممنونم از هر دو عزیز که جواب سوالاتم را دادید میخواستم بدونم در کل volatile در جایی استفاده میشه که حجم محاسباتی میکرو بالا باشه و در این حالت نباید از رجیسترهای عمومی اطلاعاتی استفاده نمود.آیا این حرف درسته؟
                            فرزندم در راه است

                            دیدگاه


                              #15
                              پاسخ : منظور از volatile تو code vision چیه؟

                              عموما volatile در جایی استفاده می شه که مقدار متغیر به طور غیر منتظره ممکنه تغییر کنه ( مثل وقفه )
                              (توی برنامه های خیلی کوچک با رم مورد نیاز کم ، Volatile کاربردی نداره چون فضای SRAM به رجیستر اختصاص داده نمیشه )
                              That`s It ...I`m out of here

                              دیدگاه

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