התקלה שאי אפשר לשחזר במעבדה

הלקוח מתקשר: "המכשיר קפא אתמול בערב, ניתקתי מהחשמל וזה חזר לעבוד". במעבדה הכול תקין, התקלה לא משתחזרת, ואין שום עדות למה שקרה. זה התרחיש שמפריד בין מוצר משובץ חובבני למקצועי — כי במוצר מקצועי יש תשובה: לוגים במוצר משובץ הם הזיכרון של המכשיר, הרישום שמאפשר לפתוח את היומן ולראות בדיוק מה קרה בערב התקלה. בלי לוגים, כל תקלת שטח היא חקירה עיוורת שנגמרת ב"החלפנו כרטיס ליתר ביטחון"; עם לוגים טובים, רוב התקלות מאובחנות מרחוק בלי לנסוע ללקוח ובלי לפרק כלום.

מה לתעד — ומה לא

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

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

לחיות בתוך תקציב הזיכרון

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

איך שולפים את היומן מהשטח

לוג שאי אפשר להוציא מהמכשיר שווה מעט. מתכננים מראש כמה ערוצי שליפה:

  • העלאה לענן. במוצר מחובר, המכשיר דוחף תמצית אירועים באופן שוטף ומעלה יומן מלא לפי דרישה — בלי להציף את הרשת ואת חשבון הסלולר. צד התקשורת מתואר במאמר על חיבור מוצר משובץ לענן.
  • שליפה מקומית. חיבור שירות — UART, USB או BLE — שמאפשר לטכנאי או ללקוח למשוך יומן גם ממכשיר שלא מתחבר לרשת. ערוץ כזה חייב אימות, כדי שלא יהפוך לדלת אחורית.
  • נתוני קריסה. שמירת תמונת מצב מינימלית בקריסה — כתובת התקלה, מחסנית קריאות מקוצרת — שמצוותת לכלי הפיתוח במעבדה, כהשלמה לכלים שמתוארים במאמר על כלי דיבוג לפיתוח embedded.

מהלוג לאבחנה: לסגור את המעגל

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

לתכנן את זה לפני התקלה הראשונה

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

רוצים להפוך רעיון למוצר? צרו קשר עם צוות פרוג'קטס האוס בע"מ – טלפון: 054-8936922 | דוא"ל: info@projects-house.com – ונשמח ללוות אתכם משלב הרעיון ועד המדף.