توضیحات مسابقه
چند روزی هست که درگیر انجام یه تحقیق جالب هستم، که احتمالا تا ده بیست روز دیگه ارائه اش میکنم، حالا کاری به خود تحقیق نداشته باشیم امروز نیاز بود که توان پردازشی بیشتری از میکروکنترلری که باهاش کار میکردم بگیرم، تا جای ممکن سعی کردم برنامه رو بهینه کنم ولی باز هم کم بود دیگه برنامه رو نمیشد بیشتر از این بهینه کرد! اینجا است که باید دست به کار شد و دید توان تحمل میکروکترلر تا کجاست و وارد بحث شیرین سخت افزار شدم و سعی کردم میکروکنترلر را آورکلاک کنم.
خوب تا دوبرابر فرکانس مجاز مشکلی نبود، فراموش کردم توی پروژه من از میکروکنترلر ATXMEGA128 استفاده کردم که ماکزیمم فرکانس مجازش فکر کنم ۳۲ مگاهرتز هست و به سادگی و بدون هیچ تغییر خاصی تا ۶۴ رفت بالا ولی بعدش! شروع کرد ناپایدار بشه و هنگ بکنه که خوب همه میدونیم کند ترین بخش هر سیستم دیجیتالی تا به امروز حافظه است (کامیپوتر دیسک و اینجا فلش) ولی خوب همونطور که گفتم همیشه یه راهی هست و من هم اون راه رو پیدا کردم و فرکانس رو نهایتا تا ۹۶ مگاهرتز بالا بردم البته بالاتر هم میرفت ولی دیگه قابل اطمینان نبود و هنگ میکرد مدار بعد از چند ثانیه کارکردن و نتیجه نهایتا این بود که دمای چیپ به شکل چشم گیری بالا میرفت تا حدود ۵۰ درجه البته با خنک سازی !!
در ادامه فکر کردم بد نیست که یه چالش ترکیبی برای شما داشته باشیم، چالشی که هم بحث نرم افزاری داری و هم آشنایی با سختافزار، برای موفقیت در این چالش نیازه که بحث های بهینه سازی نرمافزاری رو بدانید و هم از مکانیسمهای سخت افزاری به خوبی آگاه باشید. در ادامه با سیسوگ همراه باشید.
صورت مساله
از اونجایی که بیشتر دوستان با میکروکنترلرهای STM32 آشنایی دارند و الان تقریبا بازار ایران رو هم اشباع کرده، ما هم برای برگزاری از یکی از خانواده های این میکروکنترلر استفاده خواهیم کرد یعنی STM32F103C8T6 که در بردهای BluePill استفاده میشود، اگر نمیدانید برد بلوپیل چیست یا چه شماتیکی دارد با مراجعه به این پست سیسوگ هم شماتیک و هم PCB آن را دانلود کنید.
صورت مساله نیز ساده است:
شرایط داوری
برنامه ای که بالاترین فرکانس را بر روی پایه PC14 ایجاد کند، برنده خواهد بود، برد مورد استفاده جهت تست یک برد bluepill است که قبلا معرفی شد و با همان شمانیک ذکر شده است، برنامه مذکور باید بدون مشکل بتواند حداقل برای مدت ۱۰ دقیقه به کار خود ادامه دهد.
جایزه مسابقه سیسوگ
به اولین و سریعترین برنامه که با ذکر توضیحات کافی ارائه شده باشد مبلغ بیست میلیون ریال جایزه نقدی تعلق خواهد گرفت.
ارسال جواب
برای ارسال پاسخ های خود برای این مسابقه
پاسخ های خود را به ایمیل زیر ارسال نمایید.
شرایط شرکت در مسابقه:
- عنوان ایمیل ” مسابقه هفتم سیسوگ” باشه.
- در بخش توضیحات نام و نام خانوادگی
- سپس توضیحات راجع به فرایند انجام پروژه در توضیحات ایمیل
- فایل Hex برنامه در ایمیل attach شده باشد.
نتایج نهایی مسابقه آورکلاک سیسوگ
نام شرکت کننده | بالاترین فرکانس بر روی پایه PC14 |
Meysam | 73.5mhz |
Morteza Farahi | 73.5mhz |
Hossein Kardan | 71.5mhz |
Jaafar Bazme | 64.1mhz |
Kazem_Salari | 39mhz |
Mohammad Pourkhalili | 32.05mhz |
پایان و جواب چالش هفتم سیسوگ
با توجه به اتمام زمان مسابقه، فایل های ارسال شده دوباره مورد ارزیابی قرار گرفت و با توجه به این که دو دوست عزیز به سرعت یکسانی دست پیدا کردند و با توجه به این که شرط مسابقه، «اولین و سریعترین» بود، جایزه تعلق میگیره به آقای «میثم پرویزی»، البته به نظر من تک تک دوستانی که در این چالش شرکت کردند برنده هستند و برای خود من این چالش نکات جدیدی داشت که طی یکی دو روز آینده در خصوص آن مقاله ای خواهم نوشت و با هم بیشتر به زوایای جالب این چالش نگاه خواهیم انداخت.
در ادامه توضیحات و فایل هگز مروبط به برنامه آقای پرویزی رو قرار خواهیم داد، مشاهده چنین روند گام به گامی بسیار هیجان انگیز است و توصیه میکنم حتما مطالعه کنید نکات خیلی خوبی برای یادگیری وجود دارد 🙂
روند تست و تکامل جواب آقای پرویزی (Meysam)
فرایند اورکلاک کردن میکروکنترلر STM32F103C8T8 را با کریستال خارجی ۸ مگاهرتز و با تنظیم کلاک روی ۷۲ مگاهرتز شروع میکنیم.
پین PC14 را به عنوان خروجی از نوع Push-Pull و بدون Pull-Up تنظیم کرده و آن را به اسیلوسکوپ وصل میکنیم تا فرکانس پالس خروجی را ببینیم.
برنامه را طوری مینویسیم تا فرایند صفر و یک کردن پین PC14 در سریعترین زمان ممکن انجام شود. به همین دلیل این کار را با دستورات اسمبلی انجام میدهیم.
سریع ترین راه برای صفر و یک کردن (Toggle کردن) یک بین در یک رجیستر استفاده از دستور XOR است. به همین جهت قبل از حلقهی while ، آدرس رجیستر GPIOC_ODR و ماسک مورد نیاز برای تغییر مقدار بیت 14 پورت C را در رجیسترهای عمومی ذخیره می دهیم.
1 2 3 4 5 | asm volatile( "ldr r0, =0x4001100C\n" // GPIOC_ODR address "ldr r1, [r0]\n" // Load GPIOC_ODR value "ldr r2, =0x00004000\n" // Bit 14 mask ); |
سپس در داخل حلقه while ابتدا عمل XOR را به کمک دستور EOR بین ماسک و مقدار فعلی رجیستر GPIOC_ODR را انجام داده و سپس با دستور STR مقدار حاصل شده را در رجیستر GPIOC_ODRبازنویسی میکنیم.
1 2 3 4 | asm volatile( "eor r1, r1, r2\n" // XOR the value with the mask "str r1, [r0]\n" // Store the new value back to GPIOC_ODR ); |
ه این ترتیب در کمترین زمان ممکن عمل صفر و یک کردن پین PC14 در داخل حلقه while انجام میشود و بالاترین فرکانس پالس خروجی به دست خواهد آمد.
با تنظیم کلاک روی ۷۲ مگاهرتز فرکانس پالس خروجی روی PC14 به حدود ۵.۱۵ مگاهرتز میرسد:
حالا کلاک میکروکنترلر را آرام آرام افزایش میدهیم تا به جایی برسیم که سیگنال خروجی ناپایدار شود. با تنظیم کلاک روی ۸۰ مگاهرتز فرکانس پالس خروجی روی PC14 به حدود ۵.۷۵ مگاهرتز میرسد:
با تنظیم کلاک روی ۸۸ مگاهرتز فرکانس پالس خروجی روی PC14 به حدود ۶.۲۵ مگاهرتز میرسد:
با تنظیم کلاک روی ۹۶ مگاهرتز فرکانس پالس خروجی روی PC14 به حدود ۶.۹۴ مگاهرتز میرسد:
با تنظیم کلاک روی ۱۰۴ مگاهرتز فرکانس پالس خروجی روی PC14 به حدود ۷.۴ مگاهرتز میرسد:
با تنظیم کلاک روی ۱۱۲ مگاهرتز فرکانس پالس خروجی روی PC14 به حدود ۸.۰ مگاهرتز میرسد:
با تنظیم کلاک روی ۱۲۰ مگاهرتز فرکانس پالس خروجی روی PC14 به حدود ۸.۵ مگاهرتز میرسد:
با تنظیم کلاک روی ۱۲۸ مگاهرتز فرکانس پالس خروجی روی PC14 به حدود ۹.۱ مگاهرتز میرسد:
فرکانس ۱۲۸ مگاهرتز بالاترین فرکانس کلاک قابل دستیابی با کریستال ۸ مگاهرتز بود. لذا کریستال خارجی را ۱۶ مگاهرتز تغییر میدهیم تا بتوانیم به فرکانسهای کلاک بالاتری برسیم.
حالا فرکانس کلاک را روی ۱۴۴ مگاهرتز تنظیم میکنیم. در این حالت فرکانس پالس خروجی روی PC14 به حدود ۱۰.۳ مگاهرتز میرسد:
با تغییر دادن کد و استفاده از دستورالعمل EORS به جای EOR فرکانس خروجی کمی افزایش یافت که نتایج آن به شکل زیر است:
1 2 3 4 | asm volatile( "eors r1, r2\n" // XOR the last value of GPIOC_ODR (r1) with the mask (r2) "str r1, [r0]\n" // Store the new value (r1) back to the address of GPIOC_ODR ); |
کریستال خارجی = ۱۶ مگاهرتز، کلاک سیستم = ۱۴۴ مگاهرتز، فرکانس خروجی = ۱۲ مگاهرتز پایدار:
کد تغییر داده شد و برای افزایش سرعت، قبل از ورود به حلقه مقادیر متناظر GPIOC_ODR برای صفر و یک کردن پین PC14 در دو رجیستر r1 و r2 ذخیره شد.
1 2 3 4 5 | asm volatile( "ldr r0, =0x4001100C\n" // Load GPIOC_ODR address into register r0 "ldr r1, =0x00000000\n" // Move the value for PC14 = 0 into register r1 "ldr r2, =0x00004000\n" // Move the value for PC14 = 1 into register r2 ); |
در داخل حلقهی while از دو دستور STR برای صفر و یک کردن PC14 استفاده میکنیم.
1 2 3 4 | asm volatile( "str r2, [r0]\n" // Store value of r1 (PC14 = 0) to the address of GPIOC_ODR "str r1, [r0]\n" // Store value of r2 (PC14 = 1) to the address of GPIOC_ODR ); |
به این ترتیب با کریستال خارجی ۱۶ مگاهرتز و تنظیم کلاک روی ۱۴۴ مگاهرتز میتوان به فرکانس ۲۰.۶۶ مگاهرتز روی PC14 رسید.
در این حالت دستورالعمل branch که پس از کامپایل در انتهای هر حلقهی while اجرا میشود باعث کاهش فرکانس میشود.
برای حل این مسئله، عمل صفر و یک کردن PC14 را به تعداد زیاد و به صورت متوالی در هر بار اجرای حلقه، انجام میدهیم:
به این ترتیب با حذف تاخیر ناشی از branch توانستیم با کریستال خارجی ۱۶ مگاهرتز و تنظیم کلاک روی ۱۴۴ مگاهرتز به فرکانس ۳۶.۲۳ مگاهرتز روی PC14 برسیم:
برای دستیابی به فرکانس بالاتر میتوان از عملکرد EVENTOUT روی پین PC14 استفاده کرد. پس از فعالسازی عملکرد EVENTOUT میتوان به کمک دستورالعمل SEV مقدار PC14 را فقط به مدت یک کلاک سایکل یک کرد. به این ترتیب نیمی از یک پالس کامل ایجاد میشود. حالا به کمک دستورالعمل NOP به مدت یک کلاک سایکل در حالتی که مقدار PC14 صفر است تاخیر ایجاد میکنیم تا یک پالس کامل ایجاد شود.
1 2 3 4 | asm volatile( "sev\n" // Set EVENTOUT pin (PC14) for one clock (and then reset it) => PC14 =1 "nop\n" // Wait for one clock cycle and do nothing (while EVENTOUT is reset) => PC14 = 0 ); |
مشابه نسخه ۳ میتوان با اجرای متوالی SEV و NOP در داخل حلقهی while ، اثر تاخیر ناشی از branch را در سیگنال تولید شده از بین برد. نتایج حاصل از این برنامه به صورت زیر است:
کریستال خارجی = ۱۶ مگاهرتز، کلاک سیستم ۱۴۴ مگاهرتز، فرکانس سیگنال خروجی = ۷۲.۴۶ مگاهرتز (بالاترین فرکانس پایدار)
ممنون از تلاشتون برای ارتقای جامعه مهندسی برق ایران
خواهش میکنم
ممنونیم از حمایت دوستان
با سلام خسته نباشید ولی به نظر شما تغییر کریستال مدار شرط مسابقه رو نقض نمیکنه
“برنامه ای که بالاترین فرکانس را بر روی پایه PC14 ایجاد کند، برنده خواهد بود، برد مورد استفاده جهت تست یک برد bluepill است که قبلا معرفی شد و با همان شمانیک ذکر شده است، برنامه مذکور باید بدون مشکل بتواند حداقل برای مدت ۱۰ دقیقه به کار خود ادامه دهد.”
قرار بود برد برد blue pill باشه و تغییر کریستال دیگه برد blue pill نیست
ولی چالش خوبی بود برای من این نکته رو داشته که بتونم میکرو را تا 128 مگ آور کلاک کنم و بدون مشکل کار بکنه
بابا حلالتون
خیلی عالی بود. ممنون از همه دوستان
درود بر شما
سلام در صورت امکان یکی از hex ها رو بذارید خود ما هم تست کنیم یا حداقل فیلم اندازه گیری رو بذارید ممنون
سلام و درود – فایل هگز برنده مسابقه قرار خواهد گرفت
سلام برای فرکانس سیکل کامل منظورتون بوده دیگه درسته؟ یا هم لبه بالارونده هم پایین رونده!؟
ممنون مسابقه هیجان انگیزیه
سلام و درود ، بله سیکل کامل منظور بوده
خواهش میکنم دوست عزیز.
درود.
اشباع نه اشباء
این لینک هم با روش دیگری اورکلاک کرده .
https://www.programmersought.com/article/69869572825/
ممنونم دوست عزیز برای دقتتون
اصلاح شد.