اطلاعیه

Collapse
No announcement yet.

کامپایلر IAR

Collapse
این موضوع برجسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    پاسخ : کامپایلر IAR

    نوشته اصلی توسط n340
    استفاده از sprintf توی این کامپایلر اصلا مغرون به صرفه نیست
    حجم زیادی از فلش رو پر میکنه
    خوب آیا راه دیگری هم هست مثلا تابع زیر رو جور دیگری هم میشه نوشت :


    /*.....Display function: */
    void lcddp(char number){
    char str[16];
    char phname[]={'\0','R','S',&#039 ;T'};
    sprintf(str,"PF.%c = %2.3f",phname[number],PF[number]);
    lcd_home();
    lcd_puts(str);
    }



    دیدگاه


      پاسخ : کامپایلر IAR

      نوشته اصلی توسط شهریار رجب زاده
      حالا یه مشکل دیگه هست وقتی lcd رو توی while که گاهی وقت ها به وجود میاد پاک میکنم lcd چرت و پرت نشون میده ولی بیرون while درسته oo:
      میشه فایل برنامه تون (با map) رو بزارید تا ببینم ؟

      دیدگاه


        پاسخ : کامپایلر IAR

        نوشته اصلی توسط mojtaba_led
        میشه فایل برنامه تون (با map) رو بزارید تا ببینم ؟
        کد:
        #include <ioavr.h>
        #include <intrinsics.h>
        #include "lcd_0.h"
        
        __flash char a[]="XMEGA";
        char s[5];
        unsigned int b=0;
        bool change=false;
        void main()
        {
         lcd_init(16,2);
         lcd_gotoxy(6,0);
         lcd_puts_flash(a);
         PORTD_DIR=0xff;
         OSC_CTRL=0x03;       
         while(!(OSC_STATUS & 2 )); 
         CCP=0xd8;
         CLK_CTRL=0x01;
         PMIC_CTRL=0x01;
         PORTC_INTCTRL=0x05;
         PORTC_PIN1CTRL=0x11;
         PORTC_PIN2CTRL=0x11;
         PORTC_INT0MASK=0x02;
         PORTC_INT1MASK=0x04;
         PORTC_DIR=0x01;
         TCC0_PER=0xffff;
         TCC0_CCA=0;
         TCC0_CTRLB=0x16;
         TCC0_CTRLA=0x03;
         __enable_interrupt();
         lcd_gotoxy(0,1);
         lcd_puts_ram("TCC0_CCA:");
         sprintf(s,"%u",b);
         lcd_gotoxy(10,1);
         lcd_puts_ram(s);
         while(1)
         {
          if(change==true)
          {
           b=TCC0_CCA;
           sprintf(s,"%u",b);
           lcd_cmd(0x01);
           lcd_gotoxy(6,0);
           lcd_puts_flash(a);
           lcd_gotoxy(0,1);
           lcd_puts_ram("TCC0_CCA:");
           lcd_puts_ram(s);
           change=false;
          }
         }   
        }
        #pragma vector=PORTC_INT0_vect
        __interrupt void PORTC_INT0()
        {
         TCC0_CCA+=2048;
         change=true;
        }
        #pragma vector=PORTC_INT1_vect
        __interrupt void PORTC_INT1()
        {
         TCC0_CCA-=2048;
         change=true;
        }
        این برنامه بود
        اینم MAP
        http://rajab-electronic.persiangig.com/Xmega/1.map

        دیدگاه


          پاسخ : کامپایلر IAR

          خوب من که مورد نمیبیم فقط یک سوال میتونم بپرسم cstack , rstack رو مطابق با این ها تنظیم کردید ؟


          Stack used : 000000FB 0000001C


          دیدگاه


            پاسخ : کامپایلر IAR

            نوشته اصلی توسط mojtaba_led
            خوب من که مورد نمیبیم فقط یک سوال میتونم بپرسم cstack , rstack رو مطابق با این ها تنظیم کردید ؟


            Stack used : 000000FB 0000001C
            rstack=16
            cstack=0x5ff

            دیدگاه


              پاسخ : کامپایلر IAR

              طبق فایل map
              حداقل rstack = 1c
              حداقل cstack = fb

              دیدگاه


                پاسخ : کامپایلر IAR

                نوشته اصلی توسط mojtaba_led
                طبق فایل map
                حداقل rstack = 1c
                حداقل cstack = fb
                oo:
                اون ها رو تو قسمت options زدم ولی اینا نیست مقدارشون
                به نظرتون مشکل چیه؟؟؟؟
                همش از lcd_clear هست وقتی جابه جاش میکنم بازم اینطوری میشه

                دیدگاه


                  پاسخ : کامپایلر IAR

                  ببخشید مشکل به خاطر یه باگ توی کتابخونه lcd بود :redface:

                  دیدگاه


                    پاسخ : کامپایلر IAR

                    نوشته اصلی توسط شهریار رجب زاده
                    ببخشید مشکل به خاطر یه باگ توی کتابخونه lcd بود :redface:
                    خدا روشکر که مشکلتون برطرف شد ، راستش بدجوری رفته بود تو مخم
                    حالا اگه میشه کتابخونه و باگی که ازش پیدا کردید رو اینجا بزارید تا حداقل من هم ازش استفاده کنم !

                    دیدگاه


                      پاسخ : کامپایلر IAR

                      نوشته اصلی توسط mojtaba_led
                      خدا روشکر که مشکلتون برطرف شد ، راستش بدجوری رفته بود تو مخم
                      حالا اگه میشه کتابخونه و باگی که ازش پیدا کردید رو اینجا بزارید تا حداقل من هم ازش استفاده کنم !
                      یکم صبر کنید فایل های مورد نیاز و کتابخونه + آموزش استفاده از اون ها رو مینویسم میزارم تو تاپیک آموزش خودم
                      فقط یه چیزی این CSTACK چیه؟

                      دیدگاه


                        پاسخ : کامپایلر IAR

                        CSTACK همون DATA STACK هست که برای ذخیره سازی برخی از رجیسترهایی که در توابع یا وقفه ها استفاده شده اند در لحظه ورود به تابع یا اجرای وقفه استفاده میشوند ، برای این که بهتر متوجه بشید پیشنهاد میکنم مطلب زیر هم که مربوط به تایپیک بررسی APPNOTE های ATMEL هت رو هم بخونید :

                        کامپایلر IAR رجیسترهای عمومی را به صورت شکل زیر بخش بندی می کند :


                        1) رجیسترهای چرک نویس (Scratch Registers) رجیسترهایی هستند که در جریان فراخوانی توابع و وقفه ها ذخیره نمی شوند .
                        2) رجیسترهای محلی (Local Register) رجیسترهایی هستند که در جریان فراخوانی توابع و وفقه ها در Data Stack ذخیره میشوند .
                        3) رجیستر Y به عنوان اشاره گر به محل آغازین Data Stack در حافظه SRAM استفاده می شود .

                        4) رجیستر های چرک نویس (Scratch Registers) برای تبادل داده های ورودی به و برگشتی از توابع استفاده میشوند .

                        زمانی که یک تابع فراخوانی می شود مقادیر ورودی تابع در رجیسترهای R16-R23 متناسب با اندازه مقادیر قرار میگیرند . و زمانی هم که یک تابع یک مقدار را برمیگرداند آن مقدار در داخل رجیستر های R16-R19 متناسب با اندازه مقداربرگشتی از تابع قرار می گیرد از این رو میتوان نتیجه گرفت حداکثر خروجی یک تابع 4 بایت می باشد .

                        در جدول زیر نحوه قرار گیری ورودی های یک تابع در رجیسترهای R16-R23 متناسب با اندازه ورودی ها در هنگام فراخوانی توابع نشان داده شده است :


                        مثالی از یک تابع به زبان C :

                        int get_port(unsigned char temp, int num)

                        همانطور که میبینید تابع فوق در کل 3 بایت ورودی و 2 بایت هم خروجی دارد طبق جدول فوق در هنگام فراخوانی تابع فوق پارامتر تک بایتی temp در رجیستر R16 و پارارمتر 2 بایتی num در رجیستر های R20:R21 قرار میگیرند . همچنین مقدار خروجی تابع که دو بایتی هست در داخل رجیستر های R16:R17 قرار میگیرد .

                        اما اگر تابعی که فراخوانی می شود بیشتر از دو پارامتر ورودی داشته باشد ، دو پارامتر اول مطابق جدول فوق میان تابع و رجیستر های محلی مبادله شده و مابقی پارامتر ها هم میان تابع و DATA STACK مبادله میشوند میگیرند .
                        اگر متغیر های ورودی تابعی که فراخوانی میشود به شکل "struct or union" باشند یک اشاره گر این ساختار داده وردوی را بین تابع و DATA STACK مبادله می کند .
                        و اما اگر تابع هیچ پارامتری به عنوان ورودی نداشته باشد پس نیازی به استفاده از هیچ کدام یک از رجیستر های محلی را ندارد و از طرفی برای حفظ مقدار این رجیستر ها از تغییرات احتمالی در تابع مقدار آن ها را در داخل DATA STACK پوش می نماید همچنین مقدار خروجی تابع نیز در داخل رجیسترهای R16-R19 متناسب با اندازه مقدار برگشتی قرار میگیرد .

                        ____________________________________
                        البته این موضوع برای میکروکنترلر AVR سری مگا و قبل از اون هست !

                        دیدگاه


                          پاسخ : کامپایلر IAR

                          نوشته اصلی توسط n340
                          سوال:برنامه نوشته شده که حجم فایل تولیدی بیشتر از 32 کیلو بایت هست
                          ایا خود iar نسبت به افزایش حجم خطا یا گزارشی نمیده
                          چرا خطا میده اما اگر منظورتون از حجم فایل اینه که این حجم معادل فضا اشغال شده از حافظه flash هست ، خیر این طور نیست مقدار حجم اشغال شده از فلش برابر با حجم کد تولید شده توسط کامپایلر هست که می تونید اون رو از داخل فایل map استخراج کنید
                          برای مثال توی یک برنامه که با tiny2313 نوشتم توی فایل map اش نوشته شده :


                          SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
                          ======= ===== ============= =========== ==== ==== =====
                          INTVEC CODE 00000000 - 0000001B 1C com 1
                          ?FILL1 CODE 0000001C - 00000025 A rel 0
                          SWITCH CODE 00000026 - 00000039 14 rel 1
                          INITTAB CODE 0000003A - 0000003D 4 rel 0
                          CODE CODE 0000003E - 000006EF 6B2 rel 1


                          خوب این یعنی تا خونه 6EE هگزه به کدهای برنامه اختصاص داده شده که این مقدار معادل 1774 بایت هست از طرفی مقدار حافظه فلش TINY2313 برابر با 2 کیلو بایت هست که معادل 2048 بایت میشه پس حجم اشغال شده از فضای فلش برابر با :

                          % FLASH USED = ( 1774/2048)*100 = 86.62%

                          دیدگاه


                            پاسخ : کامپایلر IAR

                            از فایل MAP چجوری استفاده کنیم؟

                            دیدگاه


                              پاسخ : کامپایلر IAR

                              نوشته اصلی توسط شهریار رجب زاده
                              از فایل MAP چجوری استفاده کنیم؟
                              به نظر من که حالا یه یک هفته ای هست که با این کامپایلر واقعا تمام عیار دارم کار میکنم یکی از مهمترین خروجی های این نرم افزار همین فایل MAP هست که تمام اطلاعات پروژه از کامند های XLINK تا همین مقدار CSTACK , RSTACK رو میشه ازش استخراج کرد البته من به اطلاعاتی که تا الان تونستم استخراج کنم زیاد مطمئن نیستم و امیدوارم در مورد مطالبی که در رابطه با استخراج اطلاعات از این فایل مینویسم دوستان اشتباهاتم رو بهم متذکر شوند ولی در هر صورت تا اونجا که من فهمیدم این فایل یک آیینه تمام نما از پروژه شما ست!
                              در مورد نحوه استفاده از این فایل در ابتدا باید مثلا بدونید که : INTVEC چیه تا بعد بتونید از اطلاعاتی که در موردش داده شده استفاده کنید

                              دیدگاه


                                پاسخ : کامپایلر IAR

                                نوشته اصلی توسط mojtaba_led
                                به نظر من که حالا یه یک هفته ای هست که با این کامپایلر واقعا تمام عیار دارم کار میکنم یکی از مهمترین خروجی های این نرم افزار همین فایل MAP هست که تمام اطلاعات پروژه از کامند های XLINK تا همین مقدار CSTACK , RSTACK رو میشه ازش استخراج کرد البته من به اطلاعاتی که تا الان تونستم استخراج کنم زیاد مطمئن نیستم و امیدوارم در مورد مطالبی که در رابطه با استخراج اطلاعات از این فایل مینویسم دوستان اشتباهاتم رو بهم متذکر شوند ولی در هر صورت تا اونجا که من فهمیدم این فایل یک آیینه تمام نما از پروژه شما ست!
                                در مورد نحوه استفاده از این فایل در ابتدا باید مثلا بدونید که : INTVEC چیه تا بعد بتونید از اطلاعاتی که در موردش داده شده استفاده کنید
                                خوب INTVEC همون وکتور وقفه هست

                                دیدگاه

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