اطلاعیه

Collapse
No announcement yet.

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

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

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

    یکسری نکات و ریزه کاری ها در برنامه نویسی C وجود دارد که بیان آنها می تواند مفید واقع شود و به دلیل کثرت پست های تاپیک کامپایلر IAR، این تاپیک را برای بیان این نکات و با محوریت کامپایلر IAR تشکیل می دهم. بخشی از موارد بیان شده از خاصیت های زبان C هستند و بخشی هم ممکن است به IAR مربوط شود. سوالات عمومی راجع به عملکرد کامپایلر IAR کماکان در تاپیک مربوط به آن قابل طرح است و این تاپیک برای بیان نکات برنامه نویسی تشکیل شده است.
    اولین مورد برای شروع می تواند نحوه تعریف یک بایت و امکان دسترسی به تک تک بیت های آن باشد. در کد زیر:

    کد:
    union
    {
     unsigned char flags_byte;
     struct
     {
     unsigned char Bit0:1,
     Bit1:1,
     Bit2:1,
     Bit3:1,
     Bit4:1,
     Bit5:1,
     Bit6:1,
     Bit7:1;
    }flags;
    };


    فقط یک بایت در حافظه اشغال می شود که دسترسی به کل بایت از طریق نام flags_byte میسر است. اما از طریق struct تعریف شده در همان محلی از حافظه که flags_byte در آن قرار گرفته ( به دلیل استفاده از union) می توان به هر یک از بیت های آن هم دسترسی پیدا کرد. مثلا:

    کد:
    flags_byte=0x0f;
    flags.Bit0=0;
    flags.Bit5=1;
    اوژن: به معنای افکننده و شکست دهنده است
    دانایی، توانایی است-Knowledge is POWER
    برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
    وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
    قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
    اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
    ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

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

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

    کد:
    union
    {
     unsigned char Myarray[6];
     struct
     {
     unsigned char a,
     b,
     c,
     d,
     e,
     f;
     }Mystruct;
    };


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

    دیدگاه


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

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

      کد:
      #pragma bitfields=reversed


      برای برگرداندن این روند به وضعیت عادی می توان خط زیر را قرار داد:

      کد:
      #pragma bitfields=default


      [hr]

      نام هر آرایه بدون ذکر شماره عضو آن، در حکم آدرس آرایه است. اگر Myarray آرایه ای با تعدادی عضو باشد، برای ارسال آدرس آن به یک تابع کافی است نام آن را بنویسم. مثلا:

      کد:
      Myfunc(Myarray);


      اما اگر لازم باشد آدرس عنصر n+1 ام از آرایه به تابع ارسال شود، می توان بصورت زیر عمل کرد:

      کد:
      Myfunc(&Myarray[n]);
      اوژن: به معنای افکننده و شکست دهنده است
      دانایی، توانایی است-Knowledge is POWER
      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

      دیدگاه


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

        دسترسی به یک آدرس مشخص از حافظه از طریق دو مثال و با دو روش مختلف نشان داده می شود:
        کد زیر، محتویات آدرس 0x1000 را با عدد 0XFF برابر قرار می دهد:

        کد:
        (*(unsigned char*) 0x1000)=0xff;


        کد زیر، محتویات آدرس 0x1002 را با عدد 0X55 برابر قرار می دهد:

        کد:
        ((unsigned char*) 0x1000)[2]=0x55;


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

        دیدگاه


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

          دو حالت زیر را در نظر بگیریم:

          کد:
          #define add_xy(x,y) x+y


          کد:
          unsigned int add_xy(unsigned char x,unsigned char y)
          {
           return (x+y);
          }


          حال اگر در جایی از برنامه از کد زیر استفاده کنیم(با فرض اینکه x و y قبلا تعریف شده باشند):

          کد:
           unsigned int result;
           result=add_xy(x,y);


          اگر add_xy را از طریق تابع تعریف کرده باشیم، در زمان کامپایل تنها یکبار flash را اشغال می کند و می تواند بارها در برنامه صدا زده می شود. اما آنچه که define# شده باشد، به تعداد تکرار در برنامه در flash هم جا اشغال می کند. بنابراین برای عملیات بسیار ساده مانند همین جمع و در جایی که سرعت اجرا مهم باشد می توان از define# استفاده کرد و در صورت تکرار زیاد یک عملیات و برای جلوگیری از اتلاف flash می توان از تابع استفاده کرد. توجه به این نکته مهم است که برخی تعاریف در define# تنها یکبار در زمان کامپایل محاسبه می شوند و بصورت یک عدد در برنامه جایگزین می شوند. مثلا در فایل avr_compiler.h عبارت F_CPU / 1000000UL با معادل عددی آن در زمان کامپایل جایگزین می شود و عملیات تقسیمی در هنگام اجرای برنامه انجام نمی شود.

          کد:
          #define delay_us( us )  ( __delay_cycles( ( F_CPU / 1000000UL ) * ( us ) ) )

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

          دیدگاه


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

            ه نام خدا سلام خیلی عالی بود ولی این آخری که گفتید XوYدر هرصورت متغییر داخل حافظه RAM هستند و هر نقطه برنامه ممکن یک مقداری داشته باشند اصولا امکانش نیست که نتیجه داخل فلش باشه در نتیجه DEFINE و تابع هر دو یک معنی رو میدهند باز هم ممنون استفاده میکنیم...
            آيا كسى كه وعده نيكو به او داده‏ايم و او به آن خواهد رسيد، مانند كسى است كه از كالاى زندگى دنيا بهره‏مندش گردانيده‏ايم [ولى‏] او روز قيامت از [جمله‏] احضارشدگان [در آتش‏] است؟ (61)(سوره قصص)

            دیدگاه


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

              نوشته اصلی توسط M.ABDOLLAHI
              این آخری که گفتید XوYدر هرصورت متغییر داخل حافظه RAM هستند و هر نقطه برنامه ممکن یک مقداری داشته باشند اصولا امکانش نیست که نتیجه داخل فلش باشه در نتیجه DEFINE و تابع هر دو یک معنی رو میدهند
              برداشت شما از بحث اشغال flash با آنچه مورد نظر بوده مقداری متفاوت است. منظور از عبارات قبلی این بود که برای پیاده سازی آنچه در define# یا تابع آورده می شود، به هر حال کد اسمبلی تولید می شود که مثلا عملیات جمع را انجام دهد و این کد در flash ذخیره می شود. حال برای یک تابع این کد به عنوان یک زیربرنامه یا subroutine یک بار در flash قرار داده می شود و هربار call می شود. اما کد معادل انجام عملیات define# در هربار تکرار می شود و بنابراین از نظر اشغال کردن flash با مورد اول متفاوت است. و این مسئله ارتباطی به اینکه کد های مذکور روی نقاطی از حافظه Ram یا رجیسترهای داخلی عمل کنند، ندارد.
              اوژن: به معنای افکننده و شکست دهنده است
              دانایی، توانایی است-Knowledge is POWER
              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

              دیدگاه


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

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

                دیدگاه


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

                  یک سوال
                  اگر بخواهیم تابعی بنویسیم که ورودی آن یک متن باشد چه کار باید بکنیم؟
                  مثلا تابع هایی که ورودی متنی آن ها داخل (" &quot قرار میگیرند به چه صورت میباشد؟

                  دیدگاه


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

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


                    union
                    {
                    unsigned char flags_byte;
                    struct
                    {
                    unsigned char Bit0:1,
                    Bit1:1,
                    Bit2:1,
                    Bit3:1,
                    Bit4:1,
                    Bit5:1,
                    Bit6:1,
                    Bit7:1;
                    }flags;
                    };


                    1- درست کد نوشتن با خوب کد نوشتن ممکنه کمی تا قسمتی تفاوت داشته باشه. بخاطر همین مسئله کدی که شما زحمتش را کشیدید بهتر است طبق روال عام که بهتر است در هر خط فقط یک سمبل تعریف شود بصورت زیر نوشته شود:

                    union
                    {
                    unsigned char flags_byte;
                    struct
                    {
                    unsigned Bit0:1;
                    unsigned Bit1:1;
                    unsigned Bit2:1;
                    unsigned Bit3:1;
                    unsigned Bit4:1;
                    unsigned Bit5:1;
                    unsigned Bit6:1;
                    unsigned Bit7:1;
                    }flags;
                    };


                    ضمنا از آنجایی که یکی از محسنات کامپایلر C عمومی بودنش هست و نباید (با قید should'nt در انگلیسی) کاری کرد که این امکان کم رنگ بشه و از طرفی بعضی از کامپایلر ها به تعریف فیلد بیتی غیر از فرم طبیعی اون گیر میدن بهتره بجای قید نوع unsigned char از همون نوع unsigned استفاده بشه. مضاف بر اینکه ممکنه بخواییم در شرایطی اصولا یک بیت رو حذف کنیم (مثلا مثل دسترسی به بیت های رزرو):


                    union
                    {
                    unsigned char flags_byte;
                    struct
                    {
                    unsigned Bit0:1;
                    unsigned Bit1:1;
                    unsigned Bit2:1;
                    unsigned _reserved1:1; // reserved bit! dont access
                    unsigned Bit4:1;
                    unsigned Bit5:1;
                    unsigned Bit6:1;
                    unsigned Bit7:1;
                    }flags;
                    };


                    2- البته مسلما طبق عنوان تاپیک کار قرار است بر روی کامپایلر IAR انجام شود ولی بنظرم رسید که اگر اینگونه مواقع حواسمون معطوف رعایت compatibility بین کامپایلر های متفاوت باشد بدی نیست. یکی از مواردی که باعث بر هم خوردن این مسئله میشود استفاده از امکانات خیلی خاص کامپایلر است مثل این:

                    #pragma bitfields=reversed


                    که شما قید کردید. که صد البته بهتر است در این گونه موارد از امکانات پیش پردازش برای نوشتن کد های خاص استفاده شود. مثلا اگر کامپایلر ما IAR بود این کد و اگر GCC بود فلان کد. به این صورت عمده وقت دوستان در نوشتن کد و انتقال آن به کامپایلر های دیگر نیز کاهش میابد.

                    3- اصولا یکی از موارد مهم در تولید نرم افزار نگهداری و توسعه آن است. قبول دارم که وقتی قید میفرمایید:

                    (*(unsigned char*) 0x1000)=0xff;


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

                    #define MyByteValue (*((unsigned char *)0x1000))
                    MyByteValue = 0xff;


                    این همان کد جنابعالی هست ولی در حین کد نوشتن عادت میکنیم که با مقادیر ثابت عددی کار نکنیم. چون عدد فقط بدرد کنترلر و پروسسور و ماشین میخورد. انسان باید با سمبل ها کار کند.

                    4- راجع به مطلب راجع به ماکرو و تابع متاسفانه یک نکته کوچک جا افتاده. و آنهم این است که ماکروها توابعی هستند که روی عناصر زبانی کار میکنند و نه مقادیر. ضمنا از نظر ماکروها نوع یک سمبل خیلی محلی از اعراب ندارد.
                    مثلا فرض کنیم همین مثال جنابعالی:
                    مسلما دو سطر زیر کد یکسانی تولید نمیکنند:

                    add_xy(2,5);
                    add_xy(1.6,5.4);


                    یا


                    add_xy(5,"hassan&quot



                    از طرف دیگر چون ماکروها به نوع پارامتر هایشان حساس نیستند و ضمنا بعضی استفاده ها ممکن است به تولید کد اشتباهی بیانجامد استفاده از ماکروهایی اینچنینی توصیه نمیشود و بهتر است از توابع inline استفاده شود تا امکان چک کردن قواعد کامپایل شدن کد توسط کامپایلر را از دست ندهیم:

                    inline int add_xy(int x, int y)
                    {
                    return x + y;
                    }



                    مضاف بر اینکه مورد دیگری هم اینجا وسط آمده:
                    بایستی به ازای استفاده از یک آرگومان ماکرو؛ ترجیحا آرگومان را با پرانتز محصور کرد. یعنی کد زیر صحیح تر است:

                    #define add_xy(x,y) (x)+(y)


                    چون x و y میتواند یک عبارت نیز باشد:
                    مثلا:

                    add_xy(a*b,c*d) means: a*b+c*d means: a*(b+c)*d WRONG!!


                    در صورتی که در صورت استفاده از تابع inline همچین مشکلی پیش نمی آید.
                    اما مسلما نوشتن توابعی مثل این فقط و تنها فقط با استفاده از ماکرو ها امکانپذیر است:

                    #define dop(op) a op b

                    dop(+) => a + b
                    dop(-) => a - b

                    ....

                    دیدگاه


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

                      یک نکته دیگر هم اضافه کنم بد نیست (البته ربطی به IAR بودن کامپایلر ندارد).
                      خیلی وقتها ممکن است بخواهیم به یک داده ای به نوعی خاص نگاه کنیم. مثلا یک مقدار long را که 32 بیتی هست رو از طریق سریال اخذ کرده و در بایت های متوالی قرار داده ایم و میخواهیم مقدار عددی آن را داشته باشیم. یک کار راحت استفاده از تابعی بفرم زیر است:


                      long as_long(void *p)
                      {
                      return *((long *)p);
                      }


                      البته این تابع یک باگ اساسی دارد که نمیتوان آنرا روی هر سیستمی استفاده کرد. فرم درست این تابع بفرم زیر است (که روی تمامی سیستم ها کار میکند. چرایی اش با خودتان):

                      long as_long(void *p)
                      {
                      long tmp;

                      memcpy(&tmp, p, sizeof(tmp));

                      return tmp;
                      }

                      دیدگاه


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

                        نوشته اصلی توسط شهریار رجب زاده
                        یک سوال
                        اگر بخواهیم تابعی بنویسیم که ورودی آن یک متن باشد چه کار باید بکنیم؟
                        مثلا تابع هایی که ورودی متنی آن ها داخل (" &quot قرار میگیرند به چه صورت میباشد؟
                        کافی است ورودی تابع شما از نوع اشاره گر به char باشد. مثال از کتابخانه ای که در تاپیک نمونه کدها قرار داده شده است:

                        کد:
                        void LCDStringRam(char *data)	
                        {
                         char k;	
                         while (k=*data++) LCDSendData(k);
                        }


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

                        دیدگاه


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

                          نوشته اصلی توسط reza_agha
                          البته از اونجایی که من اصلا معلق زدن بلد نیستم (خصوصا جلوی لوطی) جسارت بنده رو میبخشید اما چند نکته بنظرم اومد که جسارتا عرض میکنم
                          از نظرات و تجربیات مفید شما همیشه استفاده می کنیم. در توضیح تکمیلی نسبت به مواردی که ذکر کردید:

                          1- مثال مذکور با تغییرات جزئی از متن تعاریف و هدرهای IAR آورده شد که ساختار بیتی را به همین شکل تعریف کرده است. البته توضیحات شما در مورد نحوه کد نوشتن هم کاملا موجه است.
                          2- نوع رویکرد در استفاده از امکانات خاص کامپایلر در زمانی که احتمال استفاده از کد در کامپایلر دیگری وجود داشته باشد نسبت به زمانی که چنین احتمالی وجود نداشته باشد، قطعا متفاوت است.
                          3- همانطور که توضیح دادید، قرار دادن اعداد بصورت مستقیم روش مطلوبی در برنامه نویسی نیست و هدف بیشتر ذکر یک مثال بوده است. چنانکه حتی کد زیر هم در مواردی ایده آل نیست:
                          کد:
                          MyByteValue = 0xff;

                          و مثلا در مواردی (مانند پورتها) می توان از روش زیر استفاده کرد:
                          کد:
                          MyByteValue = PIN7_bm|PIN6_bm|PIN5_bm|PIN4_bm|PIN3_bm|PIN2_bm|PIN1_bm|PIN0_bm;


                          4- در بحث ماکروها هم هدف بیان میزان مصرف flash در مقایسه با توابع بود و البته توضیحات شما هم بسیار مفید است. اما مثالی که ذکر کردید درست به نظر نمی رسد، زیرا اولویت ضرب نسبت به عملیات جمع بالاتر است (برای اطمینان بیشتر کد را در سیمولاتور تست کردم که نشان می دهد نتیجه زیر درست است):

                          کد:
                          add_xy(a*b,c*d)  means: a*b+c*d means: (a*b)+(c*d)


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

                          دیدگاه


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

                            نوشته اصلی توسط طراح
                            کد:
                            void LCDStringRam(char *data)	
                            {
                             char k;	
                             while (k=*data++) LCDSendData(k);
                            }
                            میشه خط به خط توضیح بدید چی کار کردید چون هر جور بشه نگاه میکنم نمیفهمم چجوری ورودی متنی میگیره
                            با تشکر

                            دیدگاه


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

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

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

                              دیدگاه

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