نحوه انجام وظایف موازی (Threads) در یک برنامه آردوینو

فهرست مطالب:

نحوه انجام وظایف موازی (Threads) در یک برنامه آردوینو
نحوه انجام وظایف موازی (Threads) در یک برنامه آردوینو

تصویری: نحوه انجام وظایف موازی (Threads) در یک برنامه آردوینو

تصویری: نحوه انجام وظایف موازی (Threads) در یک برنامه آردوینو
تصویری: نحوه انجام چندین کار در آردوینو | مبتدیان | تابع millis(). 2024, ممکن است
Anonim

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

جریانهای موازی در یک برنامه آردوینو
جریانهای موازی در یک برنامه آردوینو

لازم است

  • - آردوینو ؛
  • - 1 LED
  • - 1 زنگ اخبار پیزو.

دستورالعمل ها

مرحله 1

به طور کلی ، آردوینو از موازی سازی یا چند رشته ای واقعی پشتیبانی نمی کند.

اما می توانید به میکروکنترلر بگویید که بررسی کند آیا زمان اجرای برخی کارهای اضافی و پس زمینه در هر تکرار چرخه "loop ()" فرا رسیده است. در این حالت به نظر کاربر می رسد که همزمان چندین کار در حال انجام است.

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

ما بیش از یک بار هم LED و هم پیزو را به آردوینو وصل کرده ایم. اجازه دهید مدار را همانطور که در شکل نشان داده شده است ، جمع کنیم. اگر یک LED را به غیر از "13" به یک پایه دیجیتالی متصل می کنید ، به یاد داشته باشید که یک مقاومت محدود کننده جریان حدود 220 اهم داشته باشید.

نمودار سیم کشی برای زنگ و LED به Arduino
نمودار سیم کشی برای زنگ و LED به Arduino

گام 2

بیایید طرحی مانند این را بنویسیم و آن را در آردوینو بارگذاری کنیم.

پس از بارگیری تابلو ، می بینید که طرح دقیقاً همانطور که ما به آن نیاز داریم اجرا نمی شود: تا زمانی که آژیر به طور کامل عملیاتی نشود ، LED چشمک نمی زند و ما می خواهیم LED در طول صدای آژیر چشمک بزند. مشکل اینجا چیست؟

واقعیت این است که این مشکل به روش معمول قابل حل نیست. وظایف توسط میکروکنترلر کاملاً به ترتیب انجام می شود. عملگر "تأخیر ()" اجرای برنامه را برای مدت زمان معینی به تأخیر می اندازد و تا پایان این زمان ، دستورات برنامه زیر اجرا نمی شوند. به همین دلیل ، نمی توانیم مدت زمان اجرای متفاوتی را برای هر کار در "حلقه" () برنامه تعیین کنیم.

بنابراین ، شما باید به نوعی چند وظیفه ای را شبیه سازی کنید.

کنترل بوق و LED به صورت سری
کنترل بوق و LED به صورت سری

مرحله 3

گزینه ای که در آن آردوینو وظایف خود را به صورت شبه موازی انجام می دهد ، توسط توسعه دهندگان آردوینو در مقاله https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay پیشنهاد شده است.

ماهیت روش این است که با هر بار تکرار حلقه "loop ()" ، بررسی می کنیم که آیا زمان چشمک زدن LED (برای انجام یک کار پس زمینه) فرا رسیده است یا خیر. و اگر اینگونه باشد ، ما حالت LED را معکوس می کنیم. این نوعی دور زدن عملگر "تأخیر ()" است.

یک نقطه ضعف قابل توجه در این روش این است که قسمت کد در جلوی واحد کنترل LED باید سریعتر از فاصله زمانی چشمک زدن LED "ledInterval" اجرا شود. در غیر این صورت ، چشمک زدن کمتر از حد ضروری اتفاق می افتد و ما اثر اجرای موازی کارها را نخواهیم دید. به طور خاص ، در طرح ما ، مدت زمان تغییر صدای آژیر 200 + 200 + 200 + 200 = 800 میلی ثانیه است و ما فاصله چشمک زدن LED را روی 200 میلی ثانیه تنظیم می کنیم. اما LED با دوره 800 میلی ثانیه چشمک می زند ، که 4 برابر متفاوت از آنچه ما تنظیم کردیم متفاوت است. به طور کلی ، اگر عملگر "تأخیر ()" در کد استفاده شود ، شبیه سازی شبه موازی کاری دشوار است ، بنابراین توصیه می شود از آن اجتناب کنید.

در این حالت ، لازم است واحد کنترل صدای آژیر نیز بررسی کند که آیا زمان آن فرا رسیده است یا خیر و از "تأخیر ()" استفاده نکند. اما این میزان کد را افزایش می دهد و خوانایی برنامه را بدتر می کند.

چشمک زن عملگر بدون تأخیر ()
چشمک زن عملگر بدون تأخیر ()

مرحله 4

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

اول از همه ، بایگانی کتابخانه را از سایت رسمی https://github.com/ivanseidel/ArduinoThread/archive/master.zip بارگیری کنید و آن را از فهرست "کتابخانه ها" Arduino IDE خارج کنید. سپس نام پوشه "ArduinoThread-master" را به "ArduinoThread" تغییر دهید.

نصب کتابخانه ArduinoThread
نصب کتابخانه ArduinoThread

مرحله 5

نمودار اتصال به همان شکل باقی خواهد ماند. فقط کد برنامه تغییر خواهد کرد. اکنون همان نوار کناری خواهد بود.

در این برنامه ، ما دو جریان ایجاد می کنیم ، هر کدام عملیات خاص خود را انجام می دهند: یکی با LED چشمک می زند ، دوم صدای آژیر را کنترل می کند. در هر تکرار حلقه ، برای هر نخ ، بررسی می کنیم که آیا زمان اجرای آن فرا رسیده است یا خیر. در صورت ورود ، برای اجرا با استفاده از روش "run ()" راه اندازی می شود. نکته اصلی این است که از عملگر "تأخیر ()" استفاده نکنید.

توضیحات دقیق تر در کد آورده شده است.

بیایید کد را در حافظه آردوینو بارگذاری کنیم ، آن را اجرا کنیم. حالا همه چیز دقیقاً همانطور که باید کار می کند!

توصیه شده: