اطلاعیه

Collapse
No announcement yet.

UBUB؟ درباره volatile در C بنویسید!

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

    UBUB؟ درباره volatile در C بنویسید!

    سلام به همه.
    لطفا اطلاعات خود را در مورد کلمه کلیدی volatile در زبان C به اشتراک بگذارید!
    ...
    چیزهایی رو که پس از چندتا سرچ ساده به دست میاد، میدونم!
    سوال من به این خاطر هست که، اون چیزهایی که در اولین سرچها پیدا میشه، خیلی وحشتناکه !!!
    یعنی توی دنیای کامپایلرهای مدرن امروزی بیشتر به فحش رکیک شبیه!!
    ...
    من احساس میکنم که کاربرد این کلمه کلیدی باید منسوخ شده باشه!!
    نظر شما چیه؟؟
    ...
    (در این خصوص نظر دو تن از اساتید رو به طور خاص جویا میشم: جناب طراح و جناب روح الامین)
    (ضمنا اگه توی عنوان پست، ایرادی احساس میکنید، عذرخواهی میکنم، ممکنه برخی از دوستان دلیلش رو بدونند!)
    جدیدترین ویرایش توسط ubub; ۱۷:۲۹ ۱۳۹۷/۰۴/۱۶.
    ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙

    #2
    پاسخ : UBUB؟ درباره volatile در C بنویسید!

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

    دیدگاه


      #3
      پاسخ : UBUB؟ درباره volatile در C بنویسید!

      در بخش یازدهم فیلم های آموزش کدنویسی کاربردی برای میکروکنترلر درباره volatile توضیح داده شده است:
      اوژن: به معنای افکننده و شکست دهنده است
      دانایی، توانایی است-Knowledge is POWER
      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

      دیدگاه


        #4
        پاسخ : UBUB؟ درباره volatile در C بنویسید!

        کلمه volatile یکی از کلیدی ترین کلمات زبان هست، امروزه منسوخ نشده که هیچ کاربردی تر هم شده است.
        کل مسئله به بهینه سازی برمی گردد، شما در قسمت optimization کامپایلر مرحله otimize را -o0 قرار دهید هیچ کلمه volatile نیاز نیست.
        اما معمولا کامپایلر ها بهینه سازی را در اعداد 2 و 3 قرار میدهد. اما در این حالت چه اتفاقی رخ میدهد؟
        برای مثال کد زیر:
        fun(x)
        }
        a = 2
        b = a + 5
        b = x+ b
        return b
        {
        در این حالت کامپایلر به چنین بخش کدی برخورد میکند، واکنش کامپایلر حرفه ای خلاصه سازی کامل این بخش هست، کامپایلر میداند عدد a ثابت است و تغییر نکرده و در جای دیگری نیز استفاده نشده، پس a حذف می شود و به جای خطهای برنامه

        b = x + 7 قرار داده می شود، اگر کامپایلر به این نتیجه برسد x هم ثابت است x را هم حذف میکند.
        این کار یک ویژگی مهم دارد که کدهای پردازشی با سرعت زیاد اجرا می شود.
        این کار کامپایلر دو مزیت ایجاد میکند،
        یک برنامه نویس میتواند بخش هایی از کد را خوانا تر بنویسد بدون اینکه نگران افزایش زمان اجرا باشد:
        مثلا عدد a دو بایاس 1 ولت در تقویت کننده اول و 2 ولت در تقویت کننده دوم دارد در واقع 3 ولت بایاس دارد اما برنامه نویس مینویسد
        out = a+ 1 + 2
        این بعدا با یک کامنت مشخص میشود این دو عدد مربوط به کدام بایاس هستند اما این کد به خاطر بهینه سازی کامپایلر هیچ تفاوت زمان اجرا با a+3 ندارد و کد عمل اضافه ای انجام نمیدهد

        مزیت بعدی
        برای پردازنده هایی که قابلیت ویژه دارند مثلا STMf4 STMf7 آنهایی که ماژول پردازشی دارند، کامپایلر بر مبنای کد بهترین ماژول پردازشی را انتخاب کرده و کد را روی آن اجرا میکند.

        دیدگاه


          #5
          پاسخ : UBUB؟ درباره volatile در C بنویسید!

          سلام به همه.
          ضمن تشکر از همه دوستانی که مطلب رو دنبال میکنند و تشکر ویژه از استاد خودم، جناب طراح !
          ...
          عبارت Volatile رو که توی نت سرچ میکنی، چکیده اطلاعاتی که به دست میاد اینه که:
          ممکنه مقدار برخی متغییرهای موجود در بدنه کد، توسط اجرا شدن، سطح دیگری از کد (به صورت غیر مستقیم) تغییر کنه!!!
          مثلا مقدار متغییری که در بدنه اصلی برنامه استفاده میشه، ممکنه پس از اجرای کدهای یک وقفه (بدون هر نوع فراخوانی متغییر مذکور) تغییر کنه!
          و جناب طراح نیز در ویدئوشون، همین مفهوم رو بیان و تائید فرمودند!
          که البته این موضوع صادق هست و خیلی از ما هم، دلیل و مکانیزمش رو میدونیم!
          همونطور که میدونید:
          توی پردازنده ها ما برای ذخیره و دستکاری داده ها (عملوندها) حداقل دو تا گزینه داریم:
          1- خانه های RAM (پرتعداد با سرعت معمولی)
          2- رجیسترهای کاربرد عمومی (کم تعداد با سرعت بالا)
          خوب بهتره که ما برای افزایش سرعت اجرای برنامه مون، بیشتر از رجیسترهای کاربرد عمومی پر سرعت استفاده کنیم!
          ولی از اونجایی که تعداد این رجیسترها محدود است، کامپایر، سعی میکنه، استفاده از این رجیسترها رو در بخشهای مختلف برنامه و بین متغییرهای مختلف Share کنه (به اشتراک بذاره)! و متغییرهای که تعداد فراخوانی بیشتری داشته باشند، سهم بیشتری در استفاده از این رجیسترها دارند!
          ...
          یعنی ممکنه متغییری توسط کامپایلر از محل اصلی خود در حافظه، فراخوانی شود و برای ادامه پردازش و افزایش سرعت در یکی از رجیسترهای عمومی قرار بگیره و برای مدت کوتاهی همون رجیستر، رفرنس اون متغییر برای CPU تلقی بشه!
          حالا اگه در این بین وقفه ای اتفاق بیافته و توی سرویس وقفه، اتفاقا از محل همین رجیستر برای ذخیره و دستکاری داده ها استفاده شده باشه، اون موقع پس از بازگشت از وقفه، دیگه مقدار اون رجیستر معتبر نیست! در حالی که هنوز این رجیستر از منظر CPU ، رفرنس متغییر قبلی در کد اصلی محسوب میشود!
          ...
          خوب علامت سول من دقیقا همین جاست؟؟!!
          اونهایی که چهار خط کد اسمبلی نوشته باشند، حتما یادشون هست که ما برای خلاصی از این حالت، توی برنامه اصلی، قبل از پرش به روال سرویس دهی وقفه و تابع، می اومدیم با دستور PUSH همه رجیسترهایی رو که نیاز داشتیم، توی پشته قرار میدادیم، بعد با خیال راحت، توی سرویس وقفه، مقادیر رجیسترهای عمومی رو دستکاری میکردیم و پس از بازگشت از وقفه یا تابع، با دستور POP، اطلاعات مورد نیاز رو از پشته برمیگردوندیم توی رجیسترهای عمومی!

          ...
          حالا چطور ممکنه کامپایلرهای مدرن امروزی از این مهم غافل باشند؟؟
          ...
          همین طور که این مطلب رو مینوشتم به ذهنم خورد، که شاید کلمه کلیدی Volatile میخواد به کامپایلر اعلام کنه که در هنگام پرش به زیرروالها، عملیات PUSH-POP را انجام بده یانه؟!!!
          یعنی اگه کامپایلر در حال دستکاری متغیری بود و همزمان وقفه ای اتفاق افتاد، تعیین اینکه رجیسترها در پشته، PUSH بشن یا نه، بستگی به این موضوع داشته باشه که اون متغیر از نوع Volatile تعریف شده باشه یا نه؟!!!
          (یه چیزی شبیه به NO_SAVE بسکام!)
          ...
          لطفا دوستان نظر بدن!
          ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙

          دیدگاه


            #6
            پاسخ : UBUB؟ درباره volatile در C بنویسید!

            نوشته اصلی توسط ubub نمایش پست ها
            سلام به همه.
            ضمن تشکر از همه دوستانی که مطلب رو دنبال میکنند و تشکر ویژه از استاد خودم، جناب طراح !
            ...
            عبارت Volatile رو که توی نت سرچ میکنی، چکیده اطلاعاتی که به دست میاد اینه که:
            ممکنه مقدار برخی متغییرهای موجود در بدنه کد، توسط اجرا شدن، سطح دیگری از کد (به صورت غیر مستقیم) تغییر کنه!!!
            مثلا مقدار متغییری که در بدنه اصلی برنامه استفاده میشه، ممکنه پس از اجرای کدهای یک وقفه (بدون هر نوع فراخوانی متغییر مذکور) تغییر کنه!
            و جناب طراح نیز در ویدئوشون، همین مفهوم رو بیان و تائید فرمودند!
            که البته این موضوع صادق هست و خیلی از ما هم، دلیل و مکانیزمش رو میدونیم!
            همونطور که میدونید:
            توی پردازنده ها ما برای ذخیره و دستکاری داده ها (عملوندها) حداقل دو تا گزینه داریم:
            1- خانه های RAM (پرتعداد با سرعت معمولی)
            2- رجیسترهای کاربرد عمومی (کم تعداد با سرعت بالا)
            خوب بهتره که ما برای افزایش سرعت اجرای برنامه مون، بیشتر از رجیسترهای کاربرد عمومی پر سرعت استفاده کنیم!
            ولی از اونجایی که تعداد این رجیسترها محدود است، کامپایر، سعی میکنه، استفاده از این رجیسترها رو در بخشهای مختلف برنامه و بین متغییرهای مختلف Share کنه (به اشتراک بذاره)! و متغییرهای که تعداد فراخوانی بیشتری داشته باشند، سهم بیشتری در استفاده از این رجیسترها دارند!
            ...
            یعنی ممکنه متغییری توسط کامپایلر از محل اصلی خود در حافظه، فراخوانی شود و برای ادامه پردازش و افزایش سرعت در یکی از رجیسترهای عمومی قرار بگیره و برای مدت کوتاهی همون رجیستر، رفرنس اون متغییر برای CPU تلقی بشه!
            حالا اگه در این بین وقفه ای اتفاق بیافته و توی سرویس وقفه، اتفاقا از محل همین رجیستر برای ذخیره و دستکاری داده ها استفاده شده باشه، اون موقع پس از بازگشت از وقفه، دیگه مقدار اون رجیستر معتبر نیست! در حالی که هنوز این رجیستر از منظر CPU ، رفرنس متغییر قبلی در کد اصلی محسوب میشود!
            ...
            خوب علامت سول من دقیقا همین جاست؟؟!!
            اونهایی که چهار خط کد اسمبلی نوشته باشند، حتما یادشون هست که ما برای خلاصی از این حالت، توی برنامه اصلی، قبل از پرش به روال سرویس دهی وقفه و تابع، می اومدیم با دستور PUSH همه رجیسترهایی رو که نیاز داشتیم، توی پشته قرار میدادیم، بعد با خیال راحت، توی سرویس وقفه، مقادیر رجیسترهای عمومی رو دستکاری میکردیم و پس از بازگشت از وقفه یا تابع، با دستور POP، اطلاعات مورد نیاز رو از پشته برمیگردوندیم توی رجیسترهای عمومی!

            ...
            حالا چطور ممکنه کامپایلرهای مدرن امروزی از این مهم غافل باشند؟؟
            ...
            همین طور که این مطلب رو مینوشتم به ذهنم خورد، که شاید کلمه کلیدی Volatile میخواد به کامپایلر اعلام کنه که در هنگام پرش به زیرروالها، عملیات PUSH-POP را انجام بده یانه؟!!!
            یعنی اگه کامپایلر در حال دستکاری متغیری بود و همزمان وقفه ای اتفاق افتاد، تعیین اینکه رجیسترها در پشته، PUSH بشن یا نه، بستگی به این موضوع داشته باشه که اون متغیر از نوع Volatile تعریف شده باشه یا نه؟!!!
            (یه چیزی شبیه به NO_SAVE بسکام!)
            ...
            لطفا دوستان نظر بدن!
            عمل کامپایلر دقیقا حذف متغیر است.
            نکته اینکه وقتی شما یک متغییر دارید که در اینتراپت زیاد میشه این حتما در رم پیاده سازی و آدرس دهی میشه نه فلش مگر شما بخواهید که اصلا توصیه نمیشه

            کلا دو حالت افراد به مشکل بهینه سازی میخورند، البته بیشتر هست مورد کلی تر
            1- for هایی که معمولا برای تاخیر قرار داده میشه، این for اگر از دیدن یک هوش هم نگاه کنیم کار بیهودهای است شما کلی پول و انرژی را دارید شروع میکنید مینویسید 1 2 3 4 ...
            کامپایلر متوجه شده شما دارید کار بیهوده میکنید و عدد i , و ایندکس شما را ماکسیم عددی که قرار بوده باشد قرار میدهد و عملا delay حذف میشود. واقعا این است که در برنامه نویسی مدرن کسی وقت تلف نمیکند، مثلا یک RTOS مدیریت را بر عهده دارد برای اجرای تاخیر شما به سیستم میگویید من را 10 ثانیه دیگر صدا بزن، و نباید میکرو در یک بازه زیاد کار بیهوده کند

            2- اینتراپت
            مشکل اینتراپت هم از تفاوت بین C استاندارد و زبان میکرو رخ میدهد
            برنامه زیر
            کد:
            [FONT=Yekan]int i = 0;[/FONT]
            
            fun1()
            {
                i++;
            }
            
            
            main()
            {
                print(i);
            [FONT=Yekan]}[/FONT]
            در این کد هیچ گاه fun1 صدا زده نشده و در نتیجه کامپایلر فکر میکند که fun1 اضافه هست و به جای i همیشه عدد صفر را قرار میدهد، حالا میکرو بدون اینکه زبان c بداند fun1 را در یک وقفه اجرا میکند در این حالت همیشه صفر پرینت میشود چون fun1 حذف شده. کلا مشکل این است که شما یک تابع را خارج از روال استانداد صدا زده اید. در اینجا باید به کامپایلر اعلام کنید که شما نمیدانی ولی من میدانم این متغیر خارج از اراده تو تغییر خواهد کرد و تو این متغیر و توابعی که به ان ربط دارد را حذف نکن، آن کلمه volatile هست

            نکته آخر کامپایلر هیچ کاری را بدون حکمت انجام نمیدهد ؛ کامپایلر نویسی از سختترین کارهای دنیاست! کامپایلر تمام متغیر هایی که حذف کرده را به شما معرفی میکند، حتی مشکلاتی که کد دارد را میگوید و ....
            فکر میکنم با دستور زیر در keil
            جدیدترین ویرایش توسط Faateh; ۱۴:۱۱ ۱۳۹۷/۰۵/۲۰.

            دیدگاه


              #7
              پاسخ : UBUB؟ درباره volatile در C بنویسید!

              نوشته اصلی توسط Faateh نمایش پست ها
              ...
              نکته اینکه وقتی شما یک متغییر دارید که در اینتراپت زیاد میشه این حتما در رم پیاده سازی و آدرس دهی میشه نه فلش مگر شما بخواهید که اصلا توصیه نمیشه
              ...
              نکته آخر کامپایلر هیچ کاری را بدون حکمت انجام نمیدهد ؛ کامپایلر نویسی از سختترین کارهای دنیاست! کامپایلر تمام متغیر هایی که حذف کرده را به شما معرفی میکند، حتی مشکلاتی که کد دارد را میگوید و ....
              جناب مهندس قصد مجادله ندارم، فقط میخوام بحث به یه جایی برسه:
              هیچ جمله یا کلمه ای توی نوشته من به ذخیره دیتا در فلش و یا حذف کردن یک متغییر، مربوط نمیشه و حتی اشاره ای هم نداره!!!
              ؟؟؟
              فکر کنم عبارت "حافظه اصلی" شما رو به اشتباه انداخته!
              در حالی که توی بحث معماری کامپیوتر "حافظه اصلی" دقیقا به RAM اطلاق میشه و برای فلش و امثالهم عبارت "حافظه جانبی" به کار میره!
              ...
              نوشته اصلی توسط Faateh نمایش پست ها
              ...
              کل مسئله به بهینه سازی برمی گردد، شما در قسمت optimization کامپایلر مرحله otimize را -o0 قرار دهید هیچ کلمه volatile نیاز نیست.
              ...
              و اینکه میفرمائید عبارت Volatile کاملا به Optimization مربوط میشه، صرفا این نیست!
              من خودم (بدون اغراق) تا 11 هزار خط کد C توی Atmel_Studio نوشتم، با کلی تابع و کلی اینتراپت!!!
              و برای هیچ کدوم از متغییرهام هم، عبارت Volatile رو بکار نبردم!!
              و این در حالیست که از 8000 خط کد به بالا، مجبور شدم که Optimization رو روی سطوح 2 و 3 قرار بدم!
              و هیچ گونه ایراد یا باگی هم در عملکرد کد مشاهده نشده است نه در Optimize صفر و نه در بقیه سطوح!!
              (هر چند من معمولا به کامپایلر اعتماد 100% نمیکنم و همیشه راهکارهای خودم رو نیز اضافه میکنم، ولی نمیشه گفت که همش کار من بوده!!)
              ...
              شما با بار پردازشی و مصرف منابع سیستمی که در اثر PUSH و POP های پی در پی به پردازنده تحمیل میشه آشنایی دارید؟!
              مسلمه که یه بخش خیلی بزرگ از عملیات Optimization به کم کردن این بار مربوط میشه!! که لازمه آن اضافه و یا حذف کردن بلوکهایی از کد است که مسئول انجام این موارد هستند!!!
              جدیدترین ویرایش توسط ubub; ۱۹:۳۵ ۱۳۹۷/۰۵/۲۰.
              ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙

              دیدگاه


                #8
                پاسخ : UBUB؟ درباره volatile در C بنویسید!

                و برای هیچ کدوم از متغییرهام هم، عبارت Volatile رو بکار نبردم!!
                و این در حالیست که از 8000 خط کد به بالا، مجبور شدم که
                Optimization رو روی سطوح 2 و 3 قرار بدم
                !
                علتی که کار میکنه احتمالا جدا بودن فایل و توابع هست، مثلا O3 یعنی همه چیزبهینه و تمام فایلها را به عنوان یک فایل نگاه میکنه ، O2 یعنی کراس فایل بهینه نکن، برای همین برخی متغیر ها چون کامپایلر در دو فایل جدا دیده بهینه نمیکند، ( البته در کامپایلر ها ممکن هست معنی O1 O2 O3 تا حدودی تغییر کند)

                در فایل رفرنس کامپایلر keil آمده :

                Compiler optimization and the volatile keyword
                The compiler does not optimize the variables you have declared as volatile.

                In practice, you must declare a variable as volatile whenever you are:
                Accessing memory-mapped peripherals.
                Sharing global variables between multiple threads.
                Accessing global variables in an interrupt routine or signal handler.

                یعنی ممکنه متغییری توسط کامپایلر از محل اصلی خود در حافظه، فراخوانی شود و برای ادامه پردازش و افزایش سرعت در یکی از رجیسترهای عمومی قرار بگیره و برای مدت کوتاهی همون رجیستر، رفرنس اون متغییر برای CPU تلقی بشه!
                حالا اگه در این بین وقفه ای اتفاق بیافته و توی سرویس وقفه، اتفاقا از محل همین رجیستر برای ذخیره و دستکاری داده ها استفاده شده باشه، اون موقع پس از بازگشت از وقفه، دیگه مقدار اون رجیستر معتبر نیست! در حالی که هنوز این رجیستر از منظر CPU ، رفرنس متغییر قبلی در کد اصلی محسوب میشود!
                ...
                خوب علامت سول من دقیقا همین جاست؟؟!!
                اونهایی که چهار خط کد اسمبلی نوشته باشند، حتما یادشون هست که ما برای خلاصی از این حالت، توی برنامه اصلی، قبل از پرش به روال سرویس دهی وقفه و تابع، می اومدیم با دستور PUSH همه رجیسترهایی رو که نیاز داشتیم، توی پشته قرار میدادیم، بعد با خیال راحت، توی سرویس وقفه، مقادیر رجیسترهای عمومی رو دستکاری میکردیم و پس از بازگشت از وقفه یا تابع، با دستور POP، اطلاعات مورد نیاز رو از پشته برمیگردوندیم توی رجیسترهای عمومی!


                فکر میکنم این مسئله ربطی به volatile نداشته باشه؛ کامپایلر با اینتراپت ذخیره رجیستر را انجام میده و در پایان اینتراپت کل متغیر ها را برمیگرداند و کار را ادامه میدهد. این یک مسئله دیگر است

                کد:
                [RIGHT][COLOR=#28282B][FONT=Yekan]هیچ جمله یا کلمه ای توی نوشته من به ذخیره دیتا در فلش و یا حذف کردن یک متغییر، مربوط نمیشه و حتی اشاره ای هم نداره!!![/FONT][/COLOR][/RIGHT]
                من اشتباه برداشت کردم، ولی همین دسترسی ها هم بهینه میشوند

                کد:
                [RIGHT][COLOR=#28282B][FONT=Yekan]توی پردازنده ها ما برای ذخیره و دستکاری داده ها (عملوندها) حداقل دو تا گزینه داریم:[/FONT][/COLOR]
                [COLOR=#28282B][FONT=Yekan]1- خانه های RAM (پرتعداد با سرعت معمولی)[/FONT][/COLOR]
                [COLOR=#28282B][FONT=Yekan]2- رجیسترهای کاربرد عمومی (کم تعداد با سرعت بالا)[/FONT][/COLOR][/RIGHT]
                دقیقا درست هست و حداقل دو تا؛ در پردازنده های cortex A و M7 cache داریم که مدیریت حافظه cache هم با برنامه نویس هست اگر از ماژول های خاصی استفاده کند
                جدیدترین ویرایش توسط Faateh; ۲۰:۱۴ ۱۳۹۷/۰۵/۲۰.

                دیدگاه


                  #9
                  پاسخ : UBUB؟ درباره volatile در C بنویسید!

                  ممنون از اطلاعات مفیدتون!
                  فقط چندتا نکته و یه درخواست:
                  نوشته اصلی توسط Faateh نمایش پست ها
                  ... کامپایلر با اینتراپت ذخیره رجیستر را انجام میده و در پایان اینتراپت کل متغیر ها را برمیگرداند و کار را ادامه میدهد. ...
                  این موضوع کاملا به نوع پردازنده (و میزان منابعی که در اختیار داره) بستگی داره، و توی پردازنده های قدیمی تر مدیریت 100% این موارد با کد نویس هست (البته اسمبلی!) و توی چیپهای جدید تر، مثلا سریهای ARM ، ظاهرا همه رجیسترها بدون توجه به محتواشون اتوماتیک استک میشن! (مطمئن نیستم، به نقل از یکی از دوستان)!

                  نوشته اصلی توسط Faateh نمایش پست ها
                  ... علتی که کار میکنه احتمالا جدا بودن فایل و توابع هست، مثلا O3 یعنی همه چیزبهینه و تمام فایلها را به عنوان یک فایل نگاه میکنه...
                  بله فایل اصلی و توابع و ماکروها و ... جداست، ولی سرویس اینتراپتها، زیر کد اصلی اضافه شده!
                  و ضمنا من Optimization 3 رو هم قرار دادم!!!
                  نوشته اصلی توسط Faateh نمایش پست ها
                  ...
                  In practice, you must declare a variable as volatile whenever you are:
                  Accessing memory-mapped peripherals.
                  Sharing global variables between multiple threads.
                  Accessing global variables in an interrupt routine or signal handler...
                  تشکر!
                  مستلزم thread نویسی وجود سیستم عامل هست! پس در سایر موارد نقش Volatile ، کم رنگ تر میشه!
                  ولی دسترسی و دستکاری گلوبالها، توی اینتراپت، زیاد اتفاق می افته، خصوصا برای متغیرهایی که حالت ماشین رو ذخیره کردند!
                  فقط یه نکته مبهمه!
                  اینکه: پریفرالهای ما توی میکرو همه شون memory-mapped هستند!!!
                  ؟؟؟؟
                  ...
                  و درخواست اینکه اگه امکان داره تحقیقتون رو در این زمینه تکمیل کنید و بحث Volatile رو به یه جایی برسونید:
                  موارد و لزوم به کار گیری Volatile
                  تأثیر استفاده ش روی میزان Optimize و البته حجم کد!
                  اینکه تفسیر این عبارت ربطی به نوع کامپایلر داره؟!

                  البته نه صرفا از دید سیستم عاملی!! مواردی که خود کد نویس همه منابع سیستم رو مدیریت میکنه، حیاتی تره!!
                  ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙

                  دیدگاه


                    #10
                    پاسخ : UBUB؟ درباره volatile در C بنویسید!

                    کد:
                    [RIGHT][COLOR=#28282B][FONT=Yekan]اینکه: پریفرالهای ما توی میکرو همه شون memory-mapped هستند!!![/FONT][/COLOR]
                    [COLOR=#28282B][FONT=Yekan]؟؟؟؟[/FONT][/COLOR][/RIGHT]
                    یک رجیستر داده مثلا رجیستر داده پورت سریال مموری مپ هست و یک آدرس دارد مثل متغیر های دیگر، برای همین برای SDK و ;کدهایی که برای پشتیبانی IC نوشته میشه قبل رجیستر یک volatile داره؛ که کامپایلر بدونه اون آدرس بدون اطلاع عوض میشه

                    توی پردازنده های قدیمی تر مدیریت 100% این موارد با کد نویس هست (البته اسمبلی!)
                    اسمبلی کامپایل نمیشه و میره تو اسمبلر بعد لینکر

                    بله فایل اصلی و توابع و ماکروها و ... جداست، ولی سرویس اینتراپتها، زیر کد اصلی اضافه شده!
                    گزارش کامپایلر مهمه که چه تصمیماتی گرفته و چرا

                    البته نه صرفا از دید سیستم عاملی!! مواردی که خود کد نویس همه منابع سیستم رو مدیریت میکنه، حیاتی تره!!



                    اینهایی که نوشتم سیستم عاملی نیست، و لینکهایی که دادم دقیقا مشخصات کامپایلر هست. دراون فایل ها تمام اختلافات کامپایلر با C استاندارد و روش اجرا و تفسیر کدها نوشته شده
                    جدیدترین ویرایش توسط Faateh; ۲۱:۳۰ ۱۳۹۷/۰۵/۲۱.

                    دیدگاه


                      #11
                      پاسخ : UBUB؟ درباره volatile در C بنویسید!

                      سلام دوستان،ببخشید در ادامه همین بحث،من واسه خوندن ds1307 داخل یه وقفه تایمر استفاده کردم و ساعت رو میخونه،و داخل یه وقفه تایمر دیگه باید یه سری عملیات زیاضی انجام بده و همچنین یه سری مقادیر رو رو ال سی دی نشون بده،که زمان رو هم میخوام توی همین وقفه تایمر نشون بدم،حالا مشکلی که هست متغییر های زمان رو به صورت volatile تعریف کردم،ولی باز توی عمل درست نشون نمیده مقادیر رو،باید به چه شکل این کارو کرد؟کلا میخوام از وقفه ها استفاده کنم و حلقه while رو خالی بذارم

                      دیدگاه

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