STM32, ARM, توصیه شده, مقاله های سیسوگ, نرم افزار های الکترونیک

STM32 تا کجا می‌تواند پیش برود؟

stm32 benchmark

روش‌های برنامه‌نویسی تأثیر بسزایی در سرعت اجرای برنامه خواهند داشت. فرض کنید قصد دارید 64 کانال مجزای PWM با فرکانس 10 کیلوهرتز ایجاد کنید، با دقت 8 بیتی هر PWM. در نگاه اول پیاده‌سازی با استفاده از میکروکنترلر حتی میکروکنترلرهای قدرتمندی چون ARM غیرممکن به نظر می‌رسد و ممکن است برای پیاده‌سازی آن به سراغ FPGA بروید یا کلاً از پیاده‌سازی چشم‌پوشی کنید؛ اما با روش‌های صحیح برنامه‌نویسی و تسلط به میکروکنترلر به‌راحتی می‌توان این بحث را با استفاده از یک میکروکنترلر STM32F103 انجام داد.

شاید برای شما مفید باشد: آموزش FPGA

شناخت محدودیت‌های موجود و داشتن مهارت برنامه‌نویسی به ما کمک می‌کند که قادر به طراحی بهینه باشیم و از قبل بدانیم چه‌کاری ممکن و چه‌کاری غیر‌ممکن است. در این مقاله دو مبحث را مورد‌بررسی قرار می‌دهیم: تأثیر روش‌های مختلف برنامه‌نویسی و حالت‌های مختلف اپتیمایز (Optimize) بر عملکرد و سرعت اجرای برنامه.

در این مقاله با استفاده از میکروکنترلر STM32F103VET6 از مجموعه سری‌های ARM Cortex-M3 ساخت شرکت ST سعی داریم نشان دهیم که روش‌های مختلف برنامه‌نویسی و اپتیمایز‌های مختلف چه تأثیری در روند اجرای برنامه دارند. برای این اندازه‌گیری، از یک روش ساده و همیشگی استفاده خواهیم کرد: تغییر وضعیت یک پایه؛ هرچه فرکانس ایجاد‌شده بیشتر باشد، یعنی عملکرد بهینه‌تر و سریع‌تر برنامه.

هم‌چنین از کامپایلر GCC که یک کامپایلر قدرتمند و متن‌باز است استفاده خواهیم کرد.

 

این آزمایش را می‌توان توسط دو روش مختلف انجام داد:

  1. استفاده مستقیم از CPU برای تغییر وضعیت پایه
  2. استفاده از انتقال‌دهنده DMA

که در ادامه نتایج هر دو روش را بررسی می‌کنیم. استفاده از آی سی های ARM این اجازه را به ما می‌دهد که برنامه به زبان C را بدون استفاده از هیچ کتابخانه‌ای و به‌صورت ساده و مبتدی روی آن پیاده کنیم.

 

تنظیمات کلاک سیستم:

کلاک سیستم می‌تواند فرکانس‌های مختلفی بین 48 و 72MHz داشته باشد که تنظیمات فلش روی کلاک سیستم تأثیرگذار است:

 

سرعت تغییر وضعیت STM32F1

یکی از روش‌های ساده برای کپی کردن اطلاعات از مموری به روی GPIO استفاده از حلقه‌ی for است:

 

در فرکانس 48MHz بدون تنظیمات flash wait states، در حالت بهینه‌سازی نشده (O0)، به فرکانس بیش از 1MHz دست پیدا می‌کند. در زمان اجرای برنامه در زمان‌های ری استارتِ حلقه‌ی while، شکافی در سرعت اجرا ایجاد می‌شود که به دلیل پاک شدن PipeLine در هنگام اجرای دستورات شرطی و پرشی است:

 

STM32 تا کجا می‌تواند پیش برود؟

 

مجدداً برای فرکانس 48MHz بدون تنظیمات flash wait states آزمایش را تکرار می‌کنیم ولی این بار بهینه‌سازی O2 را اعمال می‌کنیم. به فرکانس 1.8 MHz دست پیدا می‌کند. در شکل نیز دیده می‌شود که شکاف‌های ایجادشده توسط حلقه‌ی while حذف شده‌اند:

 

STM32 تا کجا می‌تواند پیش برود؟

 

وقتی‌که تنظیمات فلش را روی 2 wait states قرار دهیم، بدون اعمال بهینه‌سازی عملکرد CPU کاهش می‌یابد:  (here -O0)

 

STM32 تا کجا می‌تواند پیش برود؟

 

با تنظیم فلش روی 2 wait states و اعمال بهینه‌سازی O2 عملکرد CPU نسبت به بدون تنظیمات فلش کاهش می‌یابد: (here -O2)

 

STM32 تا کجا می‌تواند پیش برود؟

 

این بار فرکانس را روی 72MHz تنظیم می‌کنیم و آزمایش‌ها را تکرار می‌کنیم. در حالت بدون تنظیمات flash wait states و بدون بهینه‌سازی عملکرد CPU بهبود می‌یابد:  (here -O0)

 

STM32 تا کجا می‌تواند پیش برود؟

 

با تنظیم فلش روی 2 wait states و اعمال بهینه‌سازی O2، عملکرد CPU در فرکانس 72MHz نسبت به فرکانس 42MHz بهبود می‌یابد: (here -O2)

 

STM32 تا کجا می‌تواند پیش برود؟

 

در حالت بهینه‌سازی نشده، حلقه‌ی for در اجرای برنامه تأخیر ایجاد می‌کند. برای حل این مسئله دستورات برنامه را بدون استفاده از حلقه‌ی for می‌نویسیم:

 

در این برنامه با تنظیم فرکانس سیستم، بر روی 72MHz می‌توانیم به فرکانس 3.6MHz دست یابیم. البته تأثیر حلقه‌ی while همچنان باقی است:

 

STM32 تا کجا می‌تواند پیش برود؟

 

در فرکانس 72MHz مشابه حالت قبل اما با بهینه‌سازی O2 عملکرد CPU به طرز چشمگیری به 18MHz بهبود می‌یابد. قابل‌توجه است که 18MHz بالاترین سرعت GPIO بیان‌شده در دیتاشیت آن است.

 

 

STM32 تا کجا می‌تواند پیش برود؟

 

ارسال اطلاعات توسط DMA به GPIO :

روش دیگری برای کپی اطلاعات از SRAM روی GPIO استفاده از (DMA (Direct Memory Access است. DMA بدون استفاده از CPU اطلاعات را از A روی B کپی می‌کند.

 

در واقع، به دلیل استفاده از حلقه‌ی while در انتهای برنامه، روش DMA بدون استفاده از بهینه‌سازی به‌اندازه‌ی CPU سریع عمل نمی‌کند. در زمان استفاده DMA برای انتقال اطلاعات به GPIO ،اطلاعات خواسته‌شده از روی دیتا باس خوانده می‌شوند.

 

STM32 تا کجا می‌تواند پیش برود؟

 

این بار حلقه while  را با یک حلقه for بدون شرط جایگزین می‌کنیم تا تفاوت را مشاهده کنیم:

 

در این حالت نتیجه با حالت استفاده از CPU مشابه می شود (3.6MHz):

 

STM32 تا کجا می‌تواند پیش برود؟

 

قابل‌ذکر است که تمامی آزمایش‌های DMA بدون اعمال بهینه‌سازی انجام می‌شود؛ زیرا با اعمال بهینه‌سازی O2 نتایج مطلوبی حاصل نمی‌شود:

 

STM32 تا کجا می‌تواند پیش برود؟

 

جمع‌بندی:

با توجه به آزمایش‌های انجام‌شده ملاحظه شد که STM32F1 با اعمال بهینه‌سازی O2 و بدون استفاده از دستور حلقه‌ی for می‌تواند به فرکانس 18MHz در GPIO دست پیدا کند (البته اعمال بهینه‌سازی O3 نتایج بهتری را تولید نمی‌کند).

برای حالت انتقال اطلاعات توسط DMA اگر از 32 بیت DMA برای خواندن اطلاعات از SRAM استفاده شود ممکن است بتوان به نتایج بهتری دست‌یافت.

 

مقدمه : Zeus

منبع

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

14 دیدگاه در “STM32 تا کجا می‌تواند پیش برود؟

  1. Avatar for مهدی مهدی گفت:

    سلام وقت به خیر مطلب مفیدی بود ممنون
    سوال در مورد flash wait state دارم. مطابق اولین تصویری که قرار دادید، آیا وابسته به SYSCLK هست یا به طور جداگانه قابل تنظیم هست. و اگر جداگانه قابل تنظیم هست، تاخیر بیشتر تو دسترسی به فلش (اگر درست متوجه شده باشم) چه مزیتی داره؟
    خیلی ممنون جناب زئوس

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز
      تنظیم رجسیتر flash wait state با توجه مقدار کلاک دریافتی cpu انجام میشه ؛ اما برای چی هست این موضوع !
      همونطور که حدس میزنید فرکانس کاری FLASH به پای فرکانس کاری cpu نمی رسه برای همین مجبوریم دسترسی cpu به flash رو مقداری محدود کنیم تا flash بتونه بدرستی کار کنه ؛ اگر چنین کاری رو انجام ندیدم ممکنه میکرو درست کار نکنه و با مشکل مواجه بشه ؛ برای همین فرکانس دسترسی به falsh رو در فرکانس های بالا کاهش میدیم که سیستم بدرستی کار کنه.

  2. Avatar for احمد احمد گفت:

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

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      منظور شما رو از دیتاشیت متوجه نمیشم !

  3. Avatar for احمد احمد گفت:

    میشه لطفا منبع دیتاشیت رو بدین

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      منبع مطلب انتهای مطلب گذاشته شده

  4. Avatar for علی علی گفت:

    با سلام
    اینجا چون while چنین شرطی داشته، به نسبت for بدون شرط بهینه تر بوده؟ دقیق تر بخوام بگم اینه که آیا سرعت چرخش در (;;)for بیشتر از (1)while است؟

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      فکر نکنم فرقی بکنه البته برای این که بشه دقیق گفت باید اسمبلی تولید شده رو مقایسه کرد ! ولی فکر کنم در آخر هر دو سینکس یه Jamp ختم میشن و عملیات شرطی صورت نمیگرده

  5. Avatar for محمد محمد گفت:

    درود بر شما
    مطابق مطالب دیتاشیت DMA از gpio ها پشتیبانی نمیکند .یعنی به طور مستقیم دیتا رو نمیشه از حافظه به روی رجیستر GPIO انتقال داد. dma در این میکروها فقط شامل spi و usart و usb و i2s و timer و خود مموری میکرو میشه.
    البته برای انتقال سریع داده ها روی gpioشرکت st یه مقاله گذاشته بود که از dma و timer و gpio واسه انتقال استفاده میکرد.

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      خوب ، GPIO در رده حافظه سیستم (RAM ) قرار میگیره و DMA بهشون دسترسی داره !
      توصیه میکنم یک بار چک کنید به صورت عملی ! همونطور که خودتون هم اشاره کردید خود شرکت st در این خصوص مستندات قرار داده

  6. Avatar for محمد محمد گفت:

    سلام مقایسه خوبی بود
    من متوجه منظورتون از اعمال بهینه سازی o2 یا غیره متوجه نشدم که این بهینه سازی رو به چه شکل انجام میدید؟ایا منظور بهینه سازی توسط کامپایلر هسش؟ اونوقت چه کامپایلری iar ، keil ..ممنون میشم این مورد رو توضیح بدید

    1. Avatar for زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز
      بله درست متوجه شدید ، بهینه سازی کد توسط کامپایلر انجام میشه.
      در ابتدای مقاله نوشته شده که از کامپایلر GCC استفاده خواهیم کرد ، کامپایلر Gcc یک کامپایلر متن باز و رایگان هست که دارای 5 سطح اپتیمایز است ، O0,O1,O2,O3,Os ، ما کلید های مختلف از این سطح رو مورد بررسی فرار دادیم
      البته کامپایلر های IAR و Keil هم داری سطوح اپتیمایز کد هستند که توی تنظیمات پروژه قادر به تغییر اونها هستید.

      1. Avatar for محمد محمد گفت:

        خیلی ممنونم ..عذر میخوام اخر وقت بود پیام رو خوندم به اخر مطلب که رسیدم یادم رفت اصن کامپایلر چی بوده براهمین مجدد پرسیدم … اگر امکانش باشه بخش های بهینه سازی رو تو همون کامپایلرهای keil و iar بررسی کنید

        1. Avatar for زئوس Zeus زئوس Zeus گفت:

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *