اطلاعیه

Collapse
No announcement yet.

کامپایلر برای XMega که پوینتر آدرسش بیشتر از 16 بیت باشه.

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

    کامپایلر برای XMega که پوینتر آدرسش بیشتر از 16 بیت باشه.

    سلام.
    برای کار با XMega که مقدار رم مورد استفاده 512 کیلو یا بیشتر باشه ، دارم از IAR استفاده میکنم.
    تا چند ماه پیش کامپایلرهایی مثل ImageCraft , AVR GCC و دو سه تا دیگه رو که چک کردم ، این قابلیت رو نداشتن. میخواستم ببینم کسی اطلاعی داره که آیا غیر از IAR کامپایلر دیگه ای هست که این قابلیت رو داشته باشه؟

    #2
    پاسخ : کامپایلر برای XMega که پوینتر آدرسش بیشتر از 16 بیت باشه.

    در تاپیک زیر:

    http://www.avrfreaks.net/forum/xmega...inter-question

    برای این موضوع در AVR-gcc اشاره ای به آدرس زیر شده که فرصت نکردم جزئیات را مطالعه کنم:

    https://gcc.gnu.org/onlinedocs/gcc/N...ss-Spaces.html
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

    دیدگاه


      #3
      پاسخ : کامپایلر برای XMega که پوینتر آدرسش بیشتر از 16 بیت باشه.

      ممنونم جناب طراح ،قبل از اینکه اینجا مطرح کنم ، این تاپیک رو دیده بودم . نه این رو بلکه تاپیکهای مشابهی که تو avrfreaks بود رو هم دیده بودم.
      اما چیز بدرد بخوری توشون پیدا نکردم.
      نمیدونم چرا غیر از IAR هیچ شرکتی این کار ور نکرده!

      IAR خیلی کامپایلر خوب و قوی هست ، اما یکی از اشکالاتش اینه که RSTACK , CSTACK رو تو رم خارجی میگیره وچون پولی هست آدم نمیدونه کله کیو بچسبه! و هیمنطور IDE قوی و خوبی هم نداره.حتی تو ورژنهای جدیدش اومده Fold گذاشته ، اما نسبت به IDE نرم افزاری مثل Atmel Studio 6 یا حتی 5 هم اصلا قابل قیاس نیست.

      وقتی حجم کد کم باشه شاید خیلی مشکل ایجاد نکه این ضعفها ، اما وقتی حجم کد و تعداد سورسها زیاد بشه اونوقته که گشت و گذار و عیب یابی تو کد با این IDE یکم مشکل میشه.

      دیدگاه


        #4
        پاسخ : کامپایلر برای XMega که پوینتر آدرسش بیشتر از 16 بیت باشه.

        در سورس کد همراه با اپلیکیشن نوت AVR1312 مربوط به EBI ماکروهایی شامل کدهای inline اسمبلی وجود دارد که توسط آن می توان در GCC این کار رو انجام داد. البته خودم هنوز تستش نکردم اما فکر نمی کنم مشکلی داشته باشند در واقع همان کار مقداردهی به رجیسترهای r31:30 و RAMPZ پیاده سازی شده که مشابه همین عمل هم باید در خروجی کدهای IAR هم وجود داشته باشد.
        گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

        دیدگاه


          #5
          پاسخ : کامپایلر برای XMega که پوینتر آدرسش بیشتر از 16 بیت باشه.

          اون ماکرو ها برای اینکه یک نقطه از حافظه رو آدرس بدی هست ، نه برای تعریف متغیر ف مثلا یه متغیر 100 کیلویی داری یه متغیر 80 کیلویی و ... با این روش نمیتونی. هر چی تعداد متغیرها بیشتر بشه آدرسدهی به اونا هم با این روش سخت تر میشه.

          IAR این حسن بزرگ رو داره که خودش اتوماتیک انجام میده ، اما...

          دیدگاه


            #6
            پاسخ : کامپایلر برای XMega که پوینتر آدرسش بیشتر از 16 بیت باشه.

            دقیقتر که به مثالش نگاه می کنم باز هم چیز سختی نمی بینم شما مثلا یک آرایه 100 کیلویی رو در یک آدرس ایجاد می کنید و آرایه بعدی رو در آدرس بعد از آن و الی آخر و به هر عضو آرایه هم از جمع اندیس آرایه با آدرس ابتدایی آن دسترسی دارید، حتی اگر آرایه دوبعدی هم باشد. تنها تفاوتش این هست که باید چند خط کد یا ماکرو برای شبیه سازی آرایه بنویسید. شاید جزئیات این کار در عمل متفاوت و سخت باشد اما گاهی لازم هست بجای کامپایلر خودمان دست بکار شویم. به عنوان مثال در خروجی GCC برای روتین وقفه مثلا رجیستر های RAMPZ , RAMPD در شروع و پایان push و pop می شوند، در صورتی که استفاده نمی شوند و برای صرفه جویی می توان روتین را به صورت NAKED تعریف کرده و کدهای لازم را خودمان اضافه کنیم.
            گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

            دیدگاه


              #7
              پاسخ : کامپایلر برای XMega که پوینتر آدرسش بیشتر از 16 بیت باشه.

              ببینید ، این دیگه نمیشه متغیری که کامپایلر آدرس بده! این میشه متغیری که خودمون آدرس میدیم و دیگه مثلا نمیتونید بنویسید :
              کد:
              if (buf1[100] & 0x3F && buf2[i]<20)
              {
              ...
              }
              اگر متغیرها توسط کامپایلر آدرس دیهی بشن میتونید اینجوری بنویسید وگرنه برای خوندن از حافظه یه روتین دارین و برای نوشتن هم همینطور.
              مثلا میشه اینطوری :
              کد:
              #define		buf1		0x5000
              #define		buf2		0x10000
              
              if ( (_read_mem(buf1+100)&0x3F) && (_read_mem(buf2+i)) )
              {
              ...
              }
              که _read_mem میتونه یه define یا یه تابع باشه. حالا شما باید همین کار رو برای _write_mem هم انجام بدین . تازه اینا برای یک بایت هست. اگر نوع متغیر شما int یا بدتر از اون float یا double باشه که کار به مراتب سخت تر میشه.

              نمیگم نمیشه ولی برنامه نویسی با این روش میشه مصیبت بزرگ...

              امیدوارم تونسته باشم مطلب رو برسونم.

              دیدگاه


                #8
                پاسخ : کامپایلر برای XMega که پوینتر آدرسش بیشتر از 16 بیت باشه.

                از ابتدا متوجه منظور شما بودم، منظور من این هست:
                کد:
                #define		buf1		0x5000
                #define		buf2		0x10000
                
                #define Read_Buf1(x)	_read_mem(buf1+x)
                #define Read_Buf2(x)	_read_mem(buf2+x)
                
                if ( ( Read_Buf1(100) & 0x3F ) && ( Read_Buf2(i) ) )
                {
                ...
                }
                یا
                کد:
                #define ReadArr(addr, x)	_read_mem(addr+x)
                
                if ( ( ReadArr(Buf1, 100) & 0x3F ) && ( ReadArr(Buf2, i) ) )
                {
                ...
                }
                منظور این هست که هرچند نحوه کد نویسی متفاوت هست اما در نهایت خروجی دو کامپایلر یکسان هست و در هر دو برای خواندن و نوشتن یک بایت باید چندین خط کد تولید شود. اگر متغیر بیش از یک بایت باشد باید عملیات مشابه انجام شود چون میکروکنترلر به این شکل عمل می کند. مثلا اگر قرار باشد یک متغیر 32 بیتی داخل EEPROM ذخیره شود باید بایت به بایت نوشته شود و به همین ترتیب خوانده شود. اینجا تفاوتی بین کامپایلرهای مختلف نیست، فقط در IAR برای راحتی بیشتر این امکان وجود دارد که فرضا بتوان با یک کلمه متغیر مورد نظر رو تعریف و عملیاتی روی آن پیاده سازی کرد.
                گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

                دیدگاه

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