כיצד לבצע משימות מקבילות (אשכולות) בתכנית Arduino

תוכן עניינים:

כיצד לבצע משימות מקבילות (אשכולות) בתכנית Arduino
כיצד לבצע משימות מקבילות (אשכולות) בתכנית Arduino

וִידֵאוֹ: כיצד לבצע משימות מקבילות (אשכולות) בתכנית Arduino

וִידֵאוֹ: כיצד לבצע משימות מקבילות (אשכולות) בתכנית Arduino
וִידֵאוֹ: What is difference between Semaphore and Mutex 2024, נוֹבֶמבֶּר
Anonim

בטכנולוגיית המיקרו-מעבד, משימות הפועלות במקביל נקראות Threads. זה מאוד נוח, מכיוון שלעתים קרובות יש צורך לבצע מספר פעולות בו זמנית. האם ניתן לגרום למיקרו-בקר Arduino לבצע כמה משימות בבת אחת, כמו מעבד אמיתי? בוא נראה.

זרמים מקבילים בתכנית Arduino
זרמים מקבילים בתכנית Arduino

זה הכרחי

  • - ארדואינו;
  • - נורית אחת;
  • - זמזם פייזו אחד.

הוראות

שלב 1

באופן כללי, ארדואינו אינו תומך בהקבלה אמיתית או בריבוי השחלה.

אבל אתה יכול להורות למיקרו-בקר לבדוק אם הגיע הזמן לבצע משימת רקע נוספת, בכל חזרה על מחזור "לולאה ()". במקרה זה, נראה למשתמש כי מספר משימות מבוצעות בו זמנית.

לדוגמא, בואו למצמץ נורית LED בתדר נתון ובמקביל נפלט צלילים שעולים ויורדים כמו צפירה מפולט פיזואלקטרי.

חיברנו את ה- LED וגם את פולט הפיזו לארדואינו יותר מפעם אחת. בואו נרכיב את המעגל כפי שמוצג באיור. אם אתה מחבר נורית לד לסיכה דיגיטלית שאינה "13", זכור שיהיה לך נגד מגביל זרם של כ -220 אוהם.

תרשים חיווט לזמזם ולד לארדואינו
תרשים חיווט לזמזם ולד לארדואינו

שלב 2

בואו נכתוב סקיצה כזו ונעלה אותה לארדואינו.

לאחר טעינת הלוח, תוכלו לראות כי השרטוט אינו מבוצע בדיוק כפי שאנו זקוקים לו: עד שהצפירה תפעל במלואה, הנורית לא תמצמץ, ואנחנו נרצה שהנורית תמצמץ במהלך נשמע הצפירה. מה הבעיה כאן?

העובדה היא שלא ניתן לפתור את הבעיה בדרך הרגילה. המשימות מבוצעות על ידי המיקרו-בקר באופן רציף. אופרטור "עיכוב ()" מעכב את ביצוע התוכנית לפרק זמן מוגדר, ועד לתום הזמן הזה, פקודות התוכנית הבאות לא יבוצעו. מסיבה זו, איננו יכולים להגדיר משך ביצוע שונה עבור כל משימה ב"לולאה () "של התוכנית.

לכן, אתה צריך איכשהו לדמות ריבוי משימות.

בקרת צפצוף ולד בסדרה
בקרת צפצוף ולד בסדרה

שלב 3

האפשרות בה ארדואינו יבצע משימות במקביל פסאודו מוצעת על ידי מפתחי הארדואינו במאמר

מהות השיטה היא שעם כל חזרה על לולאת "loop ()", אנו בודקים האם הגיע הזמן למצמץ את ה- LED (לביצוע משימת רקע) או לא. ואם כן, אנו הופכים את מצב ה- LED. זהו סוג של עקיפת אופרטור "עיכוב ()".

חסרון משמעותי בשיטה זו הוא שיש לבצע את קטע הקוד מול יחידת בקרת ה- LED מהר יותר מרווח הזמן המהבהב של נורית ה- "ledInterval". אחרת, המצמוץ יתרחש בתדירות נמוכה מהנדרש, ולא נקבל השפעה של ביצוע מקביל של משימות. בפרט, בשרטוט שלנו, משך שינוי צליל הסירנה הוא 200 + 200 + 200 + 200 = 800 אלפיות שניים, ואנחנו מגדירים את מרווח ההבהוב של LED ל- 200 אלפיות השנייה. אך ה- LED יהבהב עם תקופה של 800 אלפיות שנייה, וזה שונה פי 4 ממה שהגדרנו. באופן כללי, אם משתמשים בקוד בקוד האופרטור "עיכוב ()", קשה לדמות פסאודו-מקביליות, ולכן מומלץ להימנע מכך.

במקרה זה יהיה צורך ביחידת בקרת צליל הסירנה לבדוק גם אם הגיע הזמן או לא, ולא להשתמש ב"עיכוב () ". אבל זה יגדיל את כמות הקוד ויחמיר את הקריאה של התוכנית.

נורית LED מהבהבת ללא דיחוי ()
נורית LED מהבהבת ללא דיחוי ()

שלב 4

כדי לפתור בעיה זו נשתמש בספריית ArduinoThread הנפלאה, המאפשרת ליצור תהליכים פסאודו מקבילים בקלות. זה עובד בצורה דומה, אבל זה מאפשר לך לא לכתוב קוד כדי לבדוק את השעה - אם אתה צריך לבצע את המשימה בלולאה זו או לא. זה מקטין את כמות הקוד ומשפר את הקריאות של הסקיצה. בואו נבדוק את הספרייה בפעולה.

ראשית כל, הורד את ארכיון הספרייה מהאתר הרשמי https://github.com/ivanseidel/ArduinoThread/archive/master.zip ופתח אותו במדריך "הספריות" של ארדוינו IDE. לאחר מכן שנה את שם התיקיה "ArduinoThread-master" ל- "ArduinoThread".

התקנת ספריית ArduinoThread
התקנת ספריית ArduinoThread

שלב 5

דיאגרמת החיבור תישאר זהה. רק קוד התוכנית ישתנה. עכשיו זה יהיה כמו בסרגל הצד.

בתוכנית, אנו יוצרים שני זרמים, כל אחד מבצע פעולות משלו: אחד מהבהב עם נורית LED, והשני שולט בצליל הסירנה. בכל איטרציה של הלולאה, עבור כל שרשור, אנו בודקים האם הגיעה העת לביצועה או לא. אם הוא מגיע, הוא מופעל לביצוע בשיטת "run ()". העיקר לא להשתמש במפעיל "עיכוב ()".

הסברים מפורטים יותר ניתנים בקוד.

בואו נטען את הקוד בזיכרון הארדואינו, להריץ אותו. עכשיו הכל עובד בדיוק כמו שצריך!

מוּמלָץ: