متفرقه

بهینه سازی کد در میکروکنترلرها

نویسنده: Laura McKinney
تاریخ ایجاد: 4 ماه آوریل 2021
تاریخ به روزرسانی: 16 ممکن است 2024
Anonim
معرفی دورۀ زبان C و C++ میکروکنترلرها
ویدیو: معرفی دورۀ زبان C و C++ میکروکنترلرها

محتوا

نویسنده پروژه مهندسی سال آخر خود را با استفاده از میکروکنترلرهای dsPic به پایان رساند و بینش گسترده ای در این دستگاه ها کسب کرد.

کد C زبان میکروکنترلر ممکن است در برخی از برنامه های پیشرفته به بهینه سازی نیاز داشته باشد. این بهینه سازی کد برای کاهش دو نکته مهم انجام می شود:

  1. اندازه کد: میکروکنترلرها می توانند داده ها و دستورالعمل های محدودی را به دلیل اندازه محدود RAM خود ذخیره کنند. بنابراین کد باید بهینه شود ، تا بتوان از دستورالعمل موجود و حافظه داده به کارآمدترین روش استفاده کرد.
  2. زمان اجرای کد: میکروکنترلرها دستگاه های ترتیبی هستند که همزمان یک دستورالعمل را اجرا می کنند. هر دستورالعمل مونتاژ برای اجرای خود تعداد مشخصی از چرخه های ساعت را مصرف می کند. بنابراین کد باید بهینه شود تا اطمینان حاصل شود که در حداقل تعداد چرخه های ساعت یا دستورالعمل های مونتاژ ، وظیفه مورد نیاز را انجام می دهد. هر چه چرخه ساعت از کد کمتری استفاده کند ، سریعتر اجرا می شود. این بدان معنی است که برنامه ها می توانند سریعتر اجرا شوند زیرا زمان پردازش به حداقل می رسد.

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


برای نشان دادن مثالها در صورت لزوم ، از IDE توسعه MplabX Microchip استفاده خواهد شد.

نحوه اندازه گیری آزمایشی زمان اجرای کد

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

  • برخی از کامپایلرها توانایی شمارش چرخه های ساعت را دارند که یک کد مصرف می کند.
  • برخی از اشکال زداها به عنوان مثال ICD 3 از ریز تراشه می تواند به طور مستقیم زمان اجرا را از طریق کرونومتر اندازه گیری کند.

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

همیشه فرکانس ساعت (Mhz) نیست که تصویر واقعی از سرعت پردازش یک میکروکنترلر را ارائه می دهد ، اندازه گیری واقع بینانه تر MIPS (مگا دستورالعمل در هر ثانیه) یا تعداد دستورالعمل هایی است که MCU می تواند در یک ثانیه اجرا کند.

MCU معمولاً از 60-70 MIPS در رده بالا تا 20 MIPS 8 بیتی AVR متغیر است. میکروکنترلر بالا MIPS احتمالاً گران تر از دستگاه پایین رده است بنابراین در اینجا بین هزینه و سرعت پردازش معامله خواهید داشت.


میکروکنترلرها حافظه جداگانه ای برای ذخیره داده ها و کد برنامه دارند. اندازه هر دو را می توان از صفحه داده یافت. اگر کد شما خیلی بزرگ باشد ، ممکن است به یک MCU با اندازه حافظه بیشتر نیاز داشته باشید.

2. انتخاب متغیرها برای بهینه سازی در اندازه کد

میکروکنترلرها دارای حافظه داده محدود هستند که معمولاً از 1 تا 4 کیلوبایت است. در این حالت عاقلانه است که متناسب با محدوده مورد انتظار تاریخ ذخیره شده مناسب ترین نوع متغیر را انتخاب کنید. جدول زیر خلاصه این متغیرها است:

خلاصه متغیرهای مورد استفاده در زبان C.

نوع متغیراندازه در بایتدامنه

بول کردن

1

فقط 0 یا 1

کاراکتر

1


-128 تا 127

int

2

-32،768 تا 32،767

بدون امضا

2

0 تا 65،535

طولانی

4

-2،147،483،648 تا 2،147،483،647

شناور

4

حداکثر تا 6 رقم اعشار

دو برابر

8

حداکثر تا 15 رقم اعشار

دوتایی بلند

10

دقیقاً تا 19 رقم اعشار

مثال:

  • اگر دو متغیر X و Y اضافه شود و نتیجه در Z ذخیره شود ، اما انتظار می رود مقدار Z بالاتر از 65،535 بعد از جمع باشد ، Z ممکن است طولانی و X و Y غیر امضا اعلام شود int ، مقادیر X و Y نیز منفی نیستند. با این کار 04 بایت در حافظه داده صرفه جویی می شود که اگر تمام متغیرها به مدت طولانی اعلام می شدند ، در غیر این صورت مصرف می شدند.
  • دو متغیر X و Y ، که انتظار می رود مقادیر آنها به تعداد کامل باشد ، تقسیم می شوند ، اما نتیجه تقسیم ممکن است یک اعشار ایجاد کند ، سپس X و Y ممکن است int تعریف شوند و بسته به دقت مورد نیاز

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

3. انتخاب متغیرها برای بهینه سازی در زمان اجرای کد

  • این یک واقعیت ثابت شده است که محاسبات نقطه شناور بیشتر از محاسبات نقطه ثابت طول می کشد. در جایی که مقدار اعشاری مورد نیاز نیست ، از متغیر نقطه شناور استفاده نکنید. هرجا ممکن است با عددهای صحیح بدون علامت کار کنید.
  • متغیرهای محلی به متغیرهای جهانی ترجیح داده می شوند. اگر از یک متغیر فقط در یک تابع استفاده می شود ، باید آن را در آن تابع اعلام کند زیرا دسترسی به متغیرهای جهانی از متغیرهای محلی کندتر است.
  • یک MCU 8 بیتی یک متغیر اندازه یک بایت سریعتر برای دسترسی پیدا می کند و یک MCU 16 بیتی یک متغیر 2 بایت را با توجه به طول آدرس ایجاد شده ، راحت تر می یابد.

4. بهینه سازی عملیات حساب

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

  1. به جای ارزیابی یک سینوس یا هر تابع مثلثاتی دیگر یا هر عملیاتی که نتیجه آن را می توان از قبل در کد مشخص کرد ، از جداول جستجوی مقادیر از پیش محاسبه شده استفاده کنید.
  2. در صورتی که یک جدول جستجوی سینوسی از قبل در حافظه ذخیره شده باشد ، کسینوس می تواند با پیشبرد نشانگر آرایه معادل 90 درجه ارزیابی شود.
  3. در بین چهار عمل حسابی ، تقسیم و ضرب بیشترین زمان پردازش را می گیرد ، در عمل در مقادیر نقطه شناور می تواند در دامنه صدها ثانیه میکرو ثانیه باشد.
  4. به جای تقسیم و ضرب از دستورالعمل های تغییر بیت استفاده کنید. دستورالعمل شیفت راست 3 تقسیم بر 2 را انجام می دهد3 که در آن به عنوان یک دستور تغییر چپ 1 ضرب در 2 خواهد بود1.

5- برای محاسبات فشرده از میکروکنترلر با قابلیت DSP استفاده کنید

بعضی از میکروکنترلرها دارای یک واحد پردازش DSP و دیگر ALU معمولی هستند که در معماری آنها تعبیه شده است. این موتور DSP برای انجام محاسبات حساب خیلی سریع در کمترین چرخه ساعت (یکی در بیشتر موارد) چند برابر سریعتر از ALU انجام می شود.

دستورالعمل هایی که پردازنده DSP می تواند سریعتر از ALU انجام دهد:

  • دستورالعمل های تغییر بیت و چرخش.
  • ضرب ها ، تقسیم ها و سایر عملیات حسابی.
  • ارزیابی سینوس ها و سایر توابع مثلثاتی.
  • کلیه عملیات DSP مانند FFT ، DFT ، کانولوشن و فیلتر FIR.

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

  • کتابخانه های جداگانه DSP در پروژه گنجانده شده اند.
  • نام توابع با کتابخانه ریاضی استاندارد زبان C متفاوت است. مستندات این کتابخانه ها و توابع را می توان از وب سایت تولید کنندگان مربوطه استفاده کرد.
  • موتور DSP از نوع متغیر مختلف "کسری" استفاده می کند. قبل از ادامه کار با توابع کتابخانه dsp ، نحوه استفاده از متغیرهای نوع کسری را بیاموزید.

توجه داشته باشید که توابع استاندارد کتابخانه ریاضی ، موتور DSP را فراخوانی نمی کنند زیرا به دستورالعمل های مونتاژ ALU ترجمه می شوند.

6. با وقفه ها کار کنید

برای انجام عملکردهای خاص از وقفه ها استفاده کنید مانند:

  • خواندن مقادیر ADC.
  • ارسال و دریافت از UART.
  • به روزرسانی ثبت های چرخه کار PWM.
  • ارتباطات CAN یا I2C.

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

وقفه ها نیز فقط در صورت لزوم فعال می شوند ، در حالی که اگر در بدنه اصلی کد شود ، کد در هر تکرار از حلقه while (1) اجرا می شود.

7. از بهترین کامپایلرهای موجود استفاده کنید

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

8- از جمله های شرطی هوشمندانه استفاده کنید

  • هنگام استفاده از یک سری عبارات if-else ابتدا محتمل ترین حالت را حفظ کنید. به این ترتیب MCU پس از یافتن شرایط واقعی مجبور به اسکن همه شرایط نخواهد بود.
  • گزاره سوئیچ معمولاً سریعتر از if-else است.
  • به جای مجموعه ای از دستورات ، از دستورات nested if-else استفاده کنید. یک بلوک if-else که دارای جملات زیادی است ممکن است به زیرشاخه های کوچکتر تقسیم شود تا برای بدترین حالت (آخرین) حالت بهینه شود.

9. از توابع Inline استفاده کنید

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

  • یک تابع ممکن است با استفاده از کلمه کلیدی "static" به صورت درون خطی اعلام شود.

10. از حلقه های Decremented استفاده کنید

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

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

با توجه به اینکه حلقه باید صد بار تکرار شود ، کاهش یک دستورالعمل از حلقه باعث می شود که صد بار اجرا نشود ، بنابراین وقتی حلقه مجبور است چندین بار تکرار شود ، تأثیر بیشتر خواهد بود.

بسته بندی کردن

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

این مقاله از نظر دانش نویسنده دقیق و درست است. محتوا فقط برای اطلاع رسانی و سرگرمی است و جایگزین مشاوره شخصی یا مشاوره حرفه ای در امور تجاری ، مالی ، حقوقی یا فنی نمی شود.

مقالات محبوب

پست های محبوب

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

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

مدیر / مهندس سیستم موفق با بیش از 10 سال تجربه در مدیریت زیرساخت های سرور و عملیات مرکز داده.این مقاله برای کسانی طراحی شده است که میزبان سرورهای ترمینال (یا سرورهای دسک تاپ از راه دور در اصطلاحات 200...
مقدمه ای بر مبانی کامپیوتر
کامپیوتر

مقدمه ای بر مبانی کامپیوتر

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