اطلاعیه

Collapse
No announcement yet.

آموزش winavr و avrlib

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

    #46
    پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

    تا جایی که من میدونم فایل کامپایل شده دارای بخش (section) های متفاوتیه. text - data - bss - progmem و غیره. با قید کردن:
    unsigned char a[] __attribute__ ((progmem))="Exit";

    داریم میگیم:

    یک چند بایتی داریم به اندازه رشته Exit یعنی 5 بایت که در بخش progmem قرار داره.
    این بخشها:

    text: شامل دستورالعملهای برنامه نوشته شده هستند که در avr در فلش ذخیره میشه.
    data: شامل کلیه متغیر های عمومی و static هست که مقدار اولیه داشته باشه.
    bss: شامل کلیه متغیر های عمومی و static هست که مقدار اولیه نداشته باشه. این محدوده در executable جایی رو اشغال نمیکنه اما در image نهایی وجود داره و در ابتدای اجرای برنامه با مقدار 0x00 پر میشه.
    progmem: در حقیقت همون flash هست ولی اطلاعات ثابت و فقط خواندنی مثل رشته های کاراکتری ثابت در اون ذخیره میشه.

    شما میتونی بجای قید این attribute از ماکروی PROGMEM هم استفاده کنی.

    این گونه قید ها رو که جزئ اصلی زبان نیستن و بخاطر بعضی لحاظ برای توسعه امکانات کامپایلر در یک نسخه کامپایلر ایجاد و استفاده میشند رو META-COMMAND میگن.

    مثلا شما میتونی برای یک تابع قید کنی که کد آغازین و انتهایی ایجاد نشه (NAKED). میتونی قید کنی که یک تابع بخصوص هیچ وقت اجراش تموم نمیشه(NORETURN). بنا براین صداکردن یک تابع دیگه بعد از این تابع منجر به تولید یک هشدار WARNING میشه.

    دیدگاه


      #47
      پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

      با تشکر از آقا رضا من کارو تموم کنم

      #include <avr/pgmspace.h>
      char str[] PROGMEM = "test Array";
      int myArray[3] PROGMEM = {0,1,2};

      البته محض اطمینان بیشتر، بهتره که const هم بذارین.
      https://www.linkedin.com/in/mohammadhosseini69

      http://zakhar.blog.ir

      دیدگاه


        #48
        پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

        نوشته اصلی توسط محمد حسینی
        با تشکر از آقا رضا من کارو تموم کنم

        #include <avr/pgmspace.h>
        char str[] PROGMEM = "test Array";
        int myArray[3] PROGMEM = {0,1,2};

        البته محض اطمینان بیشتر، بهتره که const هم بذارین.
        اینو تست کردم ولی هردو Error میده :cry2:
        میگه:
        test.c:13: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'PROGMEM'
        [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

        دیدگاه


          #49
          پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

          نوشته اصلی توسط shahinbahari
          اینو تست کردم ولی هردو Error میده :cry2:
          میگه:
          test.c:13: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'PROGMEM'
          من که مشکلی ندارم!! البته حتما باید pgmspace رو include کنم. اگه نه یه error شبیه این که میگی میده...
          asm یا attribute رو میذاری درست نمیشه؟

          من از avr studio استفاده میکنم...
          https://www.linkedin.com/in/mohammadhosseini69

          http://zakhar.blog.ir

          دیدگاه


            #50
            پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

            من از ادیتور winavr (PN) استفاده میکنم.
            برای تعریف آرایه باید یه هدر فایلو اضافه کرد. :eek: ولی در کمال ناباوری راه حل مشکل همین بود.
            بدون این هدر فایل این تعریف میشد.unsigned char a[] __attribute__ ((progmem))="Exit";
            برای تعریف این شکلی باید این هدر فایلو هم باز کرد.char str[] PROGMEM = "test Array";
            چرا این جوری شد؟
            اولی که قیافش پیچیده تر از دومی پس چرا اون یکی هدر فایل میخواد؟؟؟ oo:
            دوستان لطف کنید یکمی هم در این مورد صحبت کنید.قضیه رو یه کمی باز تر کنید تا فرق اینا رو هم متوجه بشیم.

            البته محض اطمینان بیشتر، بهتره که const هم بذارین.
            لازم نبود.با AVRstudio چک کردم .توی پروگرم مموری تعریف شده بود :agree:
            [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

            دیدگاه


              #51
              پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

              رفتم بررسی کردم جای هیچ نگرانی نیست!
              فقط بخاطر چندتا ماکرو...
              تو کتابخونه pgmspace داریم :

              #ifndef __ATTR_PROGMEM__
              #define __ATTR_PROGMEM__ __attribute__((__progmem__))
              #endif

              و

              #define PROGMEM __ATTR_PROGMEM__

              می بینید PROGMEM با __ATTR_PROGMEM__ جایگذاری میشه و __ATTR_PROGMEM__ هم با __attribute__((__progmem__)) . دیگه در ادامه چه اتفاقی می افته نمی دونم. بهرحال همون میشه ...

              یه ماکرو دیگه هم تو همین فایل پیدا کردم که چندجا قبلا دیده بودم فکر میکردم چی باید باشه... الان میبینم که خیلی فسقلیه!!

              # define PSTR(s) ((const PROGMEM char *)(s))

              دیگه تابلو چیکار میکنه. هرجا یه رشته ثابت داشتین میتونین با دستور PSTR بفرستینش تو flash... (فلفل نبین چه ریزه...)
              مثل این

              glcdPutStr(PSTR("Test graphical lcd&quot);

              کارو راحت میکنه.
              https://www.linkedin.com/in/mohammadhosseini69

              http://zakhar.blog.ir

              دیدگاه


                #52
                چندتا نکته!!!!!!

                سلام
                گفتم بچه ها دارن در مورد winavr مطلب می نویسند من هم یه چن خط بنویسم:
                _در مورد eclipse ظاهرا همه تعریف کردن اما روش کار اون به خوبی توضیح داده نشده گفتم چند مورد که خودم باهاش برخورد کردم براتون بگم
                1- یادمه یکی از دوستان در مورد نحوه فعال سازی AVRLIB داخل Eclipse گفت : ظاهرا اینجوریه :اول باید روی پروژه ای که ایجاد کردین راست کلیک کنید و بعد مسیر:

                Properties>>c/c++ Build>>Environment
                اینجا هست که باید AVRLIB وارد بشه البته اگه کتابخونه رو نصب کرده باشین با ایجاد یه مسیر فرضی و با نام AVRLIB میبینید که دو مسیر برای AVRLIB وارد شده (درست مثل متغییر path) البته بهتر این کار رو نکنین و خود فایل ها رو به پروژه اضافه کنید.( الان فهمیدم اگه کتابخونه نصب باشه تو همون مسیر دکمه انتخاب رو کلیک کنید و از اونجا کل متغییرهای محیطی رو می تونید ببینید).
                2- اگه روی یه تابع (جایی که تابع رو برای برنامه تعریف می کنید و یا فرا میخونین) چه خودتون تعریف کرده باشین چه تو سرفایل ها باشه چند لحظه وایسین یه کادر باز میشه که می تونید توی اون کل تابع رو ببینین البته برای متغییر ها و سایر موارد نیز این موضوع صادقه.(چند پست پائین تر یکی از دوستان ویراشگری باهمین توانایی می خواست!)
                3- توی پنجره به اسم outline کلیه تعریف ها ، متغییر ها ، سرفایل ها، توابع تعریف شده و... لیست شدند البته با آیکن های خاصه هر موضوع(خیلی باحاله) اگه یه موقع خاصین به متغییر خاصی روجوع کنید یا به تابع خاصی رو ببینین می تونین روی اسم اون کلیک کنید. یکی و یژگی جالب اون اینه که: مثلا اگه رو ی avr/io.h در پنجره outline کلیک کنید به سرعت اون فایل داخل برنامه باز میشه!!
                4- اگه می خواین بدونین یه متغییر تو کجاها تعریف شده، استفاده شده و... می تونید روی اون متغییر راست کلیک کنید و open call hierarchy کلیک کنید یه پنجره پائین باز میشه که میتونید به راحتی آمار رو ببینین
                5- اگه یه زمان تصمیم گرفتین اسم یه متغییر رو عوض کنید روی اون راست کلیک کنید و بعد:
                Refactor>>rename…
                و اینجا می تونین اسم متغییر رو عوض کنید
                6- امکان دیگر که خیلی فاز میده در مورد تاریخچه هست با خسوف (eclips) نیازی به پشتیبان گیری از برنامه هایی که می نویسین نیست چرا؟ چون برنامه تاریخچه انجام تغییرات رو نگه میداره! برای فراخوانی تاریخچه یه پروژه هست :
                روی فایلی که می خواین تاریخچه رو ببینین راست کلیک کنید:
                Replace with >> local history
                تو پنجره ای که باز میشه یه زمان رو باز کنید تا آمپر بچسبونین !!!!!!!!! البته امکان مقایسه تاریخچه و یا دو تا فایل با هم،هم وجود داره :
                Compare with>>…
                (این مورد 6 رو حتما چک کنید!!!)

                _در مورد make file::
                همون طور که می دونید(یا کنجکاوین که بدونین) فایلی با نام wish.exe این قسمت رو براتون می سازه و از mfile.tcl به عنوان الگو استفاده می کنه( یه نکته اگه خواستین یه shortcut رو دستکتاپ بذارین تو قسمت target میانبر باید اینجوری وارد بشه :
                X:\WinAVR-20100110\bin\wish84.exe mfile.tcl
                ) که این فایل هم از makefile_template به عنوان الگو استفاده می کنه  نتیجه اگه نیاز داشتین به یک makefile شخصی می تونید این فایل makefile_template رو ویرایش کنید مثلا میکرو مگا 32 رو بنویسین

                درضمن حتما از یوزری به نام "حمید رستمی" درخواست کمک کنیم(کنید)! ایشون لینوکسیه و کلا gccکار!

                در پایان خودم هم یه سری سوال ودرخواست داشتم که میخواستم مطرح کنم:
                1- ظاهرا پروتئوس با avrlib مشکل جدی داره !!! من هم توشبیه سازی با مشکل مواجه شدم، کسی علت رو میدونه؟
                2- بروبچ سعی کنند کتابخونه گیر آوردن اینجا معرفی کنند خیلی مفیده ها!!
                3- توسایت کویر الکترونیک گفته winavrقابلیت مستقیم کار با usbasp رو داره(چون از avrdude برای پروگرام کردن استفاده میکنه) اما توتنظیمات پروگرامر فایل make من چنین گزینه رو ندیدم(الان مطمئن نیستم اما ظاهرا makefile ویرایشگر eclips این گزینه هست)؟

                دیگه ببخسید.......

                دیدگاه


                  #53
                  پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                  مثل اینکه دوباره باید گیر بدم!

                  استفاده از ماکروی PROGMEM بجای قید کردن خود متن attribute باعث خواناتر و استاندارد شدن برنامه میشه. ایضا من بجای کار با پروتئوس و این گونه نرم افزار ها با استفاده از دستورات پیش پردازشگر C برنامه را تحت windows جواب میگیرم و پس از جواب گرفتن منطق اصلی برنامه اون رو با winavr کامپایل میکنم. اینجور مواقع در هدر تطبیقی خودم میام و ماکروی PROGMEM رو دوباره تعریف میکنم تا کد بدون هیچ مشکلی کامپایل و اجرا بشه. در صورتی که نمیشه این دستور attribute رو همچین کاری باهاش کرد. ضمنا ممکنه طرز نوشتن این دستور در نسخه های آتی gcc عوض بشه. که در اون صورت مجبوریم کد رو دست بزنیم. ولی با استفاده از این ماکرو تمامی زحمت ها به عهده gcc خواهد بود.

                  ماکروی PSTR رو اگه بهش درست دقت کنین میبینین که دید رو عوض میکنه نه بخش رو. مثلا کر زیر درست کامپایل میشه ولی درست اجرا نمیشه.


                  static char s[]="test";

                  putsF(PSTR(s));


                  حالا شانستون این ماکرو کار میکنه به این خاطره که یک رشته کاراکتری ثابت بایستی برای دسترسی در فلش قرار بگیره. یعنی کد زیر:


                  static char s[]="test";


                  دقیقا معادل کد زیر هستش:


                  static char s[5];
                  static char s_data[sizeof(s)] PROGMEM="test";

                  memcpy_P(s, s_data, sizeof(s));


                  منتهی مراتب عمل کپی قبل از تابع main اجرا میشه. اینجا هم محتوای متن "test" در فلش قرار میگیره ولی قبل از اجرای main از فلش به رم کپی میشه.

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

                  دیدگاه


                    #54
                    پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                    راستی یادم رفت. بهتره طبق توصیه آقای حسینی حتما const هم بذارین به دو علت مهم. اولا کدتون بیشتر portable میشه. چون بعضی جاها مثل کامپایلر کیل روی آرم برای قرار دادن این مقادیر ثابت در بخش PROGMEM فقط از const میشه استفاده کرد. چون حافظه flat دارند. از طرف دیگه اگر جایی در کد اشتباهی به این اطلاعات دسترسی برای تغییر انجام شد کامپایلر بهتون گیر میده. بهتر اینه که اشکالات کد رو حتی المقدور در زمان کامپایل بفهمیم نه در زمان اجرا.

                    دیدگاه


                      #55
                      پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                      دست همگیتون درد نکنه.مشکل آرایه های یه بعدی کامل حل شد . :applause:
                      ولی نمیدونم چرا توی دوبعدی مشکل دیگه ای به وجود اومد؟من آرایه دو بعدی رو اینطوری تعریف میکنم:
                      const unsigned char str[2][] PROGMEM = {"test Array1","test array2"};
                      که موقع کامپایل این اررور رو میده:array type has incomplete element type
                      توی کامپایلر های دیگه ی سی اینجوری تعریف میکردم درست بود اما اینجا ...
                      [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                      دیدگاه


                        #56
                        پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                        چندتا پست قبلی پرسیده بودم فرق ISR و SIGNAL تو تعریف وقفه چیه ..؟..

                        در نسخه های قدیمی تر winavr از دستورهای SIGNAL و INTERRUPT برای تعریف وقفه استفاده میشد. اما بدلیل مشکلاتی که داشتن، در نسخه های جدیدتر دستور دیگه ای به نام ISR برای تعریف وقفه ها اضافه شد. و توصیه میشه از ISR استفاده کنید.
                        یکی از تفاوت های ISR با SIGNAL در اینه که ISR غیر از بردار وقفه، یه پارامتر دیگه هم میتونه بگیره که ویژگی خاصی به اون وقفه بده. (البته کلمه پارامتر صحیح نیست چون اینا ماکرو هستن... بهرحال...)
                        اول یه تعریف عادی با ISR رو ببینید : (وقفه خارجی 0)

                        #include <avr/interrupt.h>
                        ISR(INT0_vect)
                        {
                        //code
                        }

                        ISR در هدر INTERRUPT.h تعریف شده و بردارهای وقفه هم در هدر مخصوص آی سی مثل iom16.h
                        فرض کنید مدارمون یه ارتباط سریال همراه با وقفه دریافت سریال داره. می خوایم یه کاری کنیم که اگه وقفه ای مثل وقفه خارجی INT0 فعال شده و در حال اجرا بود، جلوی وقفه دریافت سریال رو نگیره تا اطلاعات از دست نره. برای این کار از ویژگی ISR_NOBLOCK استفاده می کنیم. اینطوری :

                        ISR(INT0_vect, ISR_NOBLOCK)
                        {
                        //code
                        }

                        ISR_NOBLOCK باعث میشه این وقفه جلوی اجرای وقفه های دیگه رو نگیره. البته کار خیلی ساده. فقط با دستور sei وقفه سراسری دوباره فعال میشه. مثلا اگه کد وقفه شما اینطوری بود :

                        push r1
                        push r0
                        in r0, 0x3f ; 63
                        push r0
                        eor r1, r1

                        با ISR_NOBLOCK اینطوری میشه :

                        sei /* re-enables INTS right away */
                        push r1
                        push r0
                        in r0, 0x3f ; 63
                        push r0
                        eor r1, r1

                        فرقی هم نمیکنه میتونید وقفه رو اینطوری بنویسین :

                        ISR(INT0_vect)
                        {
                        sei();
                        //code
                        }

                        در مقابل ISR_NOBLOCK، ویژگی ISR_BLOCK باعث میشه وقفه مورد نظرتون، تا وقتی که به پایان نرسیده، جلوی اجرای تمام وقفه ها رو بگیره.
                        دو تا ویژگی دیگه ISR_NACKED و ISR_ALIASOF هم هست که من هنوز دقیقا نمیدونم چیکار میکنن.
                        https://www.linkedin.com/in/mohammadhosseini69

                        http://zakhar.blog.ir

                        دیدگاه


                          #57
                          پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                          نوشته اصلی توسط shahinbahari
                          دست همگیتون درد نکنه.مشکل آرایه های یه بعدی کامل حل شد . :applause:
                          ولی نمیدونم چرا توی دوبعدی مشکل دیگه ای به وجود اومد؟من آرایه دو بعدی رو اینطوری تعریف میکنم:
                          const unsigned char str[2][] PROGMEM = {"test Array1","test array2"};
                          که موقع کامپایل این اررور رو میده:array type has incomplete element type
                          توی کامپایلر های دیگه ی سی اینجوری تعریف میکردم درست بود اما اینجا ...
                          شما مطمئنی.
                          چون تو زبان c و c++ در آرایه ها فقط بعد اول رو میتونی خالی بزاری که توسط کامپایلر پر میشه.
                          و این مسئله از نظر تخصیص حافظه، منطقی هم هست.
                          اگه توضیح بیشتر لازمه بگو.

                          راستی چرا وقتی login میکنم به صورت خودکار به صفحه ای که بودم منطقل نمیشم؟ :angry:
                          این خیلی عذاب آوره.

                          دیدگاه


                            #58
                            پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                            نوشته اصلی توسط esinico
                            شما مطمئنی.
                            چون تو زبان c و c++ در آرایه ها فقط بعد اول رو میتونی خالی بزاری که توسط کامپایلر پر میشه.
                            و این مسئله از نظر تخصیص حافظه، منطقی هم هست.
                            اگه توضیح بیشتر لازمه بگو.

                            راستی چرا وقتی login میکنم به صورت خودکار به صفحه ای که بودم منطقل نمیشم؟ :angry:
                            این خیلی عذاب آوره.
                            آره حق با شماست.از روز اول من میونه ی خوبی با آرایه های چند بعدی نداشتم.
                            این شکلی نوشتم درست شد.
                            onst unsigned char str[][10] PROGMEM = {"test Array1","test array2"};
                            [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                            دیدگاه


                              #59
                              پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                              راجع به موردی که آقای حسینی راجع به ISR گفته بودند:

                              فرقی هم نمیکنه میتونید وقفه رو اینطوری بنویسین :
                              ISR(INT0_vect)
                              {
                              sei();
                              //code
                              }
                              اتفاقا فرق میکنه اما خیلی جزئی. دستور sei در حالتی که از ISR_NOBLOCK استفاده میشه ابتدای کد روتین میاد در صورتی که با این چیزی که آقای حسینی گفتن بعد از تمام کدهای اولیه روتین میاد. ضمنا اگر ماکروی sei در حالتی که از ISR_NOBLOCK استفاده نمیشه یادمون بره همه چیز ممکنه به هم بریزه. ضمنا با قید ISR_NOBLOCK کد خوانا تر هست و تا حدودی دید خواننده بعدی کد رو به صورتی جزئی از دستور sei دور میکنه.
                              البته شاید این مورد کمتر از 1 درصد ارزش داشته باشه. ولی خوب من عادت دارم به همه چیز گیر بدم!

                              راجع به آرایه تک بعدی ... کامپایلر بایستی بتونه از روی کد نوشته شده حجم بعد دوم رو تشخیص بده. در صورتی که قید ثوابت بصورت رشته های کاراکتری منجر به تولید اندازه های متفاوتی میشه. یک چیزی تو مایه های jagged array در سی شارپ. ضمنا اینگونه آرایه تعریف کردن شاید اینجوری بخواد تعبیر بشه که "یک سری رشته ثابت در فلش داریم" که خوب میشه به نوعی دیگه تعریفش کرد (البته اگه منظور راحتی نوشتن کد باشه)


                              static const prog_char *list[] PROGMEM = {"test1", "a", "ccc"};



                              یا


                              static const prog_char *list[] = {"test1", "a", "ccc"};


                              که البته مشکل مورد اول خواندن محتوای اشاره گر به رشته مورد نظر از داخل آرایه قبل از استفاده است که استفاده رو یک کمی مشکل میکنه ولی از لحاظ استفاده از حافظه رم بهینه تر هست. در صورتی که در مورد دوم استفاده راحتتره ولی کل آرایه اشاره گر ها در حافظه رم کپی میشه.

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

                              مثال:


                              prog_char *get_list(int index)
                              {
                              prog_char *p;

                              if((unsigned)index >= dim(list))
                              return (prog_char *)NULL;
                              memcpy_P( &p, &list[index], sizeof(p));
                              return p;
                              }


                              دیدگاه


                                #60
                                پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                                نوشته اصلی توسط reza_agha
                                راجع به موردی که آقای حسینی راجع به ISR گفته بودند:

                                اتفاقا فرق میکنه اما خیلی جزئی. دستور sei در حالتی که از ISR_NOBLOCK استفاده میشه ابتدای کد روتین میاد در صورتی که با این چیزی که آقای حسینی گفتن بعد از تمام کدهای اولیه روتین میاد.
                                کدهای اولیه روتین دیگه چه صیغه ایه؟! حالا مگه این کدا چند سیکل وقت میگیره؟! عاشق این گیر دادنتم! بهرحال ممنون از این که اشکالات رو گوش زد میکنی :redface:
                                در مورد اون دوتا ویژگی دیگه ISR چیزی نمیدونی؟ ISR_NACKED و ISR_ALIASOF
                                https://www.linkedin.com/in/mohammadhosseini69

                                http://zakhar.blog.ir

                                دیدگاه

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