اطلاعیه

Collapse
No announcement yet.

کوچ کردن از کدویژن به AtmelStudio

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

    پاسخ : کوچ کردن از کدویژن به AtmelStudio

    ببخشید من اشتباه گفتم!!
    eram متغیر رو در حافظه eeprom ذخیره میکنه!
    حالا واسه ذخیره در eeprom کتابخونه یا دستور خاصی وجود داره؟

    دیدگاه


      پاسخ : کوچ کردن از کدویژن به AtmelStudio

      کدهای مورد نیاز در فایل avr/eeprom.h وجود داره
      امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

      دیدگاه


        پاسخ : کوچ کردن از کدویژن به AtmelStudio

        با عرض سلام خدمت دوستان گرامی.

        سوال اینه چرا توبعضی از توابع میان ارگومان اون تابع رو به این صورت تعریف میکنن:
        کد:
        void read(void*){
        ...
        }
        و جاهای دیدیم که عبارت const رو در تعریف ارگومان استفاده میکنن:

        کد:
        uint8_t eeprom_read_byte ( const uint8_t * addr )
        با تشکر
        .The best question deserves a better answer
        =-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=
        «پناه»می برم «به خدا»
        از عـیبی که ، «امروز» در خود می بینم، و «دیروز» «دیگران را» به خاطر، «هـمان عیـب» ملامت کرده ام.
        محتاط باشیم، در «سرزنش» و «قضاوت کردن دیگران». وقتی نه از «دیروز او» خبر داریم و نه از "فردای خودمان" .

        دیدگاه


          پاسخ : کوچ کردن از کدویژن به AtmelStudio

          معمولا هنگام تعریف یک اشاره گر نوع آن را هم مشخص می کنیم مثلا *uint8_t اشاره گری را از نوع uint8_t تعریف می کند که اندازه آن برابر 1 بایت است یعنی به یک بایت از حافظه اشاره می کند. اما در *void نوع اشاره گر مشخص نیست و فقط به محلی از حافظه اشاره می کند. استفاده از آن در آرگومان تابع به این دلیل هست که نوع اشاره گر ورودی برای تابع مشخص نیست و یا اینکه مهم نیست مثلا در همین هدر eeprom ممکن هست ورودی تابعی آرایه ای باشد که عناصر آن از نوع uint16_t و 2 بایتی است. برای تابع مهم نیست چه نوع داده ای را کپی می کند فقط کافیست تعداد کل بایتها درست باشد.

          در مورد سوال دوم به این دلیل از const استفاده شده که در داخل بدنه تابع تغییری در مقدار اشاره گر داده نمی شود و تابع از یک آدرس ثابت 1 بایت را می خواند بنابراین ثابت در نظر گرفته شده.
          گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

          دیدگاه


            پاسخ : کوچ کردن از کدویژن به AtmelStudio

            با تشکر از پاسختون


            در رابطه با void* سوالی برا پیش اومد

            فرض کنیم این تابع رو داشته باشیم:
            کد:
            void wirte (void*){
            PORTD=...;
            }
            من به جای یه نقطه چی بزارم که طبق فرمایشات شما مقدار ارگومان من در PORTD لحاظ بشه.

            بعد در رابطه با const عرضم خدمت شما این هست که اگه قرار باشه یک مقدار ثابت لحاظ بشه چه لزومی داره اصلا اونو به عنوان ارگومان در نظر بگیریم؟
            .The best question deserves a better answer
            =-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=
            «پناه»می برم «به خدا»
            از عـیبی که ، «امروز» در خود می بینم، و «دیروز» «دیگران را» به خاطر، «هـمان عیـب» ملامت کرده ام.
            محتاط باشیم، در «سرزنش» و «قضاوت کردن دیگران». وقتی نه از «دیروز او» خبر داریم و نه از "فردای خودمان" .

            دیدگاه


              پاسخ : کوچ کردن از کدویژن به AtmelStudio

              شما برای تعریف آرگومان باید براش اسم بذاری
              مثلا:
              کد:
               void wirte (void* Value)
              {
              PORTD=(uint8_t)Value;
              }
              بعد در رابطه با const عرضم خدمت شما این هست که اگه قرار باشه یک مقدار ثابت لحاظ بشه چه لزومی داره اصلا اونو به عنوان ارگومان در نظر بگیریم؟
              مثلاً یک سری آرایه داریم که شامل عکس هست (برای LCD گرافیکی)
              آرایه عکس ها ثابت هست
              یک تابع نیاز داریم این آرایه های ثابت را روی LCD نمایش بده ، باید ورودی تابع را const تعریف کنیم ، چون آرایه هامون const هست

              موفق باشید
              امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

              دیدگاه


                پاسخ : کوچ کردن از کدویژن به AtmelStudio

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

                دیدگاه


                  پاسخ : کوچ کردن از کدویژن به AtmelStudio

                  دوستان در تاپیک های قبل خوندم که برای دیباگ کردن بهترین حالت none هست برای بهینه سازی کد.


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


                  تشکر./
                  .The best question deserves a better answer
                  =-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=
                  «پناه»می برم «به خدا»
                  از عـیبی که ، «امروز» در خود می بینم، و «دیروز» «دیگران را» به خاطر، «هـمان عیـب» ملامت کرده ام.
                  محتاط باشیم، در «سرزنش» و «قضاوت کردن دیگران». وقتی نه از «دیروز او» خبر داریم و نه از "فردای خودمان" .

                  دیدگاه


                    پاسخ : کوچ کردن از کدویژن به AtmelStudio

                    در رابطه با Optimization در منوال avr-libc در صفحه 77 نتیجه یک آزمایش آورده شده که به صورت زیر هست:
                    کد:
                    Optimizationflags   Size of .text	Time for test #1
                    	-O3		 6898		903 μs				
                    	-O2		 6666		972 μs					
                    	-Os		 6618		955 μs
                    -Os-mcall-prologues	 6474		972 μs
                    The difference between 955 μs and 972 μs was just a single timer-tick
                    طبق این جدول سریع ترین کد مربوط به حالت O3 اما با بیشترین حجم کد خروجی. حالت O2 حجم کد کمتری دارد اما کندتر است. حالت Os حجم کد کمتر و سریعتر از حالت دوم . اما در حالت چهارم که ترکیبی از Os و یک دستور هست هرچند سرعت اجرای برابر با حالت دوم دارد اما کمترین حجم کد خروجی رو تولید می کند.
                    در ادامه متن نتیجه گیری کرده که بهترین حالت مربوط به حالت چهارم هست و در کاربردهایی که نیاز به سرعت بیشتر باشد بهتر هست از حالت O3 استفاده شود.
                    با همه این داستانها باز هم به برنامه نویس بر می گردد که بین سرعت و حجم کد طبق کاربرد خودش تعادلی رو برقرار کند و یا اینکه برای کاربردهای خیلی حساس برنامه رو مستقیما به زبان اسمبلی بنویسد. برای جزئیات بیشتر در رابطه با نحوه بهینه سازی کدها و توضیحات دستورات بهینه سازی باید به داکیومنت GCC مراجعه کنید.
                    گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

                    دیدگاه


                      پاسخ : کوچ کردن از کدویژن به AtmelStudio

                      سلام
                      عرض کنم که:

                      از همه مدل های بهینه ساز استفاده کردم اما بعضی از توابع و دستورات داخل برنامه نادیده گرفته میشه...


                      پیشنهادی برای رفع این مشکل دارین؟

                      در کدویژن همچین مشکلی نبود. :sad:
                      .The best question deserves a better answer
                      =-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=
                      «پناه»می برم «به خدا»
                      از عـیبی که ، «امروز» در خود می بینم، و «دیروز» «دیگران را» به خاطر، «هـمان عیـب» ملامت کرده ام.
                      محتاط باشیم، در «سرزنش» و «قضاوت کردن دیگران». وقتی نه از «دیروز او» خبر داریم و نه از "فردای خودمان" .

                      دیدگاه


                        پاسخ : کوچ کردن از کدویژن به AtmelStudio

                        ممکنه بعضی متغیر ها هنگام کامپایل حذف می شوند، آنها را با volatile بنویسید
                        کد:
                        volatile unsigned char a;
                        موفق باشید
                        امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                        دیدگاه


                          پاسخ : کوچ کردن از کدویژن به AtmelStudio

                          نوشته اصلی توسط Abbas Sarami
                          ممکنه بعضی متغیر ها هنگام کامپایل حذف می شوند، آنها را با volatile بنویسید
                          کد:
                          volatile unsigned char a;
                          موفق باشید
                          تشکر مهندس
                          یعنی همه متغیر هارو volatile بزنم ؟
                          .The best question deserves a better answer
                          =-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=
                          «پناه»می برم «به خدا»
                          از عـیبی که ، «امروز» در خود می بینم، و «دیروز» «دیگران را» به خاطر، «هـمان عیـب» ملامت کرده ام.
                          محتاط باشیم، در «سرزنش» و «قضاوت کردن دیگران». وقتی نه از «دیروز او» خبر داریم و نه از "فردای خودمان" .

                          دیدگاه


                            پاسخ : کوچ کردن از کدویژن به AtmelStudio

                            ببین بعضی متغیر ها در معرض حذف شدن توسط کامپایلر هستند، متغیر هایی همچون:
                            شمارنده ها - برخی حالات بافر ها - متغیر هایی که عملیات ریاضی روی آنها انجام نشده باشه - متغیری که فقط مقدار داده شده باشه و استفاده نشده باشه و ...
                            یعنی همه متغیر هارو volatile بزنم ؟
                            نیازی نیست همه را volatile کنی ، اون قسمت هایی که برنامه اجرا نمیشه و یا با اشکال مواجه میشه متغیرهاش را با volatile بنویس
                            مثلاً:
                            کد:
                            void delay (void)
                            {
                            uint16_t d;
                            for(d=0;d<10000;d++);
                            }
                            در مثال بالا متغیر d شدیداً در معرض خطر هست :twisted: و اگه حذف بشه کل تابع منحل میشه
                            با اضافه کردن volatile به کد بالا دیگه مشکلی بوجود نمیاد :agree:
                            کد:
                            void delay (void)
                            {
                            volatile uint16_t d;
                            for(d=0;d<10000;d++);
                            }
                            موفق باشید
                            امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                            دیدگاه


                              پاسخ : کوچ کردن از کدویژن به AtmelStudio

                              سلام به همه
                              صلوات
                              دوستان به برنامه زیر نگاه کنین :
                              کد:
                              uint8_t test[]  = "hello_user";
                              
                              void lcd_write_string_4d(uint8_t *);
                              
                              int main(void)
                              {
                              	lcd_write_string_4d(test);
                              }
                              
                              void lcd_write_string_4d(uint8_t theString[])
                              {
                                volatile int i = 0;               // character counter*/
                                while (theString[i] != 0)
                                {
                                  lcd_write_character_4d(theString[i]);
                                  i++;
                                  _delay_us(80);               // 40 uS delay (min)
                                }
                              }
                              بخش مورد نظر من:
                              کد:
                              void lcd_write_string_4d(uint8_t *);
                              سوالم اینجاست که چرا گاهی اوقات در قسمت پارامترها (آرگومان های تابع) بعد از تعریف نوع پارامتر از ستاره استفاده میشه؟
                              آیا میشه موقع معرفی تابع از همون اول این قسمت رو به این شکل نوشت؟اگر میشه پس چرا از این شیوه " * " استفاده میکنن؟
                              کد:
                              void lcd_write_string_4d(uint8_t theString[]);
                              تا به حال چندین جا دیدم که در قسمت پارامتر های یک تابع از ستاره استفاده میشه و نتونستم تا به حال جوابش رو پیدا کنم مثل نمونه زیر:
                              کد:
                              void lcd_puts(char *str);
                              ممنون میشم کمکم کنین.
                              ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ*فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                              شهید دکتر مصطفی چمران
                              اللهم صل علی محمد و ال محمد و عجل فرجهم
                              ; C is not for children

                              دیدگاه


                                پاسخ : کوچ کردن از کدویژن به AtmelStudio

                                گذاشتن ستاره پشت اسم متغیر باعث میشه که اون متغیر به یک اشاره گر تبدیل بشه. اشاره گر ها مبحث خیلی گسترده و پیچیده ای هستند که کاربرد خیلی زیادی هم دارند.

                                وقتی متغییر را به صورت اشاره گر تعریف می کنند خود اسم متغیر حاوی آدرس متغیر است و اگه یه ستاره پشتش بیاد میشه مقداری که داخل اون آدرس هست. وقتی هم شما آرایه تعریف می کنید هم به همین صورت هست یعنی اسم آرایه در واقع آدرس اولین خانه ای است که آرایه داخلش قرار داره و وقتی شما مثلا جلوش می نویسید [1] یعنی یه خونه توی حافظه از آدرس اولیه برو جلو و مقدارش را برگردون.

                                دیدگاه

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