اطلاعیه

Collapse
No announcement yet.

کامپایلر IAR

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

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

    سلام دوباره
    دوستان من هنگ کردم، جناب طراح لطفا راهنماییم کنید. من به جز اینجا منبع دیگه ای ندارم که اشکالاتم رو برطرف کنم.
    علاوه بر سوالات پست قبلی با کلی سوال دیگه مواجه شدم، من فایل ATxmega16A4.h در پروژم رو باز کردم، برای هر قسمت یک ستراکچر تعریف کرده، مثلا برای ADC :
    کد:
    typedef struct ADC_struct {
    	register8_t CTRLA; ///< Control Register A
    	register8_t CTRLB; ///< Control Register B
    	register8_t REFCTRL; ///< Reference Control
    	register8_t EVCTRL; ///< Event Control
    	register8_t PRESCALER; ///< Clock Prescaler
    	register8_t reserved_0x05; ///< reserved
    	register8_t INTFLAGS; ///< Interrupt Flags
    	register8_t TEMP; ///< Temporary register
    	register8_t reserved_0x08; ///< reserved
    	register8_t reserved_0x09; ///< reserved
    	register8_t reserved_0x0A; ///< reserved
    	register8_t reserved_0x0B; ///< reserved
    	WORDREGISTER(CAL); ///< Calibration Value
    	register8_t reserved_0x0E; ///< reserved
    	register8_t reserved_0x0F; ///< reserved
    	WORDREGISTER(CH0RES); ///< Channel 0 Result
    	WORDREGISTER(CH1RES); ///< Channel 1 Result
    	WORDREGISTER(CH2RES); ///< Channel 2 Result
    	WORDREGISTER(CH3RES); ///< Channel 3 Result
    	WORDREGISTER(CMP); ///< Compare Value
    	register8_t reserved_0x1A; ///< reserved
    	register8_t reserved_0x1B; ///< reserved
    	register8_t reserved_0x1C; ///< reserved
    	register8_t reserved_0x1D; ///< reserved
    	register8_t reserved_0x1E; ///< reserved
    	register8_t reserved_0x1F; ///< reserved
    	ADC_CH_t CH0; ///< ADC Channel 0
    	ADC_CH_t CH1; ///< ADC Channel 1
    	ADC_CH_t CH2; ///< ADC Channel 2
    	ADC_CH_t CH3; ///< ADC Channel 3
    } ADC_t;
    ADC_t اسم این متغیری هس که تعریف شده؟
    register8_t یعنی چی؟
    این متغیرهایی که داخل استراکچر تعریف شده، در واقع به رجیسترهای ADC مرتبط میشن؟
    چرا با اسم ADC_t تعریف شده؟

    این خط که ظاهرا بین ADCA و ADC_t ارتباط برقرار میکنه، میش توضیح بدین؟

    کد:
    #define ADCA		(*(ADC_t *) 0x0200)
    در نهایت هم یکسری متغیرهایی تعریف کرده بصورت زیر

    کد:
    sfrb ADCA_CTRLA = 0x0200
    میدونم که انتظار توضیح همه اینها، انتظار زیادی هست، ولی اگر براتون مقدوره راهنماییم کنین یا یک رفرنس مناسبی معرفی کنین برام.
    با تشکر

    دیدگاه


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

      فقط چر underline قبل ورودی هاش ب کار برده؟ دلیل خاصی داره؟
      تا جایی که من میدونم این ها فقط اسم هستند شاید نویسنده برای ایجاد یه وجه تمایز بین ورودی های تابع اش با بقیه چیزا از underline استفاده کرده . و بیشتر فکر میکنم این کار علاوه بر خوانا تر شدن برنامه منجر به تفکیک شدن و طبقه بندی شدن قسمت های مختلف کد تو ذهن نویسنده و خواننده میشه .
      یه منبع مناسبی که در مورد این چیزا اطلاعات بدست بیارم میتونین معرفی کنین؟
      فکر میکنم اینا بیشتر تکنیک های برنامه نویسی هستند که با تجربه برنامه نویس رابطه مستقیم داره ولی من خودم رو بگم ، سعی میکنم این تکنیک ها رو با خوب دیدن نمونه کدهای مختلف مثل همین چیزی که شما دارید بدست بیارم مثلا یه نمونه خیلی بنظر ساده که تو همین کدی که شما تو پست قبل گذاشتین مشهود هست و وقتی زبان سی یاد گرفتیم بهمون گفتن عملگر شرطی "؟" ، میبنید چه قد بجا و قشنگ ازش استفاده کرده میشه از این ایده گرفت که مثلا تو یه جای مشابه همی کار رو کرد . ولی به عنوان منبع درکل از من بپرسید میگم که به appnote های اتمل مراجعه کنید .

      استراکچر چطور بصرت اشاره گر تعریف میشه؟
      برای این کار متغیری که میخواهیم از نوع استراکچر مون تعریف کنیم به صورت اشاره گر تعریف میکنیم ، همین . (البته حالا اینکه چرا به صورت اشاره گر تعریف شده مهم هست (درک و هضم این موضوع و بکار بردنش واقعا مشکله )).
      نمیدونم دقیقا میدونید استراکچر یعنی چی یا نه اما بازم میگم که گفته باشم ،
      خوب ببینید ما تو زبان سی انواع داده داریم مثل char, int , float ,unsigned char,unsigned iint,long in و ... که همونطور که میدونید میتونیم با استفاده از پیشوندها ترکیبات جدید بسازیم اما اینها همگی به یک نوع داده خاص دلالت میکنند ، یعنی ما نمیتونیم تو یه داده از نوع int هم کاراکتر بریزیم هم عدد !

      خوب فرض کنید که سازمان ثبت احوال میخواد اطلاعات هر نفر رو اعم از نام ، نام خانوادگی ، نام پدر ، تاریخ تولد ، محل صدور، شماره شناسنامه، کد ملی و ... رو تو یه متغیر ذخیره کنه .
      خوب اگه بخواد این ها رو ذخیره کنه باید برای اون هایی که به صورت کارکتر هستند بیاد یه آرایه دو بعدی که بعد اولش تعداد کاراکتر های مورد نیاز برای هر نفر و آرایه دومش تعداد آدم ها هستند رو از نوع char تعریف کنه و برای اون هایی که از نوع عدد هستند باید برای یه ارایه دوبعدی تعریف کنه که تو بعد اول تعداد درایه مورد نیاز برای اون اطلاعات خاص و تو بعد دوم تعداد آدم ها رو از نوع مثلا int تعریف کنه .

      خوب حالا این به خودش میگه چی میشد من یه متغیر داشتم که به اندازه آدم ها آرایه داشت و تو همون متغیر اطلاعات رو وارد میکردم . خوب این آقا چیزی که میخواد اینه که یه نوع داده باشه ، 120 بایتی ، که تو مثلا 100 بایت اولش بشه کارکتر گذاشت تو 20 بایت بعدش عدد بعد هم به صورت آرایه تک بعدی باشه و بعدش هم به اندازه تمام آدم ها باشه .

      خوب همونطور که میدونید ما همچین چیزی تو زبان سی نداریم ، پس باید این "نوع داده جدید رو ایجاد کنیم " این کار با استفاده از دستور struct انجام میشه و یه نوع ساختمان داده یا اصطلاحا یه نوع داده جدید رو ایجاد میکنیم.

      خوب همین مثال ثبت احوال رو در نظر داشته باشید ، یه استراکچر ساده برای کاری که اون لازم داره میتونه به صورت زیر باشه :

      کد:
      struct personal{
      
      char first_name[20];
      char last_name[20];
      char father_name[20];
      int date_of_birth;
       
      };


      حالا ما اینجا یه نوع داده جدید داریم با عنوان personal ، حالا فرض کنید ما میخواهیم یه داده از این و به صورت اشاره گر تعریف کنیم ، اسم اون دادمون هم مثلا person هست ، باید به صورت زیر عمل کنیم :

      کد:
      struct personal *person;


      حالا ما اگه بخواهیم به اعضای این داده جدیدمون دسترسی داشته باشیم باید از عملگر "<-" استفاده کنیم ، مثلا فرض کنید میخواهیم به اسم کوچیکش میخواهیم دسترسی پیدا کنیم باید به این صورت عمل کنیم :

      کد:
      person->first_name="mojtaba";


      این جور برنامه نویسی استاندارد زبان c است یا فقط مربوط به نرم افزار IAR هست؟
      نرم افزار IAR هم با تمام نقاط قوتش هم مثل بقیه کامپایلرهای دیگه یه کامپایلر هست البته با سینتکس خاص خودش ، این مواردی که مورد بحث بودن مربوط به زبان C بود.

      تو این کد و بسیاری از کدهای دیگه اتمل، عبارت هایی برای دسترسی مستیم به بیت های یک رجیستر استفاه کرده. به عنوان مثال، ADC_CONVMODE_bm و با این عبارت، بیت مورد نظر رو تنظیم کرده، من تو برنامم ADC_CONVMODE_bm استفاده کردم ولی خطا گرفت که نمیشناسه، چطور میتونم از این روش استفاد کنم؟
      خوب چیزی که در این رابطه بنظرم میرسه که احتمالا این عبارت "ADC_CONVMODE_bm " یه ماکرو مثلا به شکل زیر باشه :

      کد:
      #define ADC_CONVMODE_bm  (1<<5);

      که اون پنجم مثلا شماره اون بیت مورد نظر ماست ، اگه اینطور باشه باید دید که شما از این کجا و به چه صورت استفاده کردید ؟!

      دوستان من هنگ کردم، جناب طراح لطفا راهنماییم کنید. من به جز اینجا منبع دیگه ای ندارم که اشکالاتم رو برطرف کنم.
      علاوه بر سوالات پست قبلی با کلی سوال دیگه مواجه شدم، من فایل ATxmega16A4.h در پروژم رو باز کردم، برای هر قسمت یک ستراکچر تعریف کرده،
      خوب این فایل هدر i/o میکرو هست و شامل اسم تمامی رجیستر ها و بیت هاشون و همینطور اسم بردار های وقفه و چندین مورد دیگه میشه که من دقیقا نمیدونم ، خوب چون اینجا با یه دنیا رجیستر روبرو هستیم برای اینکه بشه راحتر با این رجیستر ها اونس پیدا کرد و بینشون تفکیک ایجاد کرد و طبقه بندی و دسته بندیشون کرد از استراکچر به این شکل استفاده میشه .


      ADC_t اسم این متغیری هس که تعریف شده؟
      register8_t یعنی چی؟
      این متغیرهایی که داخل استراکچر تعریف شده، در واقع به رجیسترهای ADC مرتبط میشن؟
      چرا با اسم ADC_t تعریف شده؟

      این خط که ظاهرا بین ADCA و ADC_t ارتباط برقرار میکنه، میش توضیح بدین؟

      کد: [انتخاب]

      #define ADCA (*(ADC_t *) 0x0200)

      پیشنهاد میکنم کتاب زبان c قمی رو اگه ندارید حتما بگیرید خیلی کمکتون میکنه
      و توش بگردید دنبال typdef و type casting تا جواب سوالات بالاتون رو بگیرید در غیر این صورت من تا جایی که بلد باشم با اجازه استاد کی نژاد در خدمتتون هستم.

      در نهایت هم یکسری متغیرهایی تعریف کرده بصورت زیر

      کد: [انتخاب]

      sfrb ADCA_CTRLA = 0x0200
      sfrb ، یه نوع داده است که برای دستیابی به رجیسترهای میکروکنترلر به صورت بیتی مورد استفاده قرار میگره ، الان با توجه به این تعریف بالا شما میتونید به رجیستر ADCA_CTRLA به صورت بیتی دسترسی داشته باشید .

      دیدگاه


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

        با سلام دوباره
        جناب "mojtaba_led" واقعا ممنونم، انتظار نداشتم اینگونه مفصل توضیح بدهید.
        با مفهوم استراکچر آشنا بودم، ولی اینکه چطور بصورت اشاره گر تعریف میشه و اصلا چرا بصورت اشاره گر نمیدانستم.

        خوب چیزی که در این رابطه بنظرم میرسه که احتمالا این عبارت "ADC_CONVMODE_bm " یه ماکرو مثلا به شکل زیر باشه :
        کد: [انتخاب]


        #define ADC_CONVMODE_bm (1<<5);

        که اون پنجم مثلا شماره اون بیت مورد نظر ماست ، اگه اینطور باشه باید دید که شما از این کجا و به چه صورت استفاده کردید ؟!
        در این مورد که ADC_CONVMODE_bm بصورتی که شما تعریف کردین، تعریف شده و در کد ارائه شده از طرف اتمل چنین استفاده ای از آن شده، مطمئن نیستم. چون عبارتهای زیادی مثل همین عبارت استفاده شده، مثلا ADC_RESOLUTION_gm و یا عبارتهای بسیار دیگری که در کدهاییی که از طرف اتمل برای تنظیمات قسمتهای مختلف xmega ارائه شده ، دیده میشه.

        احتمال داره که این عبارت ها به group configuration هایی که در قسمت رجیسترهای بخشهای مختلف xmega دیده میشه مرتبط بشه؟ مثلا وقتی اومده تنظیمات resolution رو برای ADC بیان کرده، توی جدول مربوطه، یه ستونی به نام group configuration داره، اینا چه مفهومی دارن؟

        کتاب جعفرنژاد قمی رو دارم و حتما مطالعه میکنم این قسمت ها رو .
        باز هم ازتون ممنونم دوست عزیز

        دیدگاه


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

          انتظار نداشتم اینگونه مفصل توضیح بدهید.
          راستش رو بخواهید ، اون قسمت استراکچر رو قبلا یه بار تو یه پست دیگه گفته بودم، اینجا فقط کپی پیست کردم :redface:

          با مفهوم استراکچر آشنا بودم.
          ببخشید قصد جسارت نداشتم ، اما دیدم برای انعقاد کامل کلام لازم هست.

          اصلا چرا بصورت اشاره گر نمیدانستم.
          البته من چیزی در رابطه با اینکه چرا استفاده شده نگفتم ! مراقب باشید !

          احتمال داره که این عبارت ها به group configuration هایی که در قسمت رجیسترهای بخشهای مختلف xmega دیده میشه مرتبط بشه؟ مثلا وقتی اومده تنظیمات resolution رو برای ADC بیان کرده، توی جدول مربوطه، یه ستونی به نام group configuration داره، اینا چه مفهومی دارن؟
          متاسفانه من با xmega کار نکردم ، اما یه چیزی رو بگم ، اینچیزی که شما دارید ازش استفاده میکنید فکر میکنم یکی از دمو های اتمل هست که حالا مربوط میشه به قسمت adc میکرو xmega ، خوب تو این کد از یک سری کتابخونه و یکسری ماکرو و متغیر استفاده شده بقیه اش یا اسم رجیستر یا دستورات زبان سی ، منظورم اینه که اگه با رجیستر های میکرو و تنظیمات اونها آشنا باشید و بدونید که برای چه کاری استفاده میشه ، فهمیدن اینکه فلان تابع یا ماکرو از فلان کتابخونه چه کاری انجام میده فکر نمیکنم زیاد مشکل باشه . :-? اینجا فقط نیاز به حوصله داریم که معمولا نداریم و زود خسته میشیم #:S (میگم خودمونیم ، کلا خوب چشم بسته غیب میگم )

          دیدگاه


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

            سلام
            جناب mostafa_led اون چیزی که گفتین درست بود، یکسری defineهایی انجام داده که یکی از اونا ADC_CONMODE_bm بود و من اشتباهی ADC_CONVMODE_bm استفاده کرده بودم!
            خیلی ممنون ، با دقت در این کدها و با توضیحات شما خیلی چیزا دستم اومد

            دیدگاه


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

              سلام دوستان. میشه بفرمایید که در IAR آیا متغیر بطور معمول در SRAM ساخته میشه و اگر خیر ، چطور میشه متغیری رو در SRAM تعریف کرد؟

              دیدگاه


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

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

                دیدگاه


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

                  با سلام.
                  من یک برد دارم که با ATXmega128A1 و یک رم 128 کیلو بایتی داره کار میکنه.
                  تا وقتی که فقط دارم از 64 کیلو استفاده میکنم هیچ مشکلی نیست.
                  اما وقتی حجم متغیرهام بیشتر از 64 کیلو میشه دیگه قاطی میکنه.
                  میزان CSTACK , RSTACK رو هم خیلی بیشتر از حدی که تو فایل map اومده قرار دادم.
                  وقتی تو برنامه بعد از اینکه رجیستر ها رو مقدار دهی کردم ، رم رو تست میکنم به درستی هم میریزه و هم میخونه.
                  پس از لحاظ ارتباط سخت افزاری مشکلی نیست کما اینکه شماتیک مدار رو از مداری که قبلا با رم 512 کیلو کار میکرم استفاده کردم و اتصالات رو پین به پین چک کردم.
                  اما وقتی که کل برنامه رو کامپایل میکنم ..... :angry:
                  مدل حافظه هم Huge هست. مقدار حافظه رو هم در تنظیمات IAR عدد 0x20000 تعیین کردم.
                  در ضمن مقادیری که توی فایل low_level_init.c isj hdkih isjkn
                  کد:
                  [left]
                  #ifdef __cplusplus
                  extern "C" {
                  #endif
                  char __low_level_init()
                  {
                    PORTH_OUT = 0xF3;
                    PORTH_DIR = 0xF7;
                    PORTK_DIR = 0xFF;
                    //EBI_SDDATAW_8BIT_gc | EBI_SRMODE_ALE1_gc | EBI_IFMODE_3PORT_gc
                    EBI_CTRL = (0x01<<6) | 1;
                    EBI_CS0_CTRLB = 2;
                    EBI_CS0_BASEADDR = 0;
                    //EBI_CS_ASPACE_128KB_gc | EBI_CS_MODE_SRAM_gc
                  	EBI_CS0_CTRLA = (0x09<<2) | 1;
                    EBI_CS1_CTRLA = 0;
                    EBI_CS2_CTRLA = 0;
                    EBI_CS3_CTRLA = 0;
                  	return 1;
                  }
                  #ifdef __cplusplus
                  }
                  #endif
                  [/left]
                  میشه من رو راهنمایی کنید؟
                  پیشاپیش تشکر میکنم.

                  دیدگاه


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

                    آقا حتی اومدم از Heap هم استفاده کردم و بافر 64 کیلویی و 20 کیلویی رو تو هیپ تعریف کردم (با malloc) اما نشد.
                    یک بار دیگه هم اومدم زبان رو کردم C++ و از new استفاده کردم اما باز هم............. :angry: :angry: :angry:

                    دیدگاه


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

                      آیا می شود برنامه را در محیط atmel studio نوشت و در محیط IAR کامپایل کرد. یعنی فقط برای نوشتن کد از قابلیت های محیط atmel studio استفاده کرد؟

                      دیدگاه


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

                        سلام
                        اون سورس هائی که با توابع استاندارد c و کتابخونه های ارائه شده توسط atmel نوشته شده باشه،بله می شه استفاده کرد اما نه به این صورت که فایل پروژه رو تو atmel studio ایجاد کنید و تو iar باز کرده و کامپایل کنید.
                        همچنین چون هسته atmel studio از gcc استفاده می کنه نحوه تعریف متغییر ها در حافظه و یک سری موارد دیگر با iar متفاوت می باشد.
                        دکتر شریعتی:

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

                        دیدگاه


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

                          منظور من این هست که آیا میشه پروژه در IAR تعریف بشه بعد دستورات در محیط atmel studio نوشته بشه تا از قابلیت های محیط ویژوال برای نوشتن کد استفاده کنیم بعد در محیط IAR کامپایل کنیم؟ اگه بشه سرعت کد نوشتن خیلی میره بالا.

                          دیدگاه


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

                            نه
                            دکتر شریعتی:

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

                            دیدگاه


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

                              نوشته اصلی توسط طراح
                              درباره نحوه تشکیل پروژه در IAR و موارد تکمیلی آن در همین تاپیک توضیح داده شده است. درباره سایر مطالب هم اگر سوالی دارید آن را مطرح کنید تا به آن پاسخ داده شود.
                              با سلام
                              بنده با تنظیم فرکانس واسه xmega در این کامپایلر مشکل دارم ، میشه راهنمایی کنین!!
                              خدایا چنان کن سرانجام کار *** که تو خشنود باشی و ما رستگار

                              دیدگاه


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

                                دوست عزیز تو این کامپایلر جایی برای تنظیم فرکانس وجود نداره و نباید اون رو با کدویژن مقایسه کنی.
                                تو کدویزن تنظیم فرکانس داشت چون تابع delay رو خودش داشت. اما اینجا از تابع delay خبری نیست و باید خودت بنویسی ، پس تنظیم فرکانس معنی خاصی تو کامپایلر نداره. فقط تو باید عددی رو برای حلقه تاخیرت بر اساس تعداد ماشین سیکل های لازم بر حسب زمانبندی با فرکانس کاریت قرار بدی.
                                مثلا اگر فرکانس کاریت 32 مگا هرتز هست ، باید تابع __delay_cycles(32) , و برای میلی ثانیه __delay_cycles(32000) رو قرار بدی.
                                پس میبینی که تنظیم فرکانس معناش این میشه.

                                دیدگاه

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