اطلاعیه

Collapse
No announcement yet.

مشکل در مورد حذف قسمتهایی از کد توسط کامپالر

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

    مشکل در مورد حذف قسمتهایی از کد توسط کامپالر

    سلام

    برای میکرو AVR از winavr و avrlib استفاده میکنم.
    تو avrlib یه تابع داریم به نام delay_us که تاخیر میکرو ثانیه درست میکنه.
    حالا مشکل
    اصلا تاخیر اجرا نمیشه.
    در خود تابه برای تاخیر یه حلقه for نوشته و بعد اینو گذاشته ;{}
    کد:
    void delay_us(unsigned short time_us) 
    {
    	unsigned short delay_loops;
    	register unsigned short i;
    
    	delay_loops = (time_us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty) 
    
    	// one loop takes 5 cpu cycles 
    	for (i=0; i < delay_loops; i++) {};
    }
    ولی کامپالر فکر میکنه که چون جلوی for هیچی نیست پس در واقع کدی برای حلقه for تولید نمیکنه .

    احتمالا به یکی از موارد optimize کردن کامپایل مربوط میشه.
    چطور بهش بفهمونم که برای این هم کد معادلش رو تولید کنه؟



    #2
    پاسخ : مشکل در مورد حذف قسمتهایی از کد توسط کامپالر

    احتمالا با قرار دادن { , } در دو خط کارتون راه میوفته.
    بجای اینکه بنویسید
    for (i=0; i < delay_loops; i++) {};
    l
    بنویسید
    for (i=0; i < delay_loops; i++) {
    };
    l
    احتمالا درست میشه.
    الهم عجل لولیک الفرج

    دیدگاه


      #3
      پاسخ : مشکل در مورد حذف قسمتهایی از کد توسط کامپالر

      سلام

      خیلی ممنون که جواب دادید. اون کارو انجام دادم و کلی کارهای دیگه ولی نشد.
      یه کار دیگش کردم و توی {} مجبور شدم آخرش یه nop بنویسم. و این دفعه کدش تولید شد.

      حلقه for قبلی رو خودش گفته بود که 5 سیکل ماشین طول میکشه.
      حالا که یه nop اضافه کردم تعداد سیکلهای ماشین چقدر میشه؟
      یه سوال دیگه؟
      هر سیکل ماشین چند clock میشه؟

      مرسی

      دیدگاه

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