اطلاعیه

Collapse
No announcement yet.

کامپایلر IAR

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

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

    نوشته اصلی توسط n340
    جناب ژوپیتر می تونید بیشتر توضیح بدید و یک مثال بزنید
    بعد سوال برام پیش اومد که اگه تو فلش ثبت بشه که دیگه نمی شه متغییر از رم خوند و نمایش داد
    اون ماکروی فلش در حقیقت به پارسر برنامه این اطلاع رو میده که کامپایلر رو از درخواست کاربر گاه کنه که آدرسی که قراره پوینتر آرایه به اون اشاره بکنه در رم نیست بلکه در فلش هست و خاصیت فقط خواندنی هم داره و نمیشه روش دوباره اطلاعات رو نوشت، مثلا اگه من بخوام 9 کیلو بایت جمله رو روی ال سی دی اسکرول کنم با رم هرگز نمیتونم این کار رو بکنم ولی با فلش میشه.
    اگه جملات ثابت در پرینتها تون دارین این روش بسیار مناسبه و به اندازه حجم فلش میکرو که خالی مونده میشه جمله ها رو ذخیره کرد، در حالت عادی همه جملات که در کد نوشته شده اند در فلش ذخیره میشن ولی محل قرار گیریشون در فلش جایی خواهد بود که همراه کد برنامه به رم انتقال پیدا کنن ولی با ماکروی فلش ما از اینکار جلوگیری میکنم و LPM رو مجبور میکنیم که از فلش اطلاعات رو بخونه. برای جملاتی هم که متغییر هستند فقط و فقط از رم میشه استفاده کرد و در فلش ممکن نیست.
    اسمایل، تومورو ویل بی وُرس

    دیدگاه


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

      حرف شما متین
      ولی خوب در این مورد دیگه استفاده از printf بی معنی میشه
      میشه از LCDStringflash و برای سریال هم از puts استفاده کرد
      که معقول تر به نظر می رسه
      ماهیت دستور پرینتف و sprintf برای کار با متغییر ها هست ممنون
      از دوستان کسی کتابخونه کار با mmc برای حالت سکتوری و یا فت نداره
      بازم ممنون
      هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
      بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
      میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

      تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

      دیدگاه


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

        نوشته اصلی توسط n340
        حرف شما متین
        ولی خوب در این مورد دیگه استفاده از printf بی معنی میشه
        میشه از LCDStringflash و برای سریال هم از puts استفاده کرد
        که معقول تر به نظر می رسه
        ماهیت دستور پرینتف و sprintf برای کار با متغییر ها هست ممنون
        از دوستان کسی کتابخونه کار با mmc برای حالت سکتوری و یا فت نداره
        بازم ممنون
        در مورد اینکه استفاده از printf بی معنی میشه شک دارم، اگه واضحتر توضیح بدین ممنون میشم. همون استرینگهایی که در فلش ذخیره میشن هم میتونن از علامات d %c% و غیره نیز شامل بشن فقط این خود متغییر هست که در رم قرار داره، مثلا برای چاپ یک آرایه 10 عضوی اینتیجر 16 بیتی 160 بیت از رم برای متغییر ها استفاده میشه، حالا اگه به صورت معمول در کد از printf استفاده کنید و از 10 تا علامت d% پشت سر هم برای چاپ همزمان آرایه استفاده کنید به اندازه 10 کاراکتر از رم هم برای همین علامات استفاده میشه که اگه توی فلش ذخیره بشه دیگه برای علامات طرفیت رم اشغال نمیشه.
        همونطور که خودتون هم نوشتید printf و sprintf برای تبدیل اعداد به استرینگ به کار میره اما علاوه بر استفاده از رم برای متغییری که عدد در اون ذخیره میشه، برای ذخیره اون علاماتی هم که به کار میبرید از رم استفاده میکنه و با روشی که گفتم فقط از فلش اون علامات رو میخونه، در مواقعی که تعداد علامات زیادن مثل لود کرد یک استراکچر خیلی کاربردیتر میشه. مثلا:


        sprintf(buffer, "Age:%d Name:%s Level:%c GPA:%f", age, name, level, gpa);


        __flash char[] mystring = "Age:%d Name:%s Level:%c GPA:%f";
        sprintf(buffer, mystring, age, name, level, gpa);

        در بخش دوم حافظه کمتری از رم استفاده میشه.
        اسمایل، تومورو ویل بی وُرس

        دیدگاه


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

          برای کاربرد مد نظر جناب ژوپیتر بجای printf و sprintf در IAR ظاهرا از توابع printf_P و sprintf_P استفاده می شود که برای این منظور باید pgmspace.h در ابتدای برنامه include شود.

          توضیح printf_P

          Similar to printf except that the format string is in flash memory, not in data memory.


          توضیح sprintf_P

          Identical to sprintf except that the format string is in flash memory, not in data memory
          .
          اوژن: به معنای افکننده و شکست دهنده است
          دانایی، توانایی است-Knowledge is POWER
          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

          دیدگاه


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

            می خواستم بدونم معادل PGM_P و PSTR (تو WINAVR) در کامپایلر IAR چیه؟

            http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html
            دکتر شریعتی:

            زنده بودن را به بیداری بگذرانیم که سالها به اجبار خواهیم خفت.

            دیدگاه


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

              نوشته اصلی توسط NAO_ROBOT
              می خواستم بدونم معادل PGM_P و PSTR (تو WINAVR) در کامپایلر IAR چیه؟
              PGM_P در IAR هم وجود دارد و با include کردن pgmspace.h قابل استفاده خواهد بود. برای PSTR من معادلی ندیدم اما می توانید آن را تعریف کنید:

              #define PSTR(s) ((const char __flash *)(s))
              اوژن: به معنای افکننده و شکست دهنده است
              دانایی، توانایی است-Knowledge is POWER
              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

              دیدگاه


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

                سلام

                یک سوال از خدمت دوستان در مورد کامپایلر داشتم:

                1-کد های تولید شده درiar وwinavr در بهترین حالت کدومشون بهینه تر هستن.(از نظر سایز و سرعت)
                2-ایا کامپایلر iar برتری ویژه ای به winavr دارد.
                دکتر شریعتی:

                زنده بودن را به بیداری بگذرانیم که سالها به اجبار خواهیم خفت.

                دیدگاه


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

                  نوشته اصلی توسط NAO_ROBOT
                  1-کد های تولید شده درiar وwinavr در بهترین حالت کدومشون بهینه تر هستن.(از نظر سایز و سرعت)
                  در IAR دو نوع optimization برای سرعت و حجم کد وجود دارد که مجموع حالت ها به 6 سطح مختلف از بهینه سازی می رسد. سرعت و حجم می توانند با یکدیگر در تعارض قرار بگیرند، مثلا برای بالا بردن سرعت می توان بجای call کردن یک زیر برنامه، هر بار آن را در کد تکرار کرد که این روش سرعت را بالا می برد اما منجر به افزایش حجم کد می شود. یک حالت هفتم بدون اعمال optimization هم وجود دارد که نقطه میانه بین حجم و سرعت است و در کاربردها بستگی به نیاز هر یک از این سطوح 7 گانه قابل انتخاب هستند.

                  نوشته اصلی توسط NAO_ROBOT
                  2-ایا کامپایلر iar برتری ویژه ای به winavr دارد.
                  در تاپیک زیر مقداری در این مورد بحث شده است:

                  http://www.eca.ir/forum2/index.php?topic=40891.0
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


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

                    سلام به همگی
                    می خواستم بدونم فرق بین کتابخانه های DLIB وCLIB چیه و هر کدامشون در کجا بکار گرفته می شوند؟

                    دیدگاه


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

                      سلام
                      CLIB کتابخونه های مربوط به C و DLIB کتابخونه های مربوط به ++C هستن نحوه استفادشون هم بستگی به این داره که شما از کدوم زبان برنامه نویسی و کتابخونه ها استفاده کنیدو تو HELP نرم افزار فکر کنم توضیح داده.
                      دکتر شریعتی:

                      زنده بودن را به بیداری بگذرانیم که سالها به اجبار خواهیم خفت.

                      دیدگاه


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

                        توضیح مربوط به CLIB و DLIB از فایل PDf مربوط به کامپایلر:

                        There are two different sets of runtime libraries provided:

                        ● The IAR DLIB Library, which supports ISO/ANSI C and C++. This library also supports floating-point numbers in IEEE 754 format and it can be configured to include different levels of support for locale, file descriptors, multibyte characters, et cetera.
                        ● The IAR CLIB Library is a light-weight library, which is not fully compliant with ISO/ANSI C. Neither does it fully support floating-point numbers in IEEE 754 format or does it support Embedded C++. (This library is used by default).
                        اوژن: به معنای افکننده و شکست دهنده است
                        دانایی، توانایی است-Knowledge is POWER
                        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                        دیدگاه


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

                          سلام

                          من یه کتابخونه lcd کاراکتری برای xmega تهیه کردم و تو winavr خیلی خوب جواب داده الان دارم به iar تبدیل میکنم همه قسمتهاش تبدیل کردم ولی تو این قسمت از برنامه که بصورت اسمبلی هستش یه error دارم و حل نمیشه دوستان اگه کسی اطلاعاتی داره کمک کنه؟
                          اینم اون قسمت از برنامه:
                          کد:
                          /*************************************************************************
                           delay loop for small accurate delays: 16-bit counter, 4 cycles/loop
                          *************************************************************************/
                          static inline void _delayFourCycles(unsigned int __count)
                          {
                            (if ( __count == 0
                            
                              asm ( "rjmp 1f\n 1:" );  // 2 cycles
                          
                            else
                          
                              asm (
                            	  "1: sbiw %0,1" "\n\t"         
                            	  brne 1b"               // 4 cycles/loop"
                            	  : (w" (__count="
                            	  : "0" (__count)
                            	  );
                          }

                          اینم error:
                          تو 2 سطر اخر برنامه
                          Error[Pe018]: expected a &quot" C:\Users\POORIA\Desktop\IAR_TEXT LCD\lcd.c 106
                          دکتر شریعتی:

                          زنده بودن را به بیداری بگذرانیم که سالها به اجبار خواهیم خفت.

                          دیدگاه


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

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

                            دیدگاه


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

                              سلام
                              اقای کی نژاد سورس تغییر داده شده برای IAR مربوط به LCD کاراکتری رو برای بررسی اون ERROR ذکر شده در بالا ضمیمه میکنم،اگه براتون امکان پذیر بود چک کنید ببینید مشکل کجاست،جون من هم ARM کار میکنم و هم XMEGA برای همین ارادت ویژه ای به IAR پیدا کردم و دوست دارم مشکل زیادی با این کامپایلر نداشته باشم.

                              http://up.iranblog.com/images/cf9yzpbhaj0rt73cfd10.rar
                              دکتر شریعتی:

                              زنده بودن را به بیداری بگذرانیم که سالها به اجبار خواهیم خفت.

                              دیدگاه


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

                                سلام.
                                حین کار با وقفه های تایمر XMEGAآ‌در IARآ‌به یه مشکل عجیب برخورد کردم، گفتم اینجا مطرح کنم که هم تجربه ای باشه و هم شاید به جوابم برسم.
                                کد این هست:

                                کد:
                                
                                #include "avr_compiler.h"
                                #include "port_driver.h"
                                #include "TC_driver.h"
                                #include "dac_driver.h"
                                //------------
                                struct _ULTRASONIC
                                {
                                  unsigned int DistanceCM;
                                  unsigned char Enable:1;
                                  unsigned char EchoReady:1;  
                                  unsigned int TimeCNT;
                                }UltraSonic;
                                uint16_t DACVAL=0;
                                
                                
                                inline void initial(void);
                                inline void Timer_Init(void);
                                void main(void)
                                {
                                  OSC.CTRL|=OSC_RC32MEN_bm;
                                  while(!(OSC.STATUS & OSC_RC32MRDY_bm));
                                  CCP=CCP_IOREG_gc;
                                  CLK.CTRL=CLK_SCLKSEL_RC32M_gc; 
                                  
                                  
                                  PORTE.DIRSET=0x0c;
                                  PORTE.OUTSET=0x0c;
                                  initial();
                                  DAC_SingleChannel_Enable(&DACB,DAC_REFSEL_INT1V_gc,false);  
                                  PORTE.OUTCLR=0x08;      
                                  PORTA.OUTSET=0x01;   
                                  UltraSonic.DistanceCM=10;
                                  PORTA.DIRSET=0x04;
                                  while(1)
                                  {
                                    PORTA.OUTSET=0x01;   
                                    delay_us(160);
                                    PORTA.OUTCLR=0x01;       
                                    delay_us(500); 
                                    UltraSonic.TimeCNT=0;            
                                  }    
                                  
                                  
                                  
                                }
                                //---------------------------
                                void initial(void)
                                {
                                  
                                  UltraSonic.TimeCNT=0;  
                                  
                                  PORTA.DIRSET=0x01;
                                  PORTA.OUTCLR=0x01;
                                
                                  //-------
                                  Timer_Init();
                                  
                                  sei();
                                 }
                                //--------------------------- Timer
                                void Timer_Init(void)
                                {
                                  //--------
                                
                                  TC_SetPeriod(&TCD0,0x0004);// 4 => 1 us
                                  TC0_SetOverflowIntLevel(&TCD0,TC_OVFINTLVL_MED_gc);
                                  TC0_ConfigClockSource(&TCD0, TC_CLKSEL_DIV8_gc );//DIV8  
                                
                                  TC_SetPeriod(&TCC0,10);
                                  TC0_SetOverflowIntLevel(&TCC0,TC_OVFINTLVL_MED_gc);
                                //  TC0_ConfigClockSource(&TCC0, TC_CLKSEL_DIV1024_gc );//DIV1024
                                
                                  
                                  PMIC.CTRL |= PMIC_MEDLVLEN_bm;// | PMIC_LOLVLEN_bm;  
                                }
                                //-----------------------------------------------
                                //------------
                                ISR(TCD0_OVF_vect)
                                {
                                  PORTA.OUTSET=0x04;  
                                  
                                  UltraSonic.TimeCNT++;
                                  UltraSonic.TimeCNT=0;
                                  
                                  PORTA.OUTCLR=0x04;    
                                }
                                
                                //--------------
                                ISR(TCC0_OVF_vect)
                                {
                                  DACVAL=0x0fff-DACVAL;
                                  DAC_Channel_Write(&DACB,DACVAL,CH0);      
                                }
                                ---
                                (فرکانس 32 مگا هرتز هست)
                                مشکل اینجاست که برنامه حدود 680 نانو ثانیه در بردار وقفه TCD0_OVF_vect معطل میشه در صورتی که دستور خاصی هم درش نیست.

                                ولی اگه متغییر هام رو از حالت struct خارج کنم برنامه حدود 240 نانو ثانیه در وقفه میمونه(این رو با روشن و خاموش کردم بیت یک پورت هنگام ورود و خروج از وقفه محاسبه کردم.)

                                من در اغلب برنامه هام برای اینکه برنامه خواناتر باشه از struct استفاده میکنم. تا به حال هم به مشکلی بخورد نکرده بودم. این تاخیر حدودا سه برابری طبیعی هست؟ تنظیماتی برای دستیابی بهینه تر به struct ها وجود نداره؟
                                در ضمن کامپایلر روی بهینه سازی بیشتری سرعت تنظیم شده.
                                سپاس فراوان
                                شأن انسان در ایمان و هجرت و جهاد است و هجرت، مقدمهآ‌ی جهاد فیآ‌سبیلآ‌الله.
                                هجرت، هجرت از سنگینیآ‌هاست و جاذبهآ‌هایی که تو را به خاک میآ‌چسباند.
                                چکمهآ‌هایت را بپوش، رهآ‌توشهآ‌ات را بردار و هجرت کن.

                                دیدگاه

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