שְׁאֵלָה:
קוד לביצוע חד פעמי בארדואינו
apnorton
2014-02-13 08:56:19 UTC
view on stackexchange narkive permalink

שאלה: איפה אני שם קוד אם אני רוצה שהוא יבוצע פעם אחת בלבד בכל הפעלה של Arduino?

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

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

אני רואה שתי גישות לקוד " משימות זמן אחת: "

שיטה 1:" לולאה פעם אחת "

  הגדרת חלל () {// לעשות הגדרות דברים} loop loop () {// לבצע משימה בזמן (1); // חזור על זה לנצח, ומניעת הפעלה מחדש של פונקציה}  

שיטה 2: "התקנה בלבד"

  התקנת ריק () {// בצע הגדרת דברים // do task} loop void () {// do nothing}  

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

שימוש כלשהו בפקודת 'יציאה' נדון בכתובת http://arduino.stackexchange.com/questions/188/what-happens-when-i-call-exit-from-my-program
שֵׁשׁ תשובות:
#1
+13
Connor Wolf
2014-02-13 18:43:07 UTC
view on stackexchange narkive permalink

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

ככזו, פונקציונליות התקנה חד פעמית נכללת בפונקציית ההתקנה.

FWIW, אם אתה מסתכל ב קובץ ש קורא ל הגדרת קוד> ו לולאה פונקציות:

  #include <Arduino.h>int main (void) { init (); # אם הוגדר (USBCON) USBDevice.attach (); # endif setup (); עבור (;;) {לולאה (); אם (serialEventRun) serialEventRun (); } להחזיר 0;}  

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

הערה:
אם (serialEventRun) serialEventRun ( ); נראה כי הוא מתקן המאפשר לך לצרף פונקציה הנקראת בקבלת נתונים סדרתיים, אך אם אינך מגדיר פונקציה בטל serialEvent () {} שלך קוד, הוא יתאסף לחלוטין ולא יהיה קיים בקוד המכונה המיוצר.

זה מרגיש מוזר לקבל תשובה שהיא (עדיין) שלא קיבלה את ההצבעה הגבוהה ביותר. אבל, ראיית ההגדרה 'ראשי ()' לפונקציה הייתה מאוד מועילה לשאלתי. (וגם אתה מציין הסכמה עם הקבוצה באמצעות 'הגדרה' במקום 'לולאה'). תודה על עזרתך.
@anorton - כשאתה בספק, הסתכל מתחת לכיסויים. אני מוצא את פלטפורמת הארדואינו נוחה לאבות טיפוס, אבל זה בעיקר רק קוד לדוד. הבנת מה שהיא עושה יכולה לעזור מאוד להחליט כיצד לארכיטקט משהו.
#2
+6
Steven10172
2014-02-13 10:40:08 UTC
view on stackexchange narkive permalink

בדרך כלל אני הולכת עם שיטה 2, אבל בסופו של דבר אני עושה את זה:

  התקנה בטלנית () {// לעשות דברים להתקין // לעשות מטלה init (); // בצע שלבי אתחול הפעלה} בטל init () {// בצע משימות בהפעלה} לולאה בטל () {// בצע קוד לולאה}  

עם ההתקנה שלעיל זה מאפשר שלי קוד להיות מאורגן עוד יותר.

התשובה הטובה ביותר עד כה +1, תודה אחי שהצלת אותי!
#3
+5
Matthew G.
2014-02-13 09:41:08 UTC
view on stackexchange narkive permalink

אני מעדיף מאוד את שיטה 2. אם אי פעם אתה מתכנן להוסיף קוד לטיפול קלט, פלט וכו ', זה קל עם שיטה 2 - פשוט מלא loop () , אך דורש עיבוד מחדש / רפקטורציה בשיטה 1.

#4
+3
TheDoctor
2014-02-13 10:01:09 UTC
view on stackexchange narkive permalink

אין הגבלת זמן על פונקציית ההתקנה. אני מעדיף את השיטה 2 מכיוון שאפשר למלא את הלולאה בכל מה שאתה צריך בהמשך.

#5
+1
sachleen
2014-02-13 10:23:37 UTC
view on stackexchange narkive permalink

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

#6
  0
jfpoilpret
2014-02-13 12:24:45 UTC
view on stackexchange narkive permalink

כמו רוב התשובות האחרות, הייתי הולך על שיטה 2.

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

עריכה:

כפי שהצביעו כמה הערות, באמצעות עיכוב () ב- loop () לא ישנה דבר לצריכת החשמל.

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



שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...