Menu
CoddyTech

כש־millis() מתגלגלת מחדש

חלק מהיחידה תזמון ללא Delay במסלול ה-Arduino של Coddy. שיעור 17 מתוך 18.

ערכו של unsigned long נעצר ב־4,294,967,295. לאחר כ־49.7 ימים, millis() מגיע לערך הזה ומתחיל שוב מ־0. התופעה הזאת נקראת גלישה מחזורית.

טיפוס קטן יותר מדגים את אותו הדבר. ערכו של unsigned int נעצר ב־65535:

unsigned int a = 65530;
a = a + 10;   // 65540 אינו נכנס בטווח: a הוא כעת 4

חיסור גולש באותו אופן, וזה מה שהופך אותו לבטוח: שעון שהתחיל ב־65530 ומראה כעת 4 ספר 10 צעדים, ו־4 פחות 65530, כשמאחסנים את התוצאה ב־unsigned int, הם בדיוק 10. באותו אופן, millis() - start הוא תמיד הזמן שחלף מאז start, גם במקרה של גלישה מחזורית.

חיבור אינו בטוח. בביטוי now >= start + interval, הסכום עלול לעבור את הגבול העליון ולגלוש למספר קטן, כך שהטיימר יסתיים מיד. ואם now כבר גלש, אבל הסכום עדיין לא, הטיימר לעולם לא יסתיים. תמיד יש לחסר:

if (now - start >= interval) {
  // הסתיים
}
challenge icon

אתגר

בינוני

אף אחד לא יכול לחכות 49 ימים לבדיקה, לכן הסקץ׳ הזה מעביר ל־isDone() זמנים שקרובים לגלישה ומדפיס את התשובות שלו. הוא אומר "done" מוקדם מדי ו־"waiting" לנצח. תקן את השורה היחידה ב־isDone() כך שהיא תשווה את הזמן שעבר מאז start ל־interval.

לחץ על Run, קרא את ארבע התשובות, תקן את השורה, ואז לחץ על Check.

נסו בעצמכם

const unsigned long interval = 2000;

// האם הטיימר שהתחיל בזמן start הסתיים בזמן now?
bool isDone(unsigned long start, unsigned long now) {
  return now >= start + interval;   // תקן את השורה הזו
}

// מדפיס כמה זמן חלף ומה isDone() מחזירה.
void test(unsigned long start, unsigned long now) {
  Serial.print(now - start);
  Serial.print(" ms: ");
  if (isDone(start, now)) {
    Serial.println("done");
  } else {
    Serial.println("waiting");
  }
}

void setup() {
  Serial.begin(9600);
  // millis() נעצרת ב-4294967295, ואז מתחילה שוב מ-0
  test(4294966000, 4294966500);   // ממש לפני הגלישה
  test(4294966000, 4294967200);   // עדיין לפני הגלישה
  test(4294966000, 900);          // השעון עבר את 0
  test(4294964000, 500);          // טיימר שהתחיל מוקדם יותר
}

void loop() {
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה תזמון ללא Delay

תרגלו בעצמכם: Arduino אונליין