اطلاعیه

Collapse
No announcement yet.

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

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

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

    ببینم اون *data به تنهایی چیه؟

    دیدگاه


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

      نوشته اصلی توسط شهریار رجب زاده
      ببینم اون *data به تنهایی چیه؟
      یعنی محتوای data
      در واقع با اینکار به محتوای data دسترسی پیدا می کنید. در واقع * عملگر مرجع یا indirection operator می باشد و به معنی ارجاع به آدرسی در حافظه است.(البته این عملگر برای ضرب هم استفاده میشه و از نوع استفاده این عملگر کامپایلر اونو تشخیص میده)

      آرگومان ورودی این تابع یک متغییر نوع اشاره گر هستش . از طرفی هم باید به این متغییر آدرس یک خانه داده بشه .

      در این قسمت


      کد:
       k=*data ++ ;

      نام data تنها اشاره به آدرس محل موردنظر دارد باوجود عملگر++ در هر بار آدرس محل یک واحد افزایش پیدا میکنه و محتوای اون با استفاده از عملگر * در متغییر K قرار می گیره

      دیدگاه


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

        با توجه به نداشتن تابع itoa در این کامپایلر،میتونید از این تابع زیر استفاده کنید

        کد:
        void itoa(char *buf, unsigned int i, int base)
        	{
        	char *s;
        #define LEN	10
        	int rem;
        	char rev[LEN+1];
        
        	if (i == 0)
        		s = "0";
        	else
        		{
        		rev[LEN] = 0;
        		s = &rev[LEN];
        		while (i)
        			{
        			rem = i % base;
        			if (rem < 10)
        				*--s = rem + '0';
        			else if (base == 16)
        				*--s = "abcdef"[rem - 10];
        			i /= base;
        			}
        		}
        	strcpy(buf, s);
        	}
        که buf خروجی تابع و ازنوع استرینگ(ارایه) هست
        i ورودی تابع که عدد صحیح است
        و base ضریب تقسیم است که اگر ورودی عدد صحیح است باید 10 و اگر ضریب دیگری مدنظر هست قرار بدید مثله 16 یا 8 یا 2
        در ضمن include کتابخانه sting.h در پروژهای c فراموش نشود
        هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
        بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
        میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

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

        دیدگاه


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

          نوشته اصلی توسط n340
          با توجه به نداشتن تابع itoa در این کامپایلر،میتونید از این تابع زیر استفاده کنید

          که buf خروجی تابع و ازنوع استرینگ(ارایه) هست
          i ورودی تابع که عدد صحیح است
          و base ضریب تقسیم است که اگر ورودی عدد صحیح است باید 10 و اگر ضریب دیگری مدنظر هست قرار بدید مثله 16 یا 8 یا 2
          در ضمن include کتابخانه sting.h در پروژهای c فراموش نشود
          نمیشه به جای اینکار از SPRINTF استفاده کرد؟

          دیدگاه


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

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

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

            دیدگاه


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

              به ماکرو زیر توجه کنید:

              کد:
              #define WORDREGISTER(regname) \
              union { \
              unsigned short regname; \
              struct { \
              unsigned char regname ## L; \
              unsigned char regname ## H; \
              }; \
              }


              مطابق این تعریف می توان به یک متغیر 16 بیتی نامی را اختصاص داد که در هنگام استفاده از آن علاوه بر دسترسی به کل متغیر از طریق بکار بردن آن بصورت مستقیم، به بایت های پائین و بالای آن هم با اضافه کردن یک L و H به انتهای نام آن دسترسی پیدا کرد. در این تعریف از اپراتور ## استفاده شده که سبب چسباندن یا به عبارتی concatenate شدن اسم متغیر با L یا H می شود.به عنوان مثال دیگری از عملکرد این اپراتور از کتاب K&R اگر

              کد:
              #define paste(front, back) front ## back


              تعریف شود، آنگاه حاصل
              کد:
               paste(name, 1)

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

              دیدگاه


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

                با توجه به نداشتن تابع itoa در این کامپایلر،میتونید از این تابع زیر استفاده کنید
                این تابع شما چند تا اشکال داره.
                اولا این تابع utoa هست و نه itoa.
                دوم اینکه چرا فقط برای مبنا های تا 10 و 16 کار میکنه. شاید من دلم خواست با مبنای 22 کار کنم.
                ایضا اینکه مجبور نیستین به ازای صفر بودن مقدار رشته "0" رو در s بذارین. بجاش از یک فرم do-while استفاده کنین.
                ثالثا فرم صحیح این تابع بصورت زیر هست:

                char * itoa ( int value, char * str, int base );


                رابعا این کد فرض اش بر اینه که مقدار آرگومان base همواره بزرگتر از صفر هست. در صورتیکه ممکنه منفی باشه (اشتباها) و در این صورت نتایج خوشایندی ببار نمیاد. این آرگومان باید مقدارش برای بین 2 و 36 بودن چک بشه.

                توضیح واضحات: مقدار ثابت "0" در فلش قرار میگیره و صرف عبارت فوق الذکر باعث تولید کد اضافی میشه و بایستی در رم جایی برای این رشته تخصیص داده بشه؛ توسط RTL درون این بافر کپی بشه و اون آدرس درون s قرار بگیره. برای این کار میشه از این کد استفاده کرد:


                char *itoa( int value, char * str, int base )
                {
                char sign;
                char *s;

                if( ( base < 2) || ( base > 36 ) )
                {
                *str = '\0';
                return str;
                }
                if(value < 0)
                {
                value = -value;
                sign = 1;
                }
                else
                sign = 0;

                s = str;
                do
                {
                int rem = value % base;
                *s++ = (rem < 10) ? (rem + '0&#039 : ((rem - 10) + 'A'
                if(value)
                value /= base; // speed optimization
                }while(value);
                if(sign)
                *s++ = '-';
                *s = '\0';
                return strrev(str);
                }


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

                دیدگاه


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

                  بله حرف حق جواب نداره
                  فقط جسارتا من هنوز سی اونقدر قوی نشدم
                  این خط چه کاری انجام میده
                  کد:
                  *s++ = (rem < 10) ? (rem + '0') : ((rem - 10) + 'A');
                  هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
                  بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
                  میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

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

                  دیدگاه


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

                    این به قوی بودن شما در سی برنمیگرده. یه کمی دقت بیشتر و یک کمی تجربه. همین. کدتون هم نسبتا خوب بود.
                    ضمنا این دستور یک if-else ضمنی هست. این دو خط کد رو ببینید:


                    if( a == b ) c = d; else c = e;
                    c = (a == b) ? d : e;


                    عینا مثل هم رفتار میکنن. در خط اول میگیم: اگر a مساوی b باشه (یک شرط) c را برابر با d قرار بده وگرنه c را برابر با e قرار بده.
                    در عبارت دوم میگیم: c را برابر با "اگر a با b مساوی بود d؛ و در غیر اینصورت e" قرار بده.
                    دو فرم از یک منطق.
                    منتهی این فرم دومی خیلی جاها خوانا تر و راحتتره.

                    دیدگاه


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

                      در لینک بسیار مفید زیر، نکات و ریزه کاری هایی از کتاب مرجع K&R توضیح داده شده است:

                      http://www.eskimo.com/~scs/cclass/krnotes/top.html
                      اوژن: به معنای افکننده و شکست دهنده است
                      دانایی، توانایی است-Knowledge is POWER
                      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                      دیدگاه


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

                        آیا دستور در c ,iar وجود دارد که مانند اسمبلی فرض کنیم که a و b دو متغییر 8 بیتی هستند و بعد بخواهیم بیت 7 متغییر a را به بیت 0 متغییر b به راحتی شیفت دهیم یا باید از and و ... استفاده کنیم ؟ یا اگر وجود نداره بهتر نیست در c با اسمبلی این کار را انجام بدیم ؟( البته زبان اسمبلی مسلط هستم ولی نوشتن آن در c برایم مشکل است ) هدف از شیفت دادن در این پروژه حرکت نوشته ها یا عکس بصورت پیکسل به پیکسل (یا خط به خط ) در LCD گرافیکی میباشد .

                        دیدگاه


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

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

                          کد:
                          b=((b&0xfe)|((a&0x80)>>8));
                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


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

                            اگر امکان دارد دستور زیر را بطور کامل شرح دهید مثلا نقش *در جلوی flash__ و قبل از آن چرا x داخل پرانتز قرارا داره هیچ مرجع واسه برنامه نویسی پیشرفته که جزئیات را بطور کامل (ترجیحا ویژه میکروکنترلها )پیدا نمیکنم کتابهای c کامپیوتر هم منطبق با استفاده از میکرو نیستند
                            #define pgm_read_byte(x) (*((uint8_t __flash *)(x)))

                            pcc=pgm_read_byte(&pc[i]);

                            دیدگاه


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

                              در پست شماره 3 در این مورد توضیح داده شده است. به عنوان یک توضیح تکمیلی، قرار دادن * unsigned char __flash در پرانتز نشان دهنده این است که عبارت بعد از آن، یک اشاره گر به بایتی در حافظه flash است و در واقع نوع عبارت بعد از خود را تعیین می کند. پس (uint8_t __flash *)(x) کلا یک آدرس است که قرار گرفتن یک * قبل از آن، محتوای موجود در محلی را که آدرس به آن اشاره می کند، در دسترس قرار می دهد. در خط دوم هم pc& به معنای آدرس pc است.
                              اوژن: به معنای افکننده و شکست دهنده است
                              دانایی، توانایی است-Knowledge is POWER
                              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                              دیدگاه


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

                                با سلام خدمت استاد کی نژاد
                                با سپاس از توضیحات شما و پست قبلی را خواندم ولی متوجه نشدم چون قبلا با اسمبلی کار کردم و اطلاعاتی از کار کامپایلر های c ندارم و با دید اسمبلی به برنامه های c نگاه میکنم در
                                #define pgm_read_byte(x) (*((uint8_t __flash *)(x)))
                                حالا یک ابهام جدید برام ایجاد شده شما فرمودید(x) بعد از (*uint8_t__flash) یک اشاره گر است و در کل یک آدرس است 1- متجه نشدم که اگر x حالا یک اشاره گر است مگر در محتوای x چه چیزی قراردارد ؟
                                2- شما فرمودید قرار گرفتن یک * قبل از آن، محتوای موجود در محلی را که آدرس به آن اشاره می کند، در دسترس قرار می دهد یعنی دو * باعث میشود دوبار اشاره گر تعریف شود
                                3- define pgm_read_byte(x# یک ماکرو می باشد یا تابع نزدیک دو روز است که برنامه (lcd برد استارتر xmega) که کتاب های c کامیوتر را میخوانم و وقتم برای پروژه بسیار تنگ است اما بطور کامل متوجه نمیشوم اگر از این روش استفاده نکنم آیا مشکل خاصی پیش میاد ؟(برای نمایش متن و شکل روی lcd گرافیکی )
                                با سپاس

                                دیدگاه

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