توصیه شده, مسابقه

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

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

 

مقدمه

کومودر ۶۴

بیست یا بیست و پنج سال پیش وقتی دانش‌آموزی بیش نبودم و تازه دستگاه کمودور ۶۴ خریده بودیم، بسیار هیجان‌زده بودیم و سعی می‌کردیم با یادگرفتن زبان بیسیک برنامه‌های مختلفی بنویسیم (دوستان قدیمی احتمالاً می‌دانند کمودر ۶۴ فقط و فقط مفسر بیسیک داشت) ساعت‌ها پای آن می‌نشستیم و تمرین برنامه‌نویسی می‌کردیم.
یک جزوه همراه دستگاه بود که خیلی ساده عملکرد آن را توضیح داده بود و زبان برنامه‌نویسی را نیز توضیح داده بود، به همراه برادرم برنامه‌ها رو از دفترچه کپی می‌کردیم و عملکرد آن را بررسی می‌کردیم و با تغییر بخش‌های مختلف برنامه سعی می‌کردیم منطق عملکرد آن را متوجه بشویم. تقریباً حافظه‌های سیستم را نیز یاد گرفته بودیم – این که در کجای حافظه چه مقداری بنویسی چه اتفاقی خواهد افتاد. از تولید صدا تا تغییر رنگ تصویر و مود نمایشی و حتی تغییر وضعیت پورت‌های خروجی روشن‌کردن لامپ‌های دستگاه همه‌وهمه برایمان جذابیت خاص خودش را داشت.
تا این که یک روز ایده‌ای به ذهنمان رسید،

 

برنامه ای نوشتیم که جرات اجرای آن را نداشتیم، چون می‌ترسیدیم کومودر عزیز ما بسوزد!

 

با هزار ترس و دلهره برنامه را اجرا کردیم (و استرس) که نکند کامپیوتر بسوزد ولی هیچ اتفاقی نیفتاد! همه چیز مثل قبل پیش رفت. برنامه پیچیده‌ای نبود:

 

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

 

صورت‌مسئله

آیا می‌شود برنامه ای نوشت که به سخت افزار صدمه وارد کند و آن را از کار بیندازد؟ سوالی که در نگاه اول ممکن است جواب سوال مشخص به نظر برسد ولی با کمی دقت میشود دریافت که بله می‌شود! شاید باورش سخت باشد ولی می‌شود برنامه ای نوشت که میکروکنترلر را بسوزاند !

دقیقا موضوع مسابقه ششم سیسوگ برنامه‌ای است که با پروگرام کردن آن روی میکروکنترلر (حالا هر میکروکنترلری که رایج  است مثل AVR, STM32 و  LPC یا PIC) به میکروکنترلر آسیب جدی برساند و کاری کند که میکروکنترلر غیرقابل استفاده شود!

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

  • به هیچ کدام از پایه های میکروکنترلر نباید ولتاژی غیر از آن چیزی که در دیتاشیت توصیه شده اعمال شود
  • از هیچ پایه ای نباید جریانی بیشتر از آن چه توصیه شده است کشیده شود یا وارد شود.
  • هیچ کدام از رابط های پرواگرام کردن نباید به شکل نرم افزاری غیرفعال شود.
  • دست کاری فیوز بیت ها جزو تغییرات غیر مجاز می‌باشد

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

 

شرایط داوری و جایزه مسابقه سیسوگ

باتوجه‌به صورت‌مسئله، علاوه بر برنامه لازم است دلیل آن نیز ذکر شود. پاسخ باید دارای توضیحات کافی در خصوص نحوه عملکرد باشد.

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

 

ارسال جواب

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

ممکن است نظم کدی را که در قسمت دیدگاه‌ها برای ما می‌فرستید، به هم بریزد، به همین خاطر بهتر است که ابتدا به سایت paste.ubuntu.com بروید، Syntax را زبان C انتخاب کنید و کد خود را در قسمت Content جای‌گذاری کرده و بر روی Paste کلیک کنید، در نهایت URL را در قسمت کامنت برای ما ارسال کنید.

اگر لازم است فایلی را برای ما  ارسال کنید آن را در جایی  مثل پیکوفایل یا آپلودر آپلود کنید و لینک آن را در کامنت خود استفاده کنید

مهلت پاسخ هم تا آخر روز شنبه ۱۷ مهرماه ۱۴۰۰ است.

 

پایان و جواب چالش ششم سیسوگ

متشکرم از تک‌تک دوستانی که وقت گذاشتند و در این چالش شرکت کردند. از نظر من همه دوستانی که حتی یک ساعت به مورد مسئله فکر کرده‌اند، برنده این مسابقه هستند. بر خلاف چیزی که فکر می‌کردم خیلی زودتر از انتظارم دوستان جواب درست رو کامنت کردند که البته باعث خوشحالی است:)

 

پاسخ مسابقه

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

 

راه ساده تر!

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

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

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

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

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

نوشته های مشابه

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

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

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

  1. Ali گفت:

    سلام
    زئوس جان
    بی صبرانه منتظر جواب مسابقه هستیم ☺️

    1. Zeus . گفت:

      سلام – بله حتما امروز منتشر میکنم

  2. عماد ali گفت:

    سلام
    می‌دونم که زمان مسابقه به پایان رسیده(البته من الان که این پیام رو میگذارم این پیج رو دیدم)، ولی از اونجا که در دیدگاه ها موردی که می‌خوام بگم رو ندیدم، بیانش میکنم:
    بهترین راه erase/write کردن روی فلش داخلی میکرو ست.
    کافیه erase/write رو توی لوپ بینهایت قرار بدیم.
    بعد از مدتی که عدد معقولی هم هست(بسته به نوع فلش داخلی میکرو و endurance اون و زمان نوشتن و پاک کردن) فلش غیر قابل استفاده میشه.
    و البته بهتره که سکتور صفر فلش مورد حمله قرار بگیره.

    1. Zeus . گفت:

      بله کاملا درسته 🙂

  3. Kim گفت:

    سلام پاسخ این مسابقه رو هنوز ندادین؟

    1. Zeus . گفت:

      سلام
      بله امروز منتشر می‌کنم 🙂

  4. aLimec گفت:

    سلام سیسوگ
    اینو در ادامه نظر اولم که چون هنوز چالش ادامه داره بهش دسترسی ندارم پست میکنم:

    ایده ای که به ذهن من رسیده بود اینه که با توجه به اینکه حافظه های فلش میکروکنترلر قابلیت انجام تعداد مشخصی سیکل erase-write را دارند. برنامه ای که در میکروکنترلر اجرا میشه روی فلش میکرو از عمد تعداد زیادی سیکل erase-write انجام بده تا اصطلاحا فلش wear-out بشه و دیگه قابل پروگرم نباشه. (این دقیقا همون محدودیت تکنولوژیکی هست که عمر نند فلش هارومحدود میکنه، به عنوان مثال درایو های SSD).
    در دیتاشیت AVR تعداد این سیکل 10.000 ذکر شده و در دیتاشیت PIC این مقدار 1.000 سیکل، برای ARM را اطلاع ندارم. برای انجام این عملیات ما باید دیتاشیت میکرو رو مطالعه کنیم و با روند بوت میکرو، پیکربندی حافظه، دستورات میکرو و … آشنایی داشته باشیم.
    کدی که من نوشتم به زبان اسمبلی برای میکرو Attiny85 و 76بایت حجم داره و البته جالبه که در این مورد حجم کد اصلا مهم نیست و در ادامه میگم چرا.
    روند بوت و استارت کد در این میکرو به این شکل هست که برنامه همیشه از محل interrupt vector table که در آدرس صفر حافظه فلش قرار داره شروع میشه و دقیقا در word0(Byte0:1) حافظه یک جامپ زده میشه به محل RESET routine . پس برای این میکرو خاص اگر فقط کد ما 16 بیت اول حافظه فلش رو wear-out کنه سالم ماندن باقی حجم فلش برای پروگرم های بعدی تاثیری نداره، چون میکرو در هر صورت نمیتونه محل روتین RESET (یا main) رو پیدا کنه و عملا میکرو بلااستفاده میشه.
    حافظه فلش این میکرو 8KB که بصورت 4096 پیج 64بایتی(32word) تقسیم بندی شده. ما برای دسترسی به فلش باید از دو دستور اسمبلی SPM(Store Program memory) و LPM(Load Program memory) استفاده کنیم. برای استفاده از این دستورات در هنگام پروگرم باید فیوز بیت Self-programming رو فعال کنیم. دستور LPM برای لود مقادیر از حافظه فلش استفاده میشه و بایت به بایت کار میکنه. دستور SPM پیچیده تر هست و بسته به کانفیگ رجیستر SPMCSR عملیات متفاوتی رو انجام میده.
    روند نوشتن روی حافظه فلش به این شکل که اول باید یک پیچ erase بشه بعد buffer ای که به اندازه سایز page فلش هست ورد به ورد پر بشه و بعد تمام این بافر نوشته بشه در پیجی که erase شده. به این دلیل که دستورهای AVR یا 16بیتی(word) هستند و یا 32بیتی(Dword) دستور SPM بر خلاف LPM به صورت ورد به ورد با حافظه کار میکنه.
    در این کد همین فرایند اجرا شده اول 16 بیت اول حافظه خوانده شده و سیو شده بعد دستور SPM به ترتیب فقط برای PAGE0 اجرا شده و هر word از PAGE0 با ‘’rjmp RESET “که طبق توضیحات محتویات 16بیت اول حافظه است نوشته میشه. دلیل پر کردن حافظه با این مقدار هم این هست که تا آخرین لحظه قبل از wear-out شدن 16 بیت اول حافظه از نظر محتوا تغییری نکنه تا حتی اگر میکرو ریست شد یا پاور قطع شد این برنامه دوباره به اجرا در بیاد و روند تخریب فلش رو ادامه بده.(البته این موضوع در عمل به فاکتورهای زیادی بستگی داره ولی کار از محکم کاری عیب نمیکنه)
    و اینم اضافه کنم که اصلا فرقی نداره باقی خانه های این پیج با چه محتوایی پر بشه. ولی من برای سهولت کد زنی و کم شدن حجم برنامه این مقدار رو تغییر ندادم.
    همچنین برای اینکه در بعضی از میکروها ازجمله این میکرو در هنگام پاک کردن پیچ و نوشتن روی حافظه، میکرو halt میشه و تایمر واچ داگ ممکنه مشکل ایجاد کنه. تمام اینتراپت ها و واچ داگ رو غیر فعال کردم.
    طبق محاسبات من این برنامه در کمتر از دو دقیقه پس از اجرا پیج اول حافظه را wear-out میکنه و در نتیجه سیسوگ به هدف شیطانیش میرسه. :))
    البته تخمینی که من از این زمانبندی زدم قابل بحث است چون اطلاعات دیتاشیت در این مورد از نظر من خیلی واضح نیست. اینم اضافه کنم که میکرو بصورت پیش فرض با کلاک 1مگاهرتز کار میکنه.

    اما یک توضیحی در مورد میکروهای دیگه سری AVR بدم، میکروهای دیگه این خانواده به عنوان مثال حافظه فلش Atmega32p(UNO rev3) شامل دو بخش مجزاست که به قسمت حافظه اپلیکیشن و حافظه بوت لودر تقسیم شده. که شما با تنظیم فیوز بیت های مربوط به بوت لودر میتونید حجم قسمت مربوط به بوت لودر رو بین چهار حالت از پیش تعیین شده انتخاب کنید. که به ترتیب 256، 512 ، 1K و 2k word از انتهای حافظه فلش رو در اختیار بوت لودر میزاره. با توجه به این قضیه برای اجرای عملیات شیطانیمون روی این میکروها طبق روندی که برای Attiny85 بود باید پیج اول هر کدوم از این بخش هارو هم علاوه بر قبل wear-out کنیم. یعنی جمعا پنج پیج در مکان های مختلف حافظه. البته این میکروها در قسمت بوت لودر محدودیتی مربوط به read-write دارن که کد برنامه را از کد Attiny85 کمی متفاوت و پیچیده تر میکنه.
    هرچند که فرایند استارت آپ میکروهای ARM کمی متفاوت و این میکروها معمولا پروتکشن های زیادی دارن تا از همین دست ماجراجویی ها جلوگیری کنن ولی در عمل باید شبیه به همین روش برای تخریب هر IC که از حافظه فلش برای ذخیره دستورات استفاده میکنه جواب بده و میتونیم با wear-out کردن بخشی یا تمام حافظه فلش منجر به خرابی IC بشیم.

    مراجع استفاده شده : AVR108 ، AVR109 ، AVR Instruction Manual و دیتاشیت attiny85

    کد نوشته شده:

    https://paste.ubuntu.com/p/2HmPcqnybk/

    1. Zeus . گفت:

      بسیار عالی – پاسختون خیلی دقیق و با جزییات کامل بود
      متشکرم

  5. سینا گفت:

    یکی از راحت ترین کار های ممکنه این است که حافظه flash میکروکنترلر های فلش بیس را غیر قابل استفاده کنیم(این روش برای میکروکنترلر های eeprom بیس هم قابل استفاده است ولی میکروکنترلر های Fram بیس در مقابل این خرابکاری ایمن هستند). برای این کاری کافی است در ابتدای حافظه شروع برنامه (این آدرس بستگی به میکروکنترلر مورد نظر دارد) یک جامپ به انتهای حافظه فلش زده شود(در میکروکنترلر هایی مثل arm امکان استفاده از رم به عنوان حافظه اجرای برنامه را دارند میتوان به ادرس ی از رم جامپ کرد). در محل جامپ شده باید روتینی نوشته شود که ابتدای آدرس حافظه را آنلاک کرده(به این معنی که بتوان از طریق برنامه حافظه را مجددا پروگرام کرد) و در یک حلقه بی نهایت درون ابتدای حافظه داده رندم پروگرام کرد. این کار باعث خرابی حافظه فلش میکروکنترلر شده و آسیب دائمی فیزیکی غیر قابل بازگشت به میکرو خواهند زد.

    1. Zeus . گفت:

      بله درسته کاملا

  6. شاهو گفت:

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

    1. شاهو گفت:

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

      1. Zeus . گفت:

        نگران نباشید ما این کار رو انجام میدیم 🙂

  7. تسلا گفت:

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

  8. رسول گفت:

    سلام، با نوشتن یه لوپ که بیش از ماکسیمم سیکل مجاز (تو avr ده هزار) بار تو حافظه فلش بنویسه و پاک کنه که سیکل میکرو باشه، حافظه فلش از بین میره .
    متاسفانه الان تو شرایط کد نوشتن نیستم و تجربه ای هم در زمینه کار با حافظه فلش ندارم.

  9. علی نجفی گفت:

    راه حل پیشنهادی من برای نابود کردن میکرو بدون هیچ اتصال خارجی
    حافظه فلش میکروکنترلر که برنامه توش ذخیره میشه میتونه پاک بشه و نوشته بشه اما یه محدودیتی وجود داره و عملا بعد از چند ده هزار بار پاک شدن و نوشته شدن هر پیج، اون پیج از کار میوفته

    اول قفل فلش رو باز میکنیم ( میکرو های stm32 یه رجیستر دارن که یک کلید خاص باید روش نوشته بشه. به دیتاشیت مراجعه کنید ) وقتی که باز شد وارد یک حلقه بی نهایت میشیم. داخل حلقه:
    روی تمام پیج ها 0 مینویسیم ( تک تک بایت های فلش )
    دستور erase کردن تمام پیج هارو صادر میکنیم ( با erase کردن همشون به 1 تبدیل میشن)
    تکرار

    البته قبل این کار باید کد مربوط به این فرایند رو به RAM منتقل کنیم و از اونجا اجرا کنیم. چون نمیتونه روی فلشی باشه که داره نابود میشه. این کار هم با linker script ممکنه و هم با یکم کثیف کاری میشه کد رو کامپایل کرد و باینری اون رو داخل یه متغیر ریخت و با کد C به اون آدرس Jump زد. گرچه اگه کار به اینجا کشید از پایه اسمبلی نوشتن منطقی تر هست 🙂 همون linker script روش پیشنهادی هست.

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

    1. Zeus . گفت:

      مررسی دوست عزیز
      درسته

  10. رضا گفت:

    میشه یک پایه رو خروجی تعریف کرد از توی cube و بعد توی خود کد به عنوان ورودی ازش استفاده کرد
    به نظرم این باعث سوخته شدن میکرو میشه

    1. Zeus . گفت:

      اینطوری مشکلی پیش نمیآد دوست عزیز

  11. حامد قمصری گفت:

    سلام
    کار ساده ای است
    چون حافظه فلش میکروها فقط برای 100 هزار بار نوشتن قابلیت دارد و بعد از ان درست عمل نمیکند و خراب میشود
    فقط کافیه برنامه نوشته بشه که در یک ادرس خاص حافظه فلش مثلا ادرس 0 تا 1000 یک دیتایی بیش از 100 هزار بار نوشته بشع…
    که بعد از اجرای برنامه عملا این میکرو قایل استفاده نخواهد بود و بعد از هربار پروگرام خطای verify یا بعد از روشن کردن میکرو ب حالت هنگ رفته و این میکرو دیگر قابل استفاده نخواهد بود.

    1. Zeus . گفت:

      خوب کانسپت شما درسته
      البته در هر حافظه ای نوشته بشه قابل قول نیست چون فقط اون آدرس حافظه خراب میشه و باید آدرس صفر رو انتخاب کرد که آدرس وکتور ریست است
      متشکرم که در مسابقه شرکت کردید

  12. علی حاجی گفت:

    سلام و عرض ادب
    ضمن تشکر از وبسایت خوبتون
    اگه یه کدی بنویسیم که بیش از 100 هزار بار روی فلش خود میکرو بنویسه و پاک کنه (با توجه به اینکه تعداد توشتن روی فلش محدود و در همین order است) فلش میکرو خراب نمیشه ؟

    1. Zeus . گفت:

      بله میشه
      جوابتون درسته دوست عزیز 🙂

  13. مسلم شاهپوری گفت:

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

    1. Zeus . گفت:

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

  14. دایدالوس گفت:

    زئوس جان حتی کمودور هم اگر مکرراً روی کاستش بنویسی و پاک کنی بعد یه مدت کاست ضعیف شده و سیگنال ها درست تولید نخواهد شد.
    نقطه ضعف تمام حافظه های غیر فرار!

    1. Zeus . گفت:

      سلام و درود بر شما
      بله کاملا درسته 🙂

  15. دایدالوس گفت:

    درود خدایان بر زئوس عزیز!
    اگر میکرو کنترلر حافظه FLASH یا EEPROM داشته باشد، با نوشتن و خواندن مکرر این حافظه ها حامل های نیمه هادی آسیب دیده و سلول های حافظه آسیب خواهد دید.
    در برخی از کنترلر ها و کامپایلر ها دسترسی به آن امر میسر نیست .
    هر چند با یک برنامه بوت لودر به سادگی می‌توان حافظه اصلی کنترلر را در گیر کرده و با حافظه مستهلک اون تراشه بلااستفاده خواهد بود.
    از دیدگاه دایدالوس جانت هر کدی که مکرراً در حافظه های غیر فرار خواندن و نوشتن انجام دهد آسیب زا است
    اگر چه حافظه رم نیز محدود است ولی عمر آن خیلی بیشتر خواهد بود.
    پ.ن زئوس جان مینوس در جزیره کرت بهم زور میگه لطفاً یه صاعقه بفرست دم قصرش جزغاله اش کن! قبل از اینکه خودم با آب جوش جزغاله اش کنم!!!

    1. Zeus . گفت:

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

  16. سلام وقت بخیر
    من دیشب یه روش با IAP براتون فرستادم یه روش دیگه هم الان به ذهنم رسید. میشه بردار وقفه را دستکاری کرد، یعنی وقتی میکرو ریست میشه و به قسمت بردار وقفه میره همونجا توی یه شرط بینهایت بیفته و یا به یه آدرسی غیر از صفر بره. در این صورت میکرو ریست نمیشه که بشه پروگرامش کرد. چون ریست همون پایه chip select برای spi هست و برای پروگرام کردن حتما باید میرکو ریست بشه و به آدرس صفر بره

    1. Zeus . گفت:

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

  17. سلام
    این پیام رو منتشر نکنید ها !
    جوابه اینکه با بوت لودر در avr یه بوت لودر کم حجم کمتر از 256 بایت کاری می کنم که تمام فضای فلش رو هی بنویسیم یه بار 0 یه بار 255 تهش 10000 بار عمر حافظه فلش تموم میشه همون طور که تو دیتا شیت گفته میکرو بدون حافظه فلش هم دیگه خاصیتی نداره .

    1. فعلا هم دارم سعی می کنم برنامه اش رو بنوسیم چون تا بحال با بوت لودر کار کردم
      تازه رو stm32 هم ساده تر برنامه رو از رو رم اجرا میکنی فاتحه کل فلش رو می خوانی 😉

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

        1. البته یه چیزی بگم (چند روز درگیر درسا بودم وقت نشد)
          این ده هزار بار که گفتم هم تو دیتا شیت atmega ها و هم تو stm32 ها ذکر شده که عمر مفید هست .
          تو دیتا شیت atmega32 که همون صفحه اول هست
          تو دیتا شیت stm32 حالا برای f103 تو Table 29. Flash memory endurance and data retention
          همین 10.000 رو ذکر کرده

          البته سکتور اول به دلیل بردار وقفه خیلی کار سریع تری هست .
          ولی به نظرم تو stm32 ها میشه بردار رو جابجا کرد و حتی از رو sram کد اجرا کد
          برای همین بهتره تو Stm32 یه برنامه ای که قراره خوادن و نوشتن رو انجام بده تو SRAM لود بشه و و تمام حافظه ی فلش رو مورد خوندن و نوشتن متوالی قرار بده.
          چرا که تو atmega نهاتا اون بخش برنامه ی bootloader سالم باقی می مونه.
          دقیق نمی دونم تو atmega موقتی دکودر دستور دستور نامشخصی رو بخونه کلا متوقف میشه یا میره دستور بعدی اگر این طور باشه که همون بخش از حافظه ی فلش که bootloader اونجا بوده می تونه یه تعداد دستور رو اونجا قرار بدیم ولی اکر حجم bootloader کم باشه کار زیادی با اون بخش نمیشه کرد.

          این سوال مسابقه شما از ایده های خراب کارانه من بوده 😈😈
          اولین بار که صورت سوال رو دیدم جواب رو می دوستم ولی رفتم برنامه اش رو بویسم باز چون وقت نکردم فرداش براتون روش اجراش رو نوشتم.

          1. Zeus . گفت:

            خوب برای stm32 همین که سکتور صفر رو متلاشی کنیم کفایت میکنه برای این که موقع بوت همه چیز از اونجا شروع میشه
            در خصوص avr بله حق با شماست قسمت بوت لودر سالم میمونه که باز اوکیه و قابل قبوله 🙂

        2. Zeus . گفت:

          :)، انشالله چالش های بعدی در زمان بهتری باشن
          برای بعدی چالشی دارم اونم چه چالشی، خودتون رو آماده کنید

    2. Zeus . گفت:

      درست میگید ولی چرا منتشر نکنم
      درست گفتید :))

  18. محمدمهدي معيني منش گفت:

    ایده کلی من این هست که به کمک دستور اسمبلی jmp میکرو رو وارد محدوده‌ی بوت‌لودر کنیم و در اونجا به کمک یک حلقه while به طور مداوم حافظه فلش رو پاک کنیم (یا بازنویسی کنیم یا هر ترفند دیگری که باعث بشه حافظه فلش هنگام ران‌تایم به طور مداوم تغییر کنه). به این ترتیب پس از چند ثانیه (بسته به نوع میکرو) حافظه فلش می‌سوزه و غیر قابل استفاده می‌شه.

    1. Zeus . گفت:

      سلام
      ایده شما کاملا درسته 🙂

  19. مسعود نوریان گفت:

    با سلام
    راه حل این است که ابتدا کلاک یک تایمر را بگونه ای تنظیم می کنیم که اینتراپت سر ریز تایمر هر 1ms (یک میلی ثانیه) رخ دهد. تایمر را در برنامه فعال می کنیم. سپس در روتین اینتراپت تایمر ، دستور ذخیره یک یا چند متغییر را در یک آدرس (پیج حافظه فلش) حافظه فلش میکرو می نویسیم. همه حافظه های فلش اعم از حافظه فلش میکرو دارای تعداد ماکزیمم write/erase cycles می باشند. که به معنی ماکزیمم تعداد نوشتن و پاک کردن حافظه فلش است و درصورت گذر از این تعداد حافظه فلش و درنتیجه میکرو آسیب فیزیکی غیر قابل بازگشت می بیند. پس با احتساب هر ۱ میلی ثانیه نوشتن در حافظه فلش با اجرای برنامه پس از حدود ۲ تا ۳ دقیقه میکروکنترلر آسیب خواهد دید .

    1. Zeus . گفت:

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

  20. مهدی گفت:

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

    1. Zeus . گفت:

      آفرین درسته 🙂

  21. افشین گفت:

    فیوز بیت هارو که اشتباه تنظیم کنی میکرو غیر قابل استفاده میشه من ۳ تا میکرو اینجوری سوزوندم

    1. Zeus . گفت:

      امیدوارم میکروهات رو که اینطوری شدن دور نریخته باشی چون اونا نسوختن و قابل بازیابی هستن
      فقط کافیه از ریط پارالل پروگرامشون کنی و فیوز بیت ها رو بذاری روی دیفالت

  22. Sadegh گفت:

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

    1. Zeus . گفت:

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

  23. مجهول ابن بهلول گفت:

    کارهایی میشه کرد …
    اول این که میشه میکرو رو تو شرایط بحرانی گذاشت تا حالش بد بشه و از کار بیوفته. این که از همه پایه ها با هم بیشترین حد مجاز جریان رو بکشیم (تا یکم گرمش کنیم) و تنظیمات PLL ها رو جوری بذاریم که سیستم اوور کلاک باشه و آروم آروم شروع کنه به داغ کردن و هیت سینک و اینا هم نداشته باشه. این جوری احتمال داره حالش بد بشه و نهایتا از کار بیوفته. پیشنهاد شده تو چنین شرایطی که دما بالاست میکرو رو پروگرام نکنیم. شاید البته تاثیری نداشته باشه شایدم یه خراب کاری ایجاد بکنه.
    دوم این که اگر بخش هایی از حافظه فلش که مربوط به بوت و ریست و کلا آغاز کار میکرو هستند بیش از حد نوشته بشن ممکنه دیگه قابلیت نوشته شدن رو از دست بدن و دیگه نشه از میکرو استفاده کرد. گفته شده اگر زمان بندی نوشتن تو حافظه فلش رعایت نشه و بیش از حد کشش بدیم (یعنی پروگرام با سرعت خیلی کم انجام بشه) هم می تونه تو خراب کردن میکرو مفید باشه.
    من خودم یه بار یه میکرو رو سر برنامه بوتش زدم خراب کردم، ولی تهش نفهمیدم داستان چیه. حالا امیدوارم اینایی که گفتم به دردتون بخوره و بتونید میکرو ها تون رو بترکونید :))) من که با این قیمت ها جرات نمی کنم!

    1. Zeus . گفت:

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

  24. مهدی گفت:

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

    1. Zeus . گفت:

      امم خوب در این شرایط نمی سوزه نهایتا هنگ میکنه که با ریست شدن درست میشه 🙂

      1. مهدی گفت:

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

        1. Zeus . گفت:

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

    1. Zeus . گفت:

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

  25. Alirezatm گفت:

    https://paste.ubuntu.com/p/mdJrrBPPdW

    حافظه فلش، به دلیل ساختار فیزیکی ای که دارد، حداکثر قابلیت سیکل نوشتار دوباره 10 هزار بار را دارد، زیرا الکترونها در اثر مرور زمان در گیت ترانزیستور FGMOS (بلوک تشکیل دهنده هر بیت حافظه فلش) جمع می شوند و اختلاف ولتاژ میان 0 و 1 در اثر مرور زمان کمرنگ تر میشود تا زمانی که کلا حافظه فلش بلااستفاده شود.
    بنابراین در این برنامه تخریب میکروکنترلر، در خط 7، کل حافظه فلش erase میشود، که برای میکروهای STM32F به معنای نوشته شدن 1 در تمام بیت ها است. سپس برای وارد کردن حداکثر خسارت در خط های 9 و 10 سعی میکنیم روی تمام بیت ها 0 بنویسیم تا همه بیت ها به اندازه یک سیکل نوشتار آسیب ببینند. این چند خط کد توی یک for قرار گرفته اند تا 10،000 بار این حرکت انجام شود. اگر برنامه تا انتها اجرا شود قاعدتا حافظه فلش باید بسیار آسیب دیده باشد و میکرو دیگر به درد بخور نخواهد بود.

    1. Zeus . گفت:

      کاملا درسته 🙂
      یعنی واقعا آسیب فیزیکی میرسونیم با یه برنامه
      واقعا هیجان انگیزه 🙂

  26. سلام
    وقت بخیر
    میکرو ها معمولا بعد از چند ده هزار بار پروگرام فلاششون مشکل پیدا می کنه، میشه یه تکه برنامه بنویسی که کل فضای باقیمانده حافظه فلاش را چندین هزار بار(البته ما نا محدود می گذاریم) پاک کنه و مجددا یه بایت ثابت روی کلش پروگرام کنه به صورت IAP (in
    application programming)
    من IAP کار کردم و این کار به راحتی قابل انجامه، بعد از چند دقیقه احتمالا میکرو قابل پروگرام کردن نیست!
    اگه نیازه می تونم هم AVR و هم STM کدش را بنویسم

    1. Zeus . گفت:

      بسیار عالی درسته 🙂

  27. iranmanesh گفت:

    سلام
    از محدودیت write flash میشه استفاده کرد بیشتر میکرو ها بین 10 هزار تا 100 هزار بار هستند
    یک برنامه میشه نوشت که با دستورات مستقیم روی flash می توان اطلاعات ریخته شود
    فقط یک برنامه حلقه مثلا برای اطمینان هم (که فلش میکرو ازبین بره) 10 میلیون بار روی ادرس های مختلف فلش دیتا ریخته و پاک شود
    همین..

  28. صهبا گفت:

    تنها راهی که فعلا به نظر من میرسه اینه که بوت لودر داخل یه لوپ آنقدر روی حافظه فلش رایت کنه که عمرش بسر بیاد

  29. aLimec گفت:

    سلام خیلی ممنون بابت چالش جدید
    من یک ایده ای دارم ولی فعلا دانش نوشتن برنامه اش رو ندارم. حالا تا شنبه تلاشم رو میکنم که یک کد برای avr یا M0 بنویسم. ایده ام اینه که با رایت کردن روی فلش میکرو (برمبنای دیتاشیت ها چیزی در حدود 10هزار سیکل) فلش میکرو رو بی استفاده کنم تا دیگه حجمی برای فرمویر جدید نمونه. البته دو تا چالش اساسی داره اول اینکه ترجیحا باید حجم کد خیلی کم باشه و ترجیح دوم و مهمتر اینه که بهتره برنامه از روی رم اجرا بشه تا بتونه تا آخرین بیت قابل استفاده فلش رو هم رایت کنه و خرابش کنه. eeprom میکرو (اگر داشته باشه) را هم میشه با حدود 100هزار سیکل رایت خراب کرد.
    البته نوشتن همچنین برنامه ای نیاز به درک درست از بوت لودر و نحوه بوت میکرو موردنظر داره و فکر کنم برای یک فرد حرفه ای همچین برنامه ای جمعا 20خط کد هم نشه ولی متاسفانه من الان دانشش رو ندارم چون تجربه ام با میکروها خیلی کمه.

    1. Zeus . گفت:

      ایده شما کاملا درسته دوست عزیز
      متشکرم که در این چالش شرکت کردید 🙂

  30. mohammad گفت:

    سلام
    يكي از موضوعاتي كه هميشه ذهنم ر درگير ميكرد همين موضوع بود
    يكي از روش كه من استفاده كردم خواندن يك بيت از EEPROM و معكوس كردن و نوشتن مجدد در همان ادرس بود كه كاملا جواب داد باتوجه به كلاك ميكرو به سرعت اون بيت به فنا رفت و ديگه مقادير خوانده شده فاقد اعتبار بود
    از همين روش ميشه براي حافضه FLASH هم استفاده ولي من ديگه تست نكردم

  31. محسن گفت:

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

  32. صادق ملایی گفت:

    سلام
    به نظرم ساده ترین و بدیهی ترین راه اینه که میکرو صرفا یه پیام (کامند) به یدونه رله بفرسته و رله هم فعال کننده یک چکش یا دستگاه پرس باشد، و مستقیما همون میکرو کنترلر رو پرس کنه، به همین سادگی میکرو نابود می شود.
    اگر قرار بود کدی اینجا بنویسم، اون کد ، صرفا کد ست کردن یکی از پایه های میکرو کنترلر که به ورودی فرمان (low voltage) یک رله متصل است ، می بود، به خاطر همین ننوشتم ، چون توی هر میکرویی متفاوته
    اما اصل صحبت من ایده ی اینکار بود
    شما در صورت مسئله هیچ منعی برای خرابی یا صدمه فیزیکی نگذاشتید، پس من اگر باشم با این روش ساده و البته دم دستی ، میکرو را بدون هیچ ولتاژ و یا جریان اضافی نابود می کنم.

    1. Zeus . گفت:

      خوب این روش هم قطعا جواب میده
      ولی خوب روش کم هزینه تری هم هست :))

  33. تعداد دفعات نوشتن روی حافظه فلش میکرو کنترلر محدود است، می توان برنامه ای رو برای اریز و رایت کردن پشت سر هم دیتا در ادرس های پایانی فلش قرار داد، یک بوتلودر هم ابتدای فلش تا بعد از اجرا شدن به برنامه دوم پرش کند، برنامه دوم پشت سر هم فلش میکرو را اریز و رایت می کند تا زمانی که حافظه میکرو غیر قابل استفاده شود.

    1. Zeus . گفت:

      بسیار عالی کاملا درسته 🙂

  34. مهدی صاحبی گفت:

    با سلام
    1- راه حل پیشنهادی از کار انداختن EEPROM هستش توی Atmel گویا حدود 100,000 رایت اطلاعات است برای غیر تمام شدن طول عمر پیشنهادیش کفایت میکنه.

    [code]
    #include

    void clearEEPROM();

    void setup(){
    }

    void loop(){
    clearEEPROM();
    }

    void clearEEPROM()
    {
    for (int i = 0 ; i < EEPROM.length() ; i++) {
    if(EEPROM.read(i) != 0)
    {
    EEPROM.write(i, 0);
    }
    }
    }
    [/code]

    1. مهدی صاحبی گفت:

      برای میکروکنترل‌های STM32 گونه STM32L073RZ حافظه فلش 10000 سیکل محدودیت رایت داره و EEPROM تعداد 100000 سیکل محدودیت رایت داره و بعد از این تعداد انتظار میره که میکرو دچار خرابی بشه

      1. Zeus . گفت:

        درسته دوست عزیز ایده شما

    2. Zeus . گفت:

      برای فلش هم میشه همین کار رو تکرار کرد ولی avr این کار رو باید توی حافظه فلش انجام داد

  35. mhsh گفت:

    سلام
    راستی یادم رفت کد رو پیوست کنم:
    https://paste.ubuntu.com/p/bcvvvwtcRF/
    فک میکنم یه همچین کدی رو avr کار کنه.

  36. Hamidrezam2 گفت:

    دو تا راه به نظرم میرسه
    اول اینکه میکرو را اور کلاک کنیم و طی مدت زمان زیادی پردازش های ریاضی مثل حلقه کنترلی pid در حال اجرا باشه
    دوم اینکه به تعداد زیادی (بالای یک ملیون بار )عملیات نوشتن روی خانه های حافظه فلش انجام بشه تا اون خانه ها غیر قابل استفاده بشن

    1. Zeus . گفت:

      اولی به نظرم تاثیری نداره ولی دومی جواب میده 🙂

  37. mhsh گفت:

    سلام
    من فقط با avr کار کردم و راجب بقیه میکروکنترلر ها اطلاعی ندارم هر چند فکر میکنم ایده اولیه با تغییر در کد برای بقیه میکرو ها هم کار میکنه.
    چون جریان کشی زیاد مجاز نیست راحت ترین کار و تنها چیزی که به ذهنم میرسه اینه که یه برنامه کوچیک اول فلش بنویسیم که توی یه حلقه بی نهایت از بعد قسمت برنامه تا آخرین فضای آدرس فلش رو مرتب یه داده رندوم (یا حتی مثلا متغیر یه کانتر) پروگرم کنه (مثلا در avr از طریق SPM). میدونیم که حافظه های فلش و eeprom یه “Write/Erase Cycles” دارند که یعنی تعداد دفعاتی که میشه داده جدید در اون ها نوشت محدوده و بعد از اون کم کم خراب میشن.
    اینطوری بعد ی مدت که برنامه اجرا میشه دیگه میکرو تقریبا غیرقابل استفاده میشه.

    1. Zeus . گفت:

      سلام
      متشکرم که در مسابقه شرکت کردید کاملا درسته ایده شما

  38. یک برنامه نویس گفت:

    ‘ آن را از کار بیندازد’ ینی چی؟
    1- میکرو رو گرم کنه و اون رو بسوزونه
    2- کاری کنه میکرو در دفعات بعدی نتونه بالا بیاد یا نتونه وارد startup رو به درستی تنظیم کنه
    3-بحث read/write protection رو تحریک کنه تا میکرو قفل کنه
    4-watchdog رو جوری تنظیم کنه یه حالت hard fault دایمی براش بیش بیاد
    کدومش؟

    1. Zeus . گفت:

      سلام
      خیلی ساده اس
      بعد از برنامه شما – ما برنامه خودمون رو روی میکرو میزیزم نباید کار کنه !

  39. آرش فتاحی گفت:

    با سلام

    در این برنامه که با زبان اسمبلی نوشته ام
    بخش اول حافظه فلش یعنی جداول پرشِ وقفه ها و بخش آخر فلش یعنی قسمت بوت به صورت مکرر نوشته می شود ( با دیتا های معکوس هم) با توجه به این که حداکثر تعداد نوشتن در فلش ۱۰۰۰۰ بار است، پس از مدتی حافظه فلش بیش از ۱۰۰۰۰ بار نوشته خواهد شد. که باعث می شود آن بخش ها از فلش معیوب شده و در نتیجه میکرو از کار خواهد افتاد.

    ;
    ; Flash_Burn.asm
    ;
    ; Created: 11/07/1400 06:59:23 ب.ظ
    ; Author : Arash Fattahi
    ;

    ; Replace with your application code
    .cseg
    .org 0
    jmp start
    .org 0x30
    start:
    ldi R16,0x08
    out sph,R16
    ldi R16,0x5f
    out spl,R16

    ldi zl,0x00
    ldi zh,0x00
    ;——– Write in Reset and Interrupt Vectors Table ———-
    s1:
    ldi R16,0x55
    ldi R17,0x55
    mov R0,R16
    mov R1,R17
    spm
    call delay
    ldi R16,0xAA
    ldi R17,0xAA
    mov R0,R16
    mov R1,R17
    spm
    call delay
    inc zl
    cpi zl,0x30
    brne s1
    ;——– Write in Boot section ———-
    ldi zl,0x00
    ldi zh,0x38

    s3:
    ldi R16,0x55
    ldi R17,0x55
    mov R0,R16
    mov R1,R17
    spm
    call delay
    ldi R16,0xAA
    ldi R17,0xAA
    mov R0,R16
    mov R1,R17
    spm
    call delay
    inc zl
    cpi zl,0x00
    brne s3
    inc zh
    cpi zh,0x40
    brne s3
    ldi zl,0x00
    ldi zh,0x00
    rjmp s1
    ;——–Delay ————–
    delay:
    ldi R18,10
    s2:
    dec r18
    brne s2
    ret

    1. Zeus . گفت:

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

  40. محمدصادق گفت:

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

    1. Zeus . گفت:

      بله ایده کاملا درسته

  41. میم الف گفت:

    با سلام و درود
    نمیدوم پاسخ قبلیم ارسال شد یا نه ، چون خطا دریافت کردم.
    به طور خلاصه اگر فرض کنیم میکروکنترلر که استفاده میکنیم طراحی سخت افزاریش به حدی بدون باگ و محافظت شده است که نمیتوان از طریف کانفیگ خاصی درش ایراد ایجاد کرد، برای اینکار میتونیم روی نقطه ضعف ذاتی عمر فلش ها دست گذاشت، برای نمونه اگر فرض کنیم میکروکنترلر stm32f داریم ، طبق دیتا شیت تحمل باز نویسی حافظه فلش حدود ۱۰۰۰۰ بار است. در این مثال میکرو کنترلر از ادرس حافظه 0x0800000 بوت میشه ، اگر در کد تابع نوشته بشه که در یک حلقه بینهایت در ادرس ابتدایی بوت مقداری مثلا ۰ رو بازنویسی کنه، بعد از مدتی این بخش خراب شده و با ریبوت شدن میکروکنترلر روند بوت با اشکال همیشگی مواجه خواهد شد.

    1. Zeus . گفت:

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

  42. علی گفت:

    سلام
    با عرض شرمندگی حال کد نویسی ندارم چون خیلی وقت دستم الوده نکردم
    با فیوز بیت ها pll طوری تنظیم میکنیم که کلاک چندین برابر مقدار نامی باشه(اورکلاک)
    و یه حلقه بی نهایت ساده و واچ داگ فعال ،اونقدر ای سی داغ میشه که میسوزه
    اینکارو قبلا اشتباهی انجام داده بودم

    1. Zeus . گفت:

      خوب این کار باعث نمیشه که آیسی اونقدری داغ کنه که میکرو بسوزه

  43. میم الف گفت:

    سلام و درود
    بنظر من برای چالشی که مطرح کردید با فرض این که میکروکنترلر که داریم به قدری صحیح و بدون باگ سخت افزاری طراحی شده که امکان ایجاد شرایط خاص در ریجیستر های سخت افزاری برای خرابی درش وجود نداره ، میتونیم دست روی نقطه ضعف از نظر عمر عملکردی بزاریم که در اکثر میکروکنترلر ها وجود داره ، اون هم محدودیت تعداد نوشتن در حافظه فلش داخلی میکرو کنترلر است . میدونم که این حافظه یه
    برای نمونه اگر فرض کنیم که یه میکروکنترلر stm32 داریم طبق دیتا شیت حافظه فلش حدودا تحمل ۱۰۰۰۰ بازنویسی رو داره،وقتی میکرو کنترلر از حافظه فلش با ادرس 0x8000000 بوت، میشه تابعی رو نوشت که در یک حلقه بی نهایت در این بخش حافظه مثلا مقدار ۰ رو بنویسه تا وقتی که عمرش تمام بشه و روند بوت میکروکنترلر ایراد پیدا کنه.

  44. علی اسماعیلی گفت:

    باسلام.
    با توجه به محدود بودن سیکل خواندن و نوشتن حافظه فلش میکروکنترلر ها(برای مثال 10,000 برای AVR)میشه برنامه ای داخل بوت سکشن نوشت که شامل یک لوپ بینهایت باشه و تا ابد اجرا بشه و روی همه آدرس های فلش یا حتی به روی چند آدرس خاص یه چیزی بخونه و بنویسه.
    در نهایت اون آدرس های فلش دیگه کارایی نخواهند داشت و برنامه ای که حتی یک خط از اون اجرا نشه کلا کار نمیکنه و اون میکرو کنترلر بلا استفاده میشه.
    فکر کنم ایده به اندازه کافی ساده هست که نیاز به فرستادن کد نباشه.
    البته نمیدونم تعریف شما از سوختن دود کردن یا ترکیدنه یا ایده من هم جوابگو هست.

    1. Zeus . گفت:

      بله کاملا درسته

  45. Arash_k1 گفت:

    سلام
    ببین زئوس منم یه زئوسم پس خودت میدونی چرا کد نمی‌نویسم
    ۱- کافیه کد رو توی هگز ادیتور باز کنی و آپ کد‌ها رو تغییر بدی – برای هر میکرویی متفاوته ولی در اکثر میکرو‌ها میشه و به یه آپ‌کودی که میرسه آسمون به زمین میرسه و اون بلو کیل اسموکینگ رو می‌بینی
    ۲- یه for با اندازه فاصله زمین تا ماه بسته به میکرو میتونه از سانتی متر تا کیلومتر متفاوت باشه که توش روی حافظه فلش دیتا بنویسی

    اینطوری اون Blue Kill Smoking در نماید ولی فلش برگ ریزون میشه

  46. علی اسماعیلی گفت:

    باسلام.
    با توجه به محدود بودن سیکل خواندن و نوشتن حافظه فلش میکروکنترلر ها(برای مثال 10,000 برای AVR)میشه برنامه ای داخل بوت سکشن نوشت که شامل یک لوپ بینهایت باشه و تا ابد اجرا بشه و روی همه آدرس های فلش یا حتی به روی چند آدرس خاص یه چیزی بخونه و بنویسه.
    در نهایت اون آدرس های فلش دیگه کارایی نخواهند داشت و برنامه ای که حتی یک خط از اون اجرا نشه کلا کار نمیکنه و اون میکرو کنترلر بلا استفاده میشه.
    البته نمیدونم تعریف شما از سوختن دود کردن یا ترکیدنه یا ایده من هم جوابگو هست.

    1. Zeus . گفت:

      کاملا درسته این ایده شما 🙂

  47. سینا گفت:

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

    1. Zeus . گفت:

      ممکنه هنگ بکنه با این کار ولی نمیترکه که !

  48. محمد بوشهری گفت:

    یک راهش استفاده از محدودیت پاک شدن/ پروگرام حافظه فلش میکرو هست
    در میکروهایی که امکان iap وجود داره از این طریق میشه عمل کرد
    ۲ برنامه مجزا نوشت که اولی خیلی سادست و بعد از ریست، اجرای برنامه رو از طریق مقداردهی به pc و استک به قسمتی دیگه از فلش (که برنامه دوم وجود داره) هدایت کنه
    برنامه دوم، اولین سکتور (بلاک) حافظه فلش رو erase کرده و بعد کل سکتور رو با عدد صفر پر کنه و این عمل در یک حلقه تکرار میشه تا جایی که اون سکتور پاک نشه یا بعد از پر شدن با عدد صفر، اعداد ذخیره شده داخلش صفر نباشه.
    به این صورت اولین سکتور فلش مشکل پیدا میکنه و نمیشه توی اون سکتور کدی پروگرام کرد و میکرو هم به دلیل اینکه بعد از ریست سخت افزاری (پایه ریست یا اتصال تغذیه) برنامه رو از این سکتور شروع میکنه قادر به اجرای برنامه نیست و عملا اون میکرو قابل استفاده نیست.

    1. Zeus . گفت:

      سلام
      بله درسته
      اولین کامنت صحیح مربوط به شماست 🙂

      1. محمد بوشهری گفت:

        با سلام و خسته نباشید
        جایزه دریافت شد 😊😊😊😊😁😁