ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 11
  1. #1
    2008/11/04
    490
    487

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

    سلام به همه.
    لطفا اطلاعات خود را در مورد کلمه کلیدی volatile در زبان C به اشتراک بگذارید!
    ...
    چیزهایی رو که پس از چندتا سرچ ساده به دست میاد، میدونم!
    سوال من به این خاطر هست که، اون چیزهایی که در اولین سرچها پیدا میشه، خیلی وحشتناکه !!!
    یعنی توی دنیای کامپایلرهای مدرن امروزی بیشتر به فحش رکیک شبیه!!
    ...
    من احساس میکنم که کاربرد این کلمه کلیدی باید منسوخ شده باشه!!
    نظر شما چیه؟؟
    ...
    (در این خصوص نظر دو تن از اساتید رو به طور خاص جویا میشم: جناب طراح و جناب روح الامین)
    (ضمنا اگه توی عنوان پست، ایرادی احساس میکنید، عذرخواهی میکنم، ممکنه برخی از دوستان دلیلش رو بدونند!)
    ویرایش توسط ubub : 2018/07/07 در ساعت 16:29
    ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙
  2. #2
    2015/02/07
    39
    6

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

    سلام...اره این سوال مطمعا برای خیلیا پیشاومده از جمله خودم.
    ولی اطلاعاتی ک منم دارم پیش پا افتاده هست.
    دوستان بزرگواری ک آشنایی بیشتری دارند لطفا راهنمایی کنند.
  3. #3
    2009/10/27
    تهران
    3,300
    754

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

    در بخش یازدهم فیلم های آموزش کدنویسی کاربردی برای میکروکنترلر درباره volatile توضیح داده شده است:

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد
    امکان پاسخگویی به سوالات از طریق پیغام خصوصی مقدور نیست
  4. #4
    2016/06/06
    92
    55

    پاسخ : 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. #5
    2008/11/04
    490
    487

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

    سلام به همه.
    ضمن تشکر از همه دوستانی که مطلب رو دنبال میکنند و تشکر ویژه از استاد خودم، جناب

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

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

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

    پاسخ : 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 استاندارد و زبان میکرو رخ میدهد
    برنامه زیر
    کد:
    int i = 0;
    
    fun1()
    {
        i++;
    }
    
    
    main()
    {
        print(i);
    }
    در این کد هیچ گاه fun1 صدا زده نشده و در نتیجه کامپایلر فکر میکند که fun1 اضافه هست و به جای i همیشه عدد صفر را قرار میدهد، حالا میکرو بدون اینکه زبان c بداند fun1 را در یک وقفه اجرا میکند در این حالت همیشه صفر پرینت میشود چون fun1 حذف شده. کلا مشکل این است که شما یک تابع را خارج از روال استانداد صدا زده اید. در اینجا باید به کامپایلر اعلام کنید که شما نمیدانی ولی من میدانم این متغیر خارج از اراده تو تغییر خواهد کرد و تو این متغیر و توابعی که به ان ربط دارد را حذف نکن، آن کلمه volatile هست

    نکته آخر کامپایلر هیچ کاری را بدون حکمت انجام نمیدهد ؛ کامپایلر نویسی از سختترین کارهای دنیاست! کامپایلر تمام متغیر هایی که حذف کرده را به شما معرفی میکند، حتی مشکلاتی که کد دارد را میگوید و ....
    فکر میکنم با دستور زیر در keil

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    ویرایش توسط Faateh : 2018/08/11 در ساعت 13:11
  7. #7
    2008/11/04
    490
    487

    پاسخ : 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 : 2018/08/11 در ساعت 18:35
    ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙
  8. #8
    2016/06/06
    92
    55

    پاسخ : 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 نداشته باشه؛ کامپایلر با اینتراپت ذخیره رجیستر را انجام میده و در پایان اینتراپت کل متغیر ها را برمیگرداند و کار را ادامه میدهد. این یک مسئله دیگر است

    کد:
    هیچ جمله یا کلمه ای توی نوشته من به ذخیره دیتا در فلش و یا حذف کردن یک متغییر، مربوط نمیشه و حتی اشاره ای هم نداره!!!
    من اشتباه برداشت کردم، ولی همین دسترسی ها هم بهینه میشوند

    کد:
    توی پردازنده ها ما برای ذخیره و دستکاری داده ها (عملوندها) حداقل دو تا گزینه داریم: 1- خانه های RAM (پرتعداد با سرعت معمولی) 2- رجیسترهای کاربرد عمومی (کم تعداد با سرعت بالا)
    دقیقا درست هست و حداقل دو تا؛ در پردازنده های cortex A و M7 cache داریم که مدیریت حافظه cache هم با برنامه نویس هست اگر از ماژول های خاصی استفاده کند
    ویرایش توسط Faateh : 2018/08/11 در ساعت 19:14
  9. #9
    2008/11/04
    490
    487

    پاسخ : 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. #10
    2016/06/06
    92
    55

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

    کد:
    اینکه: پریفرالهای ما توی میکرو همه شون memory-mapped هستند!!! ؟؟؟؟
    یک رجیستر داده مثلا رجیستر داده پورت سریال مموری مپ هست و یک آدرس دارد مثل متغیر های دیگر، برای همین برای SDK و ;کدهایی که برای پشتیبانی IC نوشته میشه قبل رجیستر یک volatile داره؛ که کامپایلر بدونه اون آدرس بدون اطلاع عوض میشه

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

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

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


    اینهایی که نوشتم سیستم عاملی نیست، و لینکهایی که دادم دقیقا مشخصات کامپایلر هست. دراون فایل ها تمام اختلافات کامپایلر با C استاندارد و روش اجرا و تفسیر کدها نوشته شده
    ویرایش توسط Faateh : 2018/08/12 در ساعت 20:30
صفحه 1 از 2 12 آخرین
نمایش نتایج: از 1 به 10 از 11

موضوعات مشابه

  1. پاسخ: 13
    آخرين نوشته: 2019/04/09, 14:02
  2. متغيير volatile
    توسط mostafa6369 در انجمن میکروکنترلرهای AVR
    پاسخ: 5
    آخرين نوشته: 2016/04/27, 14:36
  3. منظور از volatile تو code vision چیه؟
    توسط majid.4206 در انجمن میکروکنترلرهای AVR
    پاسخ: 20
    آخرين نوشته: 2012/11/13, 08:54
  4. static,extern,Volatile
    توسط hunybal در انجمن C , C++ , C#
    پاسخ: 1
    آخرين نوشته: 2012/09/22, 13:09
  5. volatile unsigned long
    توسط ieee7 در انجمن NXP
    پاسخ: 3
    آخرين نوشته: 2011/10/20, 03:20

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •