اطلاعیه

Collapse
No announcement yet.

کامپایلر IAR

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

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

    نوشته اصلی توسط NAO_ROBOT
    سلام
    اقای کی نژاد سورس تغییر داده شده برای IAR مربوط به LCD کاراکتری رو برای بررسی اون ERROR ذکر شده در بالا ضمیمه میکنم،اگه براتون امکان پذیر بود چک کنید ببینید مشکل کجاست.
    اگر دو خط مورد نظر را کامنت کنید، خواهید دید که در برنامه شما خطاهای زیادی ایجاد می شود که دلیل آن این است که نوع نوشتن اسمبلی inline در AVR-GCC با IAR فرق می کند. با توجه به اینکه این خطاها مربوط به کدهای تولید delay است به نظر می رسد می توانید آنها را کلا حذف کنید و برای تولید تاخیر از همان delay_us_ که در فایل delay.h وجود دارد استفاده کنید.

    نوشته اصلی توسط محمد نحوی
    حین کار با وقفه های تایمر XMEGAآ‌در IARآ‌به یه مشکل عجیب برخورد کردم، گفتم اینجا مطرح کنم که هم تجربه ای باشه و هم شاید به جوابم برسم.
    مقایسه را در صورتی می توان انجام داد که کد معادلی که همین عملیات را انجام می دهد و از ساختار استفاده نکرده باشد، در دسترس باشد. در ضمن مسئله ای که در کد شما با یک نگاه قابل تشخیص است این است که متغیرهایی که در دو سطح از برنامه مانند حلقه اصلی و وقفه مورد استفاده قرار می گیرند(مانند UltraSonic.TimeCNT)، باید بصورت volatile تعریف شوند. اما این مورد در کد مشاهده نمی شود که ای بسا با رعایت این مسئله تاثیری هم در زمان اجرای کد بوجود بیاید.


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

    دیدگاه


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

      اگر دو خط مورد نظر را کامنت کنید، خواهید دید که در برنامه شما خطاهای زیادی ایجاد می شود که دلیل آن این است که نوع نوشتن اسمبلی inline در AVR-GCC با IAR فرق می کند. با توجه به اینکه این خطاها مربوط به کدهای تولید delay است به نظر می رسد می توانید آنها را کلا حذف کنید و برای تولید تاخیر از همان delay_us_ که در فایل delay.h وجود دارد استفاده کنید.
      سلام
      با تشکر از شما، قبلا این کارو کردم و جواب هم داد ولی می خواستم بدونم ایراد کارم کجاست و نحوه تبدیل کد به چه صورت خواهد بود و هم اینکه سورس اصلی رو زیاد تحریف نکنم.سورس تبدیل و تست شده رو در قسمت (نمونه کدهائی برای XMEGA) در پست مورد نظر ضمیمه کردم.
      دکتر شریعتی:

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

      دیدگاه


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

        سلام.
        پیرو پست قبلیم در همین بخش خواستم توضیحاتی رو خدمت دوستان بدم.
        راهنمایی مهندس کی نژاد در خصوص استفاده نوع volatile نکته مهمی بود. البته من تا به حال به این نکته دقت نکرده بودم و علی رغم اینکه کد های فراوانی هم نوشتم به مشکلی برخورد نکرده بودم با این تفاوت که در هیچ کدوم تا این اندازه زمان بندی دقیق برام مطرح نبوده شاید به همین علت تا به حال به مشکل بر نخوردم. من تصوری در مورد نوع volatile دارم که اینجا مطرح می کنم دوستانی که تجربه دارن راهنمایی کن.

        نوع volatile چیکار می کند؟
        چیزی که من فهمیدم این هست، فرض کنید برنامه ای دارید که در جایی از برنامه، برنامه در حلقه ای مانند حلقه زیر قفل شده:
        while(x==2); //p
        مقدار x در یک وقفه مثلا تایمر قراره تغییر کنه. ما کدمون رو به زبان Cآ‌ نوشتیم و کامپایلر با یک ملاحظاتی این کد رو تبدیل به اسمبلی میکنه مثلا میخواد حداکثر سرعت رو برآورده کنه. خب عملیات مقایسه در رجیسترهای مخصوصی در CPU باید انجام بشه، متغیر x هم یه جایی در حافظه ram هست نه داخل این رجیستر ها برای اینکه عملیات مقایسه انجام بشه، باید این متغیر از آدرسی که در حافظه ram ذخیره شده به یکی از رجیستر های CPUآ‌ کپی بشه تا عملیات مقایسه انجام بشه. زمان ترجمه کد به زبان اسمبلی، کامپایلر میبینه که درون حلقه while دستوری برای تغییر متغیر x وجود نداره پس فرض میکنه که این متغیر تغییر نمیکنه پس نیازی نمیبینه که برای هر بار مقایسه متغیر x، ابتدا اون رو از حافظه ram بخونه بعد با عدد 2 مقایسه کنه، بلکه همون مقداری که یک بار از ram به رجیستر cpuآ‌ منتقل کرده رو مداوم مقایسه میکنه. اگه این کد به این صورت کامپایل بشه برنامه هیچ وقت کار نخواهد کرد چون هیچ موقع این عملیات بروزرسانی x انجام نمیشه. راه حل اینه که متغییر x رو از نوع volatile تعریف کنیم تا به کامپایلر بفهمونیم که برای هر بار مقایسه باید xآ‌رو از ram بروزرسانی کنه.
        ولی در عمل اگه از volatile هم استفاده نشه اینطور نیست که برنامه مطلقا کار نکنه. حدس میزنم کامپایلر هنگام ترجمه این خط برای اینکه سرعت رو افزایش بده، عملیات بروزرسانی x رو مثلا هر 100 بار یکبار انجام میده نه هر بار. بهمین خاطر برنامه کار میکنه ولی اگه زمانبندی برنامه دقیق باشه از لحاظ زمانی نیازها رو برآورده نمیکنه.
        ---
        مطلب دیگه در خصوص استفاده از structآ‌ ها هست. همونطور که قبلا مطرح کردم شخصا برای افزایش خوانایی برنامه از struct استفاده میکنم. در پروژه ای که اخیرا کار میکردم با مشکل جدی از نظر زمانی مواجه شدم. کار با struct ها برنامه رو کند میکنه. یعنی اگه یه متغیر struct ی داشته باشیم و بخواهیم یه عملیات مقایسه ساده و یه عملیات جمع ساده انجام بدیم اگه این متغیر از نوع struct نباشه زمان انجام عملیات تقریبا نصف میشه.
        خب شاید بگید که از struct ها استفاده نمیکنیم و خوانایی برنامه رو فدای سرعت اون میکنیم. ولی یه مسئله دیگه هم هست. در برنامه ها اغلب نیاز به تعریف flag های بیتی داریم. یعنی مثلا بیت های وضعیتی داریم که شرایط ادامه کار رو تعیین میکنه. تعریف متغیر بیتی حتما باید در struct باشه. یعنی به نوعی در عمل ناچار به استفاده از struct هستیم.
        ولی یه راه حل وجود داره که هم کد روان و خوانا باقی بمونه و هم از struct استفاه نکنیم و اون استفاده از نوع شمارشی(enum) هست.در تعریف enum ها در واقع به هر عدد بین صفر تا 255 بسته به تعریف، یه اسم اختصاص میدم و شما با اون اسم ها کار میکنید ولی در عمل یک عدد جابه جا میشه و یا مقایسه میشه. اینکار باعث میشه سرعت کار افزایش پیدا کنه و از طرف دیگه خوانایی و روان بودن کد هم حفظ میشه.
        مثال:
        فرض کنید در یه برنامه دو وضعیت enable و disable داریم. اگه بخواهیم این حالت ها رو با متغیر بیتی تعریف کنیم باید به صورت زیر عمل کنیم:
        کد:
        struct{
        unsigned char enable:1;
        unsigned char disable:1;
        }Flags;
        
        Flags.enable=1;
        Flags.disable=0;
        حالا برای افزایش سرعت همین کار رو با متغیر نوع شمارشی انجام میدیم:
        کد:
        enum{
        NoStatus,
        enable,
        disable}STATUS;
        
        
        STATUS=NoStatus;// this is EQU Flags.enable=0; Flags.disable=0;
        STATUS=enable;
        STATUS=disable;

        موفق باشید.

        شأن انسان در ایمان و هجرت و جهاد است و هجرت، مقدمهآ‌ی جهاد فیآ‌سبیلآ‌الله.
        هجرت، هجرت از سنگینیآ‌هاست و جاذبهآ‌هایی که تو را به خاک میآ‌چسباند.
        چکمهآ‌هایت را بپوش، رهآ‌توشهآ‌ات را بردار و هجرت کن.

        دیدگاه


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

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

          دیدگاه


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

            درباره تعریف struct و زمان بیشتر برای اجرای آن، کد زیر را در سیمولاتور بررسی کردم و عملیات اضافه ای را مشاهده نکردم که در انجام کار موجب طولانی شدن زمان اجرای کد شود.

            کد:
            #include<ioavr.h>
            void main()
            { 
             volatile struct
             {
             unsigned char enable:1;
             unsigned char disable:1;
             }Flags1;
            ; 
             Flags1.enable=1; 
             Flags1.disable=0;
             
             while(1)
             {
             Flags1.enable^=1; 
             Flags1.disable^=1; 
             } 
            }


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

            دیدگاه


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

              معنی این ارور ها چیه؟

              Thu Jun 30 1200 2011: Simulator running in: 32000000 Hz
              Thu Jun 30 1200 2011: Could not initialize this DLL: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 5.4\avr\config\plugin\xmega\xmega_eeprom.dll"
              Thu Jun 30 1200 2011: Warning: This file DLL0: "C:\Program Files (x86)\IAR Systems\Embedded Workbench 5.4\avr\config\plugin\xmega\xmega_eeprom.dll" could not be opened.
              Thu Jun 30 1200 2011: There were warnings during download, see Log Window
              Thu Jun 30 1201 2011: Loaded debugee: C:\Users\aaa\Desktop\TEST\Release\Exe\1.hex
              Thu Jun 30 1201 2011: Target reset
              Thu Jun 30 1202 2011: Error (col 1): Unknown or ambiguous symbol. main
              Thu Jun 30 1204 2011: Error (col 1): Unknown or ambiguous symbol. main
              Thu Jun 30 1204 2011: Couldn't go to 'main'.
              نکته این ها توی کامپایل مسئله ای ایجاد نمیکنند و برنامه اجرا میشه

              دیدگاه


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

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

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

                دیدگاه


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

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

                  دیدگاه


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

                    نوشته اصلی توسط طراح
                    از ظاهر خطاها مشخص است که در هنگام اجرای سیمولاتور C-SPY ایجاد شده و به دلیلی اجرای محیط debugging با مشکل مواجه شده است. اما بدون دسترسی به پروژه و نمونه کد نمی توان دلیل تولید این خطاها را برای وارد شدن به سیمولاتور تشخیص داد.
                    میتونم بگم بعد از دستکاری طبق آموزش هر کدی مینویسم اینجوری میشه

                    دیدگاه


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

                      جناب طراح لطف میکنید سر فرصت کد های حاصله از IAR را که در آن ها از پورت مجازی استفاده شده است را بررسی کنید و میزان توانمندی این کامپایلر را در استفاده از این قابلیت بسنجید؟بنده به دلیل مسلط نبودن به زبان اسمبلی از انجام این کار ناتوانم
                      با تشکر

                      دیدگاه


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

                        نوشته اصلی توسط شهریار رجب زاده
                        میتونم بگم بعد از دستکاری طبق آموزش هر کدی مینویسم اینجوری میشه
                        اگر دقیقا مطابق آموزش هایی که در این انجمن گفته شده، عمل کرده باشید نباید مشکل خاصی ایجاد شود. به عنوان یک راه حل می توانید یکی از پروژه های آماده Atmel را (که تمام تنظیمات آن صحیح است) با پروژه خود مقایسه کنید و نقاط تفاوت را مشاهده کنید.

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

                        دیدگاه


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

                          پس با این حساب میتوان از مزیت پورت مجازی در این کامپایلر استفاده نمود

                          دیدگاه


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

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

                            کد:
                            #include<ioavr.h>
                            void main()
                            { 
                             volatile struct
                             {
                             unsigned char enable:1;
                             unsigned char disable:1;
                             }Flags1;
                            ; 
                             Flags1.enable=1; 
                             Flags1.disable=0;
                             
                             while(1)
                             {
                             Flags1.enable^=1; 
                             Flags1.disable^=1; 
                             } 
                            }


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

                            دیدگاه


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

                              کسی نسخه جدید این کامپایلر رو نداره؟تمام سورس های تو سایت اتمل با جدید ترین نسخه هستند
                              مال من 5.40 هستش

                              دیدگاه


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

                                نوشته اصلی توسط شهریار رجب زاده
                                کسی نسخه جدید این کامپایلر رو نداره؟تمام سورس های تو سایت اتمل با جدید ترین نسخه هستند
                                مال من 5.40 هستش
                                سلام.
                                شهریار جان من نسخه 5.5 رو دارم و فکر کنم از سایت sonsivri.com دانلود کردم. احتمالا فروشگاه هم داشته باشه.
                                موفق باشید
                                شأن انسان در ایمان و هجرت و جهاد است و هجرت، مقدمهآ‌ی جهاد فیآ‌سبیلآ‌الله.
                                هجرت، هجرت از سنگینیآ‌هاست و جاذبهآ‌هایی که تو را به خاک میآ‌چسباند.
                                چکمهآ‌هایت را بپوش، رهآ‌توشهآ‌ات را بردار و هجرت کن.

                                دیدگاه

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