اطلاعیه

Collapse
No announcement yet.

نکاتی در برنامه نویسی C (کامپایلر IAR)

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

    #46
    پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

    با سپاس ، برای اینکه مطمئن شوم که درست متوجه شده ام می خواهم پرسش کنم که :
    آیا می توان تعداد آرایه ها را در فایل lst مشاهده کرد و سپس آن عدد را بجای(sizeof (notes در شرط حلقه for گذاشت ؟

    دیدگاه


      #47
      پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

      در برنامه مورد نظر در انتهای فایل lst می توانید مقادیر زیر را مشاهده کنید:

      Function/Label Bytes
      -------------- -----
      notes 1684


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

      دیدگاه


        #48
        پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

        در ایام اخیر مشغول یک برنامه نویسی بسیار سنگین و پرحجم هستم که در جریان آن دو مورد به نظرم رسید که در این تاپیک ذکر کنم. مطلب اول، اهمیت و کاربرد بالای union است که در پست های ابتدایی تاپیک هم به آن اشاره شد. فرض کنیم که لازم است آرایه ای با اعضای 16 بیتی را در sram تعریف کنیم و در بعضی مواقع به اعضای آرایه بصورت 16 بیتی دسترسی پیدا کنیم. همچنین در مواقعی هم نیاز به دسترسی و کار با تک تک بایت های آن آرایه وجود داشته باشد. در اینحالت هر چند می توان از روی آرایه با اعضای 16 بیتی به بایت های بالا و پائین آن هم دسترسی پیدا کرد. اما یک روش ممکن برای ساده تر شدن این کار استفاده از union بصورت زیر است (با فرض 256 عضو 16 بیتی)

        کد:
        union
        {
         unsigned int buffer16[256];
         unsigned char buffer8[512];
        };


        با چنین تعریفی هروقت لازم باشد بصورت توام به 16 بیت دسترسی پیدا شود، می توان از طریق آرایه 16 بیتی و در صورت نیاز به تک تک بایت ها می توان به آرایه با اعضای 8 بیتی دسترسی پیدا کرد و این دو آرایه در واقع در یک محل تعریف شده اند.

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

        دیدگاه


          #49
          پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

          با سلام خدمت استاد کی نژاد و سایر عزیزان.
          میخواستم اگر امکان داره ebook جامع و کامل راجع به C++ و مباحث پیشرفته اون معرفی کنید.
          با تشکر فراوان.

          دیدگاه


            #50
            پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

            نوشته اصلی توسط امیر . م
            میخواستم اگر امکان داره ebook جامع و کامل راجع به C++ و مباحث پیشرفته اون معرفی کنید.
            یکی از اصلی ترین منابع کتاب The C++ Programming Language است که تا ویرایش چهارم آن عرضه شده و توسط مبدع این زبان (Bjarne Stroustrup) نوشته شده است. به احتمال زیاد نسخه pdf آن هم باید موجود باشد که باید زحمت جستجو را بکشید.

            پی نوشت: در لینک زیر ویرایش سوم کتاب وجود دارد:

            http://poincare.matf.bg.ac.rs/~milan...20Language.pdf
            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


              #51
              پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

              اپراتور Concatenation با نماد ## یکی از اپراتورهای بسیار مفید در c است که کمتر شناخته می شود که نمونه ای از کاربرد آن در فایل avr_compiler.h وجود دارد:

              #define ISR(vec) PRAGMA( vector=vec ) __interrupt void handler_##vec(void)


              در پست زیر هم نمونه دیگری از کاربرد آن قابل مشاهده است:

              http://www.eca.ir/forum2/index.php?t...5805#msg475805
              اوژن: به معنای افکننده و شکست دهنده است
              دانایی، توانایی است-Knowledge is POWER
              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

              دیدگاه


                #52
                پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

                سلام
                نیاز دارم که یه کد که به زبان اسمبلی نوشته شده در قسمتی از اون تابع main که به زبان C نوشته شده قرار بگیره و در نهایت کل مجموعه کامپایل و اجرا بشه
                به عبارت دیگه میخوام پروژه به شکلی باشه که تو فایل C مثل پروژه های معمولی یه تابع main باشه و با C برنامه نویسی کنیم اما در نهایت کد اسمبلی این فایل به یه فایل اسمبلی دیگه اضافه بشه و اون فایل کامپایل بشه و خروجی بده
                چی کار باید کرد؟
                با تشکر

                دیدگاه


                  #53
                  پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

                  یک روش استفاده از برنامه نویسی اسمبلی بصورت inline و در متن برنامه است و روش اصولی تر ایجاد یک فایل اسمبلی مجزا و Add کردن آن به پروژه و کامپایل آن در مجموعه فایل هاست. برای مثالی در مورد اخیر به فایل adc_driver_asm.S90 در پروژه AVR1300 و برای توضیحات مفصل تر به IAR Assembler Reference Guide در بخش Help مراجعه کنید.
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


                    #54
                    پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

                    اخیرا سوالی توسط یکی از دوستان مطرح شد که پاسخ آن می تواند از منظر برنامه نویسی C در avr و XMEGA مفید باشد. سوال این بود که چگونه می توان به محتوای یک آدرس مشخص از sram یا flash در برنامه دسترسی پیدا کرد. در مورد sram در پست های قبلی همین تاپیک پاسخ داده شده است که اگر آدرس مورد نظر در sram را address بنامیم، دستور زیر محتوای این آدرس را در متغیر 8 بیتی a قرار می دهد:

                    کد:
                    a=(*(unsigned char *)address);


                    اما در مورد حافظه flash مسئله به کلی متفاوت است. از آنجایی که معمولا آدرس ذکر شده برای flash بر حسب word بیان می شود و در هر آدرس هم دو بایت ذخیره می شود، برای دسترسی به بایت با ارزش کمتر در این آدرس می توان از روش زیر:

                    کد:
                    a=(*(unsigned char __flash *)(address<<1));


                    و برای دسترسی به بایت بالای موجود در همان آدرس از این روش استفاده کرد:

                    کد:
                    a=(*(unsigned char __flash *)((address<<1) + 1 ));
                    اوژن: به معنای افکننده و شکست دهنده است
                    دانایی، توانایی است-Knowledge is POWER
                    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                    دیدگاه


                      #55
                      پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

                      با سلام
                      چند وقت پیش موقع نوشتن یک تابع با یه موردی برخورد کردم که کلی سرکارم گزاشت، الان داشتیم با یکی از دوستان تو انجمن arm حول و هوش اون تابع بحث میکردیم که یادم افتاد و اون اینکه، از داخل تابع نباید آدرس رو برای یک متغیر خارج از تابع پاس کرد چرا که بر خلاف انتظار متغیر خارج از تابع با انجام اینکار به مقادیری که متغیر داخل تابع به آن ها اشاره میکنه اشاره نخواهد کرد.
                      چون که متغیر داخل تابع به فضای حافظه اشاره نمیکنه و درواقع یا به فضای استک و یا رجیستر اشاره میکنه بنایراین در صورت برگرداندن این آدرس به امید خواندن مقادیر مورد نظر، آدرس برگشت داده شده آدرس فضای حافظه اصلی نیست بلکه آدرسی از فضای حافظه است که معلوم نیست در آن چه چیزی قرار گرفته!

                      دیدگاه


                        #56
                        پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

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

                        دیدگاه


                          #57
                          پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

                          فرض کنید که به منظور خاصی می خواهیم تابعی بنویسیم که آدرس یک آرایه یا یک متغیر یک بعدی رو برای ما بر گردونه. مثلا یه همچین چیزی :
                          کد:
                          uint8_t *myfunc(void)
                          {
                          	 uint8_t x=0x44;
                          
                          	return(&x);
                          }
                          حالا اگر این تابع فرخوانی بشه آدرس فضایی که متغییر محلی داخل تابع به اون اشاره میکنه که احتمالا استک هست رو برمیگردونه، خوب حالا اگه ما بلافاصله بریم مقدار رو از آدرس بدست امده بخونیم مشکلی نداریم اما اگه این وسط یه تابع فراخونی بشه یا یه وقفه اتفاق بیوفته دیگه اون مقدار مورد نظر ما از دست رفته.

                          کامپایلر این رو بار اول که کامپایل میشه اعلام وارنیگ میکنه اما خطا نمیگره.

                          برای حل این مشکل باید متغیر به صورت static تعریف بشه. به صورت زیر :
                          کد:
                          uint8_t *myfunc(void)
                          {
                          	 static uint8_t x=0x44;
                          
                          	return(&x);
                          }
                          ولی با اینکار فضایی از حافظه اشغال میشه که میتونه خیلی هم بزرگ باشه برای پرهیز از این اتفاق میتونیم متغیر خارج از تابع رو به صورت آرگومان ورودی تابع تعریف کنیم و بعد آدرس متغیر داخل تابع رو برابر اون قرار بدیم و بعد عملیات مورد نظر رو روی متغیر محلی، به عنوان مثال تابع بالا رو میشه به صورت زیر نوشت:
                          کد:
                          void myfunc(uint8_t *y)
                          {
                          	 uint8_t *x;
                          		x=y;
                          		x[0]=0x44;
                          }
                          البته اینجا متغیر داخل تابع به نظر اضافه میاد و مبتونستیم که تابع رو به صورت زیر تعریف کنیم :
                          کد:
                          void myfunc(uint8_t *y)
                          {
                          		y[0]=0x44;
                          }
                          اما بعضی اوقات تابع باید بتونه هر متغیری از هر نوعی رو بپذیره برای همین این وسط یه متغیر میانی برای type casting نیاز خواهیم داشت مثلا:
                          کد:
                          void myfunc(void *y)
                          {
                          	 uint8_t *x;
                          		x=(uint8_t *)y;
                          		x[0]=0x44;
                          }

                          دیدگاه


                            #58
                            پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

                            با سپاس از استاد کی نژاد و دیگر بزرگان
                            اگر جای این سوال توی این تاپیک نیست معذرت میخوام چون برای میکرو های سری mega هست. اما چون به C مربوط میشه اینجا مطرح کردم.
                            برای دسترسی بیتی به پورت های میکرو علاوه بر روش های bit mask من از این روش نیز استفاده میکنم ( توی AtmelStudio )
                            کد:
                            #ifndef PORTS_H_
                            #define PORTS_H_
                            
                            #include <avr/io.h>
                            
                            typedef struct
                            {
                            	unsigned in0:1;
                            	unsigned in1:1;
                            	unsigned in2:1;
                            	unsigned in3:1;
                            	unsigned in4:1;
                            	unsigned in5:1;
                            	unsigned in6:1;
                            	unsigned in7:1;
                            	
                            	unsigned dir0:1;
                            	unsigned dir1:1;
                            	unsigned dir2:1;
                            	unsigned dir3:1;
                            	unsigned dir4:1;
                            	unsigned dir5:1;
                            	unsigned dir6:1;
                            	unsigned dir7:1;
                            
                            	unsigned out0:1;
                            	unsigned out1:1;
                            	unsigned out2:1;
                            	unsigned out3:1;
                            	unsigned out4:1;
                            	unsigned out5:1;
                            	unsigned out6:1;
                            	unsigned out7:1;
                            	
                            } PORT_STRUCT;
                            
                            #ifdef PORTA
                            #define PortA (*((volatile PORT_STRUCT*)(&PINA)))
                            #endif
                            
                            #ifdef PORTB
                            #define PortB (*((volatile PORT_STRUCT*)(&PINB)))
                            #endif
                            
                            #ifdef PORTC
                            #define PortC (*((volatile PORT_STRUCT*)(&PINC)))
                            #endif
                            
                            #ifdef PORTD
                            #define PortD (*((volatile PORT_STRUCT*)(&PIND)))
                            #endif
                            
                            #ifdef PORTE
                            #define PortE (*((volatile PORT_STRUCT*)(&PINE)))
                            #endif
                            
                            #ifdef PORTF
                            #define PortF (*((volatile PORT_STRUCT*)(&PINF)))
                            #endif
                            
                            #ifdef PORTG
                            #define PortG (*((volatile PORT_STRUCT*)(&PING)))
                            #endif
                            
                            #ifdef PORTH
                            #define PortH (*((volatile PORT_STRUCT*)(&PINH)))
                            #endif
                            
                            #ifdef PORTI
                            #define PortI (*((volatile PORT_STRUCT*)(&PINI)))
                            #endif
                            
                            #ifdef PORTJ
                            #define PortJ (*((volatile PORT_STRUCT*)(&PINJ)))
                            #endif
                            
                            #ifdef PORTK
                            #define PortK (*((volatile PORT_STRUCT*)(&PINK)))
                            #endif
                            
                            #ifdef PORTL
                            #define PortL (*((volatile PORT_STRUCT*)(&PINL)))
                            #endif
                            
                            #define Input 0
                            #define Output 1
                            #define High 1
                            #define Low 0
                            
                            #endif /* PORTS_H_ */
                            این کد توی یک فایل جدا مینویسم و به پروژه add میکنم. و به این شکل ازش استفاده میکنم:
                            کد:
                            #include <avr/io.h>
                            #include "ports.h"
                            
                            int main(void)
                            {
                            	PortB.dir0 = Input;
                            	PortB.dir1 = Output;
                            	PortB.out0 = High;
                            	
                              while(1)
                              {
                                if (PortB.in0 == Low)
                            		
                            			PortB.out1 = High;
                            		else
                            			PortB.out1 = Low;
                              }
                            }
                            البته کد فقط برای مثاله. یه سوال ذهن منو مشغول کرده اینه که چطور میشه با استفاده از union توی فایل هدر کاری کرد که بشه دسترسی به صورت بایت به پورت ها هم به همین قالب انجام بشه مثلا توی برنامه بتونیم بنویسیم

                            کد:
                            PortA.dir |= (1<<PA2);
                            شاید در کل سودی نداشته باشه. اما سوالم درمورد استفاده ی union و struct به شکلی که بتونه مقصود بالا رو بدست بده هست.

                            دیدگاه


                              #59
                              پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

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

                              دیدگاه


                                #60
                                پاسخ : نکاتی در برنامه نویسی C (کامپایلر IAR)

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

                                دیدگاه

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