برنامه نویسی حرفه ای میکروکنترلر (فیوژن)

برنامه نویسی حرفه ای میکروکنترلر (فیوژن)

برنامه نویسی حرفه ای میکروکنترلر (فیوژن)
برنامه نویسی حرفه ای میکروکنترلر (فیوژن)

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

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

برنامه نویسی حرفه ای میکروکنترلر و طرح مساله

فرض کنید که 4 بایت داده‌ای موجود است که برای ذخیره سازی یا انتقال نیاز است که این 4 بایت را درون یک متغیر 4 بایتی (uint32_t) ذخیره کنیم ؛ اتفاقا این تبدیل کاربرد زیادی در برنامه نویسی میکروکنترلر دارد و زیاد مورد استفاده قرار می گیرد ، اما واقعا چند روش برای نوشتن چنین برنامه‌ای وجود دارد ، در ادامه روش های مختلف را با هم بررسی می‌کنیم.

این کار را به شیوه های مختلفی می توان انجام داد که در این مقاله بررسی خواهیم کرد که سبک‌های متفاوت با رویکرد های مختلف چه تاثیری در نتیجه نهایی خواهد داشت. در این آموزش از میکروکنترلر AVR با فرکانس 16 مگاهرتز و کامپایلر GCC با اپتیمایز حجم (-Os) استفاده خواهیم کرد.

 

برنامه ای که همه می‌نویسند

برنامه از این قراره که 4 بایت رو به یک متغییر 32 بیتی تبدیل کنیم، برای سنجش سرعت هم در نظر گرفتیم که با هر 256 سیکل اجرای تبدیل پایه‌ای از میکروکنترلر تغییر وضعیت دهد ، هرچه فرکانس ایجاد شده بالاتر باشد در نتیجه برنامه ای بهتر نوشته شده است. فرکانس ایجاد شده را هم با استفاده از لاجیک آنالایزر اندازه گیری می‌کنیم.

اما چطور این کار را انجام دهیم ؛ تعداد زیادی از برنامه نویس ها به زبان آدم ها این کار را انجام می‌دهند نه زبان ماشین! اما منظور از زبان آدم ها چیست ؛ بهتر است گریزی بزنم به دوران ابتدایی و ریاضیات آن دوره و مفاهیم یکان و دهگان و صدگان و هزارگان و…. را زنده کنیم ، فرض کنید می‌خواهیم عدد 123 را ایجاد کنیم ، عدد 1 باید در جایگاه صدگان قرار گیرد آن را در عدد صد ضرب می کنیم و عدد 2 که باید در جایگاه دهگان قرار گیرد را در 10 ضرب می‌کنیم و عدد 3 را هم که در  جایگاه یکان قرار دارد قائدتا در یک ضرب می‌کنیم ، و مجموع حاصل سه عملیات را با هم جمع می‌کنیم که می‌شود 123 ! حالا به جای عدد ده و صد و هزار … از معادل کامپیوتری آن استفاده می‌شود یعنی 256 و 4096 و 65536 و… که برنامه بر همین پایه و اصول نوشته می شود.

همانطور که می بینید بایت های 0 تا 3 در اعداد 0x1 تا 0x1000000 ضرب شده اند و حاصل هر محاسبه با مقدار نهایی جمع شده است. برنامه نهایی به شکل زیر خواهد بود

و نتیجه خروجی به شکل زیر خواهد بود

برنامه نویسی غیر اصولی

 

همانطور که در تصویر مشاهده می‌کنید این فرایند با فرکانس کاری 16 مگاهرتزی میکروکنترلر تنها 638 بار در ثانیه اجرا می شود!

برنامه را به زبان ماشین نزدیک کنیم

افردای که کمی با تجربه‌تر باشند و دید درستی نسبت به پردازش های صورت گرفته درون پردازنده داشته باشند آن هم بر روی یک پردازنده 8 بیتی که ضرب اعداد 32 بیتی برایش کار دشواری است ، سعی می‌کنند که برنامه را منطقی‌تر و نزدک تر به زبان ماشین بنویسند و قسمت تبدیل را به شکل زیر باز نویسی می‌کنند

و نتیجه خروجی به شکل زیر خواهد بود

برنامه نویسی به زبان ماشین

همانطور که در عکس مشخص است با چند تغییر ساده سرعت اجرای برنامه حدود 3 برابر بهتر شد ، و هر 1735 تبدیل در یک ثانیه انجام می شود. اما تغییرات چه بوده که اینچنین در خروجی تاثیر گذاشته است ؟ ؛ اولین قدم حذف عملیات ضرب است و جایگزینی آن با عملیات شیف در غالب پردازنده‌ها عملیات منطقی از عملیات ریاضی سریعتر انجام می‌شود و سیکل ماشین کمتری نیاز دارد به طبع جایگزینی عملیات جمع با Or منطقی هم تاثیر بسزایی در فرایند داشته است.

اما سوالی که مطرح می شود این است که آیا باز هم بهتر می شود این کار را انجام داد ؟

برنامه نویس حرفه ای به زبان مسلط است

قائدتا هر زبان برنامه نویسی دارای نکات و ریزه کاری هایی است که گاهی خیلی به فرایند برنامه نویسی و بهبود برنامه کمک می‌کند ، زبان c هم از این قائده جدا نیست. به عنوان نمونه union یکی از قابلیت هایی است که حدس می‌زنم بیشتر افراد حتی فراموشش کرده اند ! یا اصلا کاربرد آن را درست نمی داند و همین باعث می‌شود که برنامه ها گاهی کند و سنگین نوشته شوند.

در این مثال دقیقا union به بهبود برنامه کمک می‌کند، قبل از این که نمونه کد را ارائه کنیم بگذارید یک یادآوری در خصوص unionها داشته باشیم ؛ union ها دقیقا مشابه با Struct ها تعریف می‌شوند. تنها تفاوتشون اینه که به جای واژه struct باید از واژه union استفاده کرد. union ساختاریه که برای استفاده بهینه از حافظه ساخته شده و به شما اجازه میده که چند تا متغیر رو داخل یک بلاک از حافظه ذخیره کنید. برای روشن تر شدن قضیه به عکس زیر دقت کنید.

ساختار union

همانطور که در عکس فوق می بینید ، union تعریف شده 4 بایت از حافظه رو اشغال کرده و هر کدام از اعضای ch به یکی از این بایت ها اشاره می کنند ؛ یعنی دقیقا همون چیزی که برای تبدیل لازم داریم . هر تغییر در [2]ch باعث میشه بیت های 16 تا 23 از متغیر val هم که یک متغییر 32 بیتی است نیز تغییر کند ؛ با استفاده از همین قابلیت برنامه رو بازنویسی می‌کنیم

و اما نتیجه

خروجی برنامه نویسی حرفه ای میکروکنترلر

همانطور که در تصویر مشاهده می کنید استفاده از union تاثیر مثبت در اجرای برنامه داشته است و سرعت آن را بهبود بخشیده است و تا 1952 تبدیل در ثانیه بالا برده است.

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

چالش آخر برنامه نویسی حرفه ای میکروکنترلر

با همه وجود توضیحات و راه کارهایی که ارائه کردیم ، باز هم میشود برنامه را بهبود بخشید و سرعت آن را نزدیک به دوبرابر بهتر کرد ، اما فکر می کنید چطور این امکان وجود دارد ؟ ، با استفاده از چه روشی چنین بهبودی امکان پذیر است ؟

برای این که زیاد به بیراهه کشیده نشوید تکنیک مورد استفاده در خصوص نحوه دسترسی به حافظه است.

برنامه نویسی حرفه ای میکروکنترلر

 

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

 

حمایت از Zeus ‌

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

Zeus ‌
Zeus ‌

زئوس هستم ساکن المپ

دیدگاه ها

24 دیدگاه

  • Emid
    ۲۱ شهریور ۱۴۰۰

    راحترین راه و پر سرعت ترین راه آدرس پوینتر

  • آنتی ویروس
    ۱۹ تیر ۱۴۰۰

    مچکر مفید بود

  • بیت دیفندر
    ۱۹ تیر ۱۴۰۰

    عالی بود مچکر

  • سجاد
    ۴ خرداد ۱۳۹۹

    سلام و ممنون بابت پست خوبتون
    به نظرم قضیه little endian و big endian بودن سیستم هم در جواب سوالات بالا میتونه تاثیر داشته باشه.
    مثلا در سیستمی که little endian‌ باشه روش سوم و روش چهارم(استفاده از پوینتر)، جوابش با ۲ روش اول متفاوت هست. اگه اشتباه میکنم تصحیح بفرمایید.

    • Zeus ‌
      زئوس Zeus
      ۶ خرداد ۱۳۹۹

      سلام دوست عزیز
      فکر نمیکنم مشکلی پیش بیاره این مساله چون وقتی که دارید روی یکی از این حاالات برنامه رو کامپایل میکنید کل حافظه لیتل یا بیگ میشه ! و همین امر باعث میشه که مشکلی پیش نیاد.

  • محسن
    ۱۳ تیر ۱۳۹۸

    با سلام خدمت زئوس عزیز شاید یکی از دلایل اینکه افرادی مثل شما در زمینه برنامه نویسی موفقند چون برنامه رو به ۸۰۵۱ و اسمبلی شروع کردند و همین باعث شد وقتی که برنامه کامپایلر شد کد اسمبلی ایجاد شده در کامپایلر رو باز می کنند تا تفاوت کدهای تولیدی با
    دستورات مختلف رو بررسی کنند که تعداد کد برای اون کار خاص به حداقل برسه و برای نمونه همین کد ساعتها در اینترنت می‌چرخه تا بهترین کد رو پیدا کنه
    مطمینا یه آشنایی به دستورات اسمبلی یک میکرو به برنامه نویس دید خیلی بهتری رو بده
    و مطمینا همیشه مشکل از برنامه نویس هست چون کمودور ۶۴ فرکانسش فقط ۹۰۰ کیلوهرتز بود

    • Zeus ‌
      زئوس Zeus
      ۱۶ تیر ۱۳۹۸

      سلام و درود دوست عزیز
      بله درسته ؛ البته درصد زیادی هم کنجکاوی هم هست و البته علاقه ؛
      فکر میکنم تفاوت یک برنامه نویس ساده و یک برنامه نویس حرفه ای آشنایی به همین ریزه کاری ها باشه!
      آخ کمودور 64 ؛ چه ساعت هایی که ننشستیم و براش برنامه ننوشتیم.

  • محمد مهدی
    ۱۳ اردیبهشت ۱۳۹۸

    سلام این روش آخر که گفتین تو چند سیکل اجرا میشه؟؟
    uint32_t* ptr =(uint32_t*) (&Byte[0]);
    counter = *ptr;

    • Zeus ‌
      زئوس Zeus
      ۱۵ اردیبهشت ۱۳۹۸

      خیلی بستگی پیدا میکنه به کامپایلر و معماری پردازنده ؛ فکر میکنم حدود یک سیکل یا دو سیکل ماشین احتمالا
      برای جواب دقیق تر می تونید خروجی ASM کامپایلر رو بررسی کنید.

  • محمد
    ۸ مهر ۱۳۹۷

    سلام لطفا درباره روش آخر بیشتر رانمایی می کنید

    • Zeus ‌
      زئوس Zeus
      ۸ مهر ۱۳۹۷

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

  • نوید
    ۵ مهر ۱۳۹۷

    سلام ممنون از توضیحاتتون
    خب بی زحمت نمیخاین اخرین قسمتو هم کامل توضیح بدین تا متوجه بشیم چطور سرعت اینقدر بیشتر شد؟؟

    • Zeus ‌
      زئوس Zeus
      ۶ مهر ۱۳۹۷

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

      • نوید
        ۷ مهر ۱۳۹۷

        متشکرم مهندس…اما هنوز مونده تا من بتونم مثله یه حرفه ایی کد بزنم ((:

        • Zeus ‌
          زئوس Zeus
          ۸ مهر ۱۳۹۷

          خواهش میکنم
          هیچ کس از اول آدم باتجربه ای نبوده ، کار کردن و ممارست برای یادگیری کمک میکنه که آدم بتونه توی هر زیمنه ای پشرفت کنه
          قطعا روزهایی بوده که من هم خیلی چیزا برام سوال بوده
          پس سوال کنید ؛ کار کنید ؛ و پیشرفت کنید ؛ ما خوشحال میشیم که همران ما حرفه ای باشند و ما رو به چالش بکشند

  • پیمان
    ۵ مهر ۱۳۹۷

    سلام، در روش اولی که نوشتید ضرایب باید 0xFF و 0xFF00 و … باشند.
    روشی که به نظر من میاد استفاده از اشاره گرهاست.
    uint32_t* ptr =(uint32_t*) (&Byte[0]);

    • Zeus ‌
      زئوس Zeus
      ۶ مهر ۱۳۹۷

      نه درست نوشتم ضرایب باید مثلا 0xFF+1 باشه – اونم به خاطر 8 بیت بودن هر پک هستش
      بله کاملا درسته ؛ اما میتونید بگید چرا سرعتش اینقدر تفاوت داره ؟

      • علی
        ۹ مهر ۱۳۹۷

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

  • سروش
    ۵ مهر ۱۳۹۷

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

    • Zeus ‌
      زئوس Zeus
      ۶ مهر ۱۳۹۷

      خواهش میکنم دوست عزیز
      خوشحالم که این دسته مقالات مورد توجه شما قرار گرفته

  • محسن
    ۵ مهر ۱۳۹۷

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

    • Zeus ‌
      زئوس Zeus
      ۶ مهر ۱۳۹۷

      دوستان روش حرفه رو گفتند – کامنت های همین پست رو بخونید

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

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

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

امنیت همیشه و در همه‌ی اعصار، مقوله‌ی مهم و قابل‌توجه‌ ای بوده و همیشه نوع بشر به دنبال امنیت بیشتر، دست به ابداعات و اختراعات گوناگونی زده است. ریموت کنترل یکی از این اختراعات است. در این مقاله، به بررسی امنیت انواع ریموت‌های کنترل خواهیم پرداخت....

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 9 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

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

Zeus ‌ Zeus ‌
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 1 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 2 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک