מה זה Firmware? הסבר פשוט + כמה משרות פתוחות בישראל
זמן קריאה: 8 דקות
Firmware הוא הקוד שיושב בזיכרון הלא-נדיף של רכיב חומרה ומפעיל אותו: הוא עולה עוד לפני שקיימת מערכת הפעלה, כותב וקורא ישירות לרגיסטרים של השבב, ומחזיק את המוצר יציב לאורך שנים בשטח. בלוח HiTakeJob פתוחות כרגע 21 משרות שמזכירות Embedded C ועוד 21 משרות שמזכירות שפת C.
על מה בדיוק הפירמוור שולט
קל להגדיר פירמוור לפי מה שהוא לא: הוא לא אפליקציה, הוא לא דרייבר שרץ מעל לינוקס, והוא לא לוגיקה בחומרה. פירמוור הוא שכבת הקוד הראשונה שיש לה שליטה על המעבד, והיא זו שמביאה את הלוח ממצב של חשמל בלבד למצב של מערכת שעובדת.
בפועל, מהנדס פירמוור אחראי על ארבעה דברים שאף אחד אחר בארגון לא נוגע בהם: רצף האתחול, הגדרת השעונים והמתחים של הרכיבים, ניהול הזיכרון הפיזי, והתקשורת עם הרכיבים ההיקפיים דרך אפיקים כמו I2C, SPI, UART, CAN ו-USB. כשרכיב חיצוני לא עונה, מהנדס הפירמוור הוא זה שמחבר לוגיק אנלייזר לאפיק ובודק אם ההודעה בכלל יצאה.
המשמעות המעשית של "לפני מערכת ההפעלה" היא שאין רשת ביטחון. אין מנהל זיכרון שיתפוס גישה לכתובת לא חוקית, אין מתזמן שייתן זמן מעבד לתהליך אחר, ואין קובץ לוג שנשמר לדיסק. באג שמופיע פעם ביומיים על לוח אחד מתוך מאה הוא תרחיש עבודה שגרתי, לא מקרה קיצון.
שרשרת האתחול: מה רץ לפני שיש מערכת הפעלה
הרצף שמתרחש בין רגע ההדלקה לבין המסך הראשון הוא הליבה של התחום. הוא מחולק לשלבים, וכל שלב אחראי לאמת ולהעלות את השלב הבא:
| שלב | מה הוא עושה | איפה הוא שמור |
|---|---|---|
| Boot ROM | קוד שצרוב בשבב במפעל, בוחר ממה לאתחל | ROM פנימי, לא ניתן לעדכון |
| Bootloader ראשון | מאתחל שעונים ו-DDR, טוען את השלב הבא | אזור מוגן ב-Flash |
| Bootloader ראשי | בוחר בין אימג' ראשי לגיבוי, מאמת חתימה | מחיצת boot |
| אימג' ראשי | הקוד שמריץ את המוצר, עם או בלי RTOS | מחיצת application |
| אזור נתונים | הגדרות, מפתחות, מונה אתחולים | מחיצה נפרדת, לא נדרסת בעדכון |
החלוקה למחיצות נפרדות אינה פורמליות. אם ההגדרות של המשתמש שמורות באותה מחיצה כמו הקוד, כל עדכון מוחק אותן; ואם אזור ה-boot אינו מוגן, עדכון שנקטע באמצע הופך את המכשיר ללבנה שאי אפשר להחיות מרחוק.
חתימת אימג' ו-Secure Boot
Secure Boot הוא הכלל שאומר: כל שלב מאמת חתימה קריפטוגרפית של השלב הבא לפני שהוא מעביר לו שליטה. המפתח הציבורי, או ה-hash שלו, נצרב ב-eFuse או ב-OTP של השבב, כלומר זיכרון חד-פעמי שלא ניתן לשנות אחרי הצריבה.
שלושה כשלים חוזרים על עצמם בהטמעה של התהליך. הראשון הוא צריבת eFuse בטרם עת - ברגע שהופעל מנגנון האימות על לוח פיתוח, כל אימג' לא חתום מפסיק לעלות, ולוח כזה אינו ניתן לשחזור. השני הוא ניהול מפתח החתימה על מחשב של מפתח במקום ב-HSM או בשרת חתימה ייעודי. השלישי הוא היעדר מנגנון anti-rollback: אם אין מונה גרסאות שנצרב בחומרה, תוקף יכול להתקין גרסה ישנה וחתומה כדין שיש בה חולשה ידועה.
המחיר של Secure Boot הוא זמן אתחול. אימות חתימה על אימג' גדול מוסיף מאות מילישניות, ובמוצרים שנדרשים לעלות מהר נהוג לאמת בשלב הראשון רק את הכותרת ואת החלק שנטען מיד, ולהמשיך את האימות ברקע.
עדכון OTA ומנגנון ה-Rollback
עדכון מרחוק הוא הנקודה שבה פירמוור הופך למסוכן באמת, כי כשל בעדכון מגיע למוצרים שכבר אצל לקוחות. המבנה המקובל הוא שתי מחיצות אפליקציה, A ו-B: הגרסה החדשה נכתבת למחיצה הלא-פעילה, מאומתת במלואה, ורק אז דגל אתחול מופנה אליה.
אחרי האתחול הראשון בגרסה החדשה המכשיר נמצא במצב "ניסיון": אם הקוד לא סימן את עצמו כתקין תוך פרק זמן מוגדר, ה-bootloader חוזר אוטומטית למחיצה הקודמת. הסימון הזה חייב להתבצע אחרי שהמערכת הוכיחה שהיא חיה - למשל אחרי שהתחברה לשרת - ולא בשורה הראשונה של main, כי אז הוא חסר משמעות.
- הורדה מדורגת - שחרור לאחוז קטן מהצי לפני הרחבה לכולם.
- חבילת דלתא - העברת ההפרש בלבד, קריטי בחיבור סלולרי מוגבל.
- עמידות להפסקת חשמל - כתיבה אטומית של דגל האתחול, כך שניתוק באמצע אינו משאיר מצב ביניים.
- טלמטריה - דיווח על הצלחה או נפילה, אחרת אין דרך לדעת שהעדכון נכשל בשדה.
Flash, Watchdog וצריכת חשמל - שלוש מגבלות שמעצבות את הקוד
זיכרון Flash נשחק. תא NOR מחזיק סדר גודל של עשרות אלפי מחיקות, ו-NAND פחות מכך לתא. קוד שכותב מונה לאותה כתובת כל שנייה ישרוף את הבלוק בתוך חודשים. הפתרון המקובל הוא wear leveling, כתיבה מעגלית בלוג במקום עדכון במקום, ואיחוד כתיבות לפעימות נדירות.
Watchdog הוא טיימר חומרתי שמאתחל את המערכת אם לא "האכילו" אותו בזמן. הטעות הנפוצה ביותר היא להאכיל אותו מתוך פסיקת טיימר: כך הוא ימשיך להתאפס גם כשהלולאה הראשית תקועה לגמרי, וכל תכליתו מתבטלת. הדפוס הנכון הוא שכל משימה קריטית מדווחת שהיא חיה, ורק כשכולן דיווחו הטיימר מתאפס.
במוצרים שמופעלים בסוללה, צריכת החשמל היא דרישה הנדסית מספרית ולא שאיפה. המעבד מבלה את רוב חייו במצב שינה עמוקה ומתעורר לפסיקה, ולכן כל בחירה בקוד - האם להשתמש ב-polling או בפסיקה, באיזו תדירות לדגום חיישן - מתורגמת ישירות לחודשים של חיי סוללה.
עבודה ברמת הרגיסטר מול Datasheet
החומר המקצועי בתחום אינו בלוגים אלא מסמכים: datasheet של הרכיב, reference manual של המעבד, errata sheet שמפרט באגים ידועים בסיליקון, ותרשים החשמל של הלוח. עבודה נכונה מתחילה בקריאה של פרק ברגיסטרים ובכתיבת רצף האתחול לפיו, לא בהעתקת קוד דוגמה.
מסמך ה-errata הוא המסמך שהכי הרבה מהנדסים מדלגים עליו ושהכי הרבה שעות דיבוג נחסכות בזכותו. התנהגות שנראית כמו באג בקוד מתבררת לא פעם כמגבלה מתועדת בסיליקון שיש לה עקיפה רשמית.
הכלים היומיומיים הם JTAG או SWD לניפוי שגיאות בזמן ריצה, לוגיק אנלייזר לצפייה באפיק, אוסילוסקופ לאותות אנלוגיים, ו-UART כערוץ לוג בסיסי. בסביבות מודרניות מוסיפים גם בדיקות יחידה שרצות על המחשב מול שכבת חומרה מדומה, ומעבדת בדיקות אוטומטית שמריצה את הבילד על לוחות אמיתיים.
הגבול המדויק בין Firmware ל-Embedded Software
שני המונחים מתחלפים בשיחה, אבל הם מתארים עבודה שונה. ההבחנה השימושית היא מה יש מתחתיך:
| שאלה | Firmware | Embedded Software |
|---|---|---|
| מה רץ מתחת לקוד | כלום, או RTOS דק | לינוקס משובץ או RTOS מלא |
| גישה לחומרה | כתיבה ישירה לרגיסטרים | דרך דרייבר ו-API של המערכת |
| שפות | C, אסמבלי, מעט C++ | C++, C, לעיתים Python לכלים |
| גודל זיכרון טיפוסי | קילובייטים | מגה עד גיגה |
| דיבוג | JTAG, לוגיק אנלייזר | gdb, לוגים, כלי פרופיילינג |
| מה נחשב תקלה חמורה | לוח שלא עולה | תהליך שקורס וקם מחדש |
בשוק הישראלי הגבול הזה מטושטש בכוונה: בחברות קטנות אותו אדם כותב את ה-bootloader וגם את שכבת האפליקציה. הרחבנו על הצד השני של הגבול במאמר מה זה מהנדס Embedded.
כמה משרות פתוחות בישראל ואיפה הן
בשדה הקטגוריות של הלוח מסווגות כרגע 12 משרות כ-EMBEDDED_SOFTWARE ומשרה אחת בלבד כ-FIRMWARE_ENGINEERING. הפער הזה אומר משהו על השוק: כמעט אף חברה בישראל אינה מפרסמת את התפקיד תחת הכותרת "מהנדס פירמוור". החיפוש המעשי הוא לפי הטכנולוגיה, ולכן 11 המשרות שמזכירות Embedded C ו-21 המשרות שמזכירות C הן נקודת הפתיחה הנכונה.
מבחינת תעשיות, הביקוש מרוכז בביטחוניות, ברפואי, בשבבים ובמכשור תעשייתי - תחומים שבהם המוצר הוא חומרה שנמכרת פעם אחת וצריכה לעבוד עשור. לגבי שכר, הערכת שוק מקובלת בתעשייה למהנדס פירמוור מנוסה בישראל היא בטווח רחב של עשרות אלפי שקלים בחודש; אין בבסיס הנתונים שלנו שדה שכר, ולכן כל מספר כזה הוא הערכת שוק בלבד.
איך נראה ראיון פירמוור
הראיון בתחום שונה מראיון תוכנה כללי. במקום שאלות על מבני נתונים, שואלים על מה שקורה כשהחומרה לא משתפת פעולה:
- מה עושה המילה volatile, ומתי היעדרה יגרום לבאג שמופיע רק בבילד עם אופטימיזציה.
- איך מעבירים נתון בין פסיקה ללולאה הראשית בלי מנעול.
- מה ההבדל בין endianness של האפיק לזה של המעבד, ואיפה זה שובר פרוטוקול.
- איך היית מאתר דליפה של מצביע שגורמת לקריסה פעם ביומיים.
- תאר את שרשרת האתחול של מוצר שעבדת עליו, שלב אחר שלב.
- מה קורה אם החשמל נופל בדיוק באמצע כתיבת עדכון.
שאלת שרשרת האתחול היא המבחן האמיתי. מועמד שעבד באמת על המוצר יודע לומר מי מאתחל את ה-DDR ומתי, ומועמד שנגע רק בשכבת האפליקציה יתקשה לענות.
שאלות נפוצות
מה ההבדל בין firmware לתוכנה רגילה?
תוכנה רגילה רצה מעל מערכת הפעלה שמנהלת עבורה זיכרון, תהליכים והרשאות. פירמוור רץ ישירות על החומרה, מאתחל אותה, ולרוב אין מתחתיו שום שכבה שתגן עליו מטעות. לכן גם קריסה בו נראית אחרת: לא תהליך שקם מחדש, אלא לוח שמפסיק להגיב.
איזו שפה צריך לדעת כדי לעבוד בפירמוור?
C היא השפה המרכזית, ובכל הצעת עבודה בתחום היא תופיע. אסמבלי נדרשת בקטעים קטנים כמו וקטור הפסיקות ורצף האתחול הראשוני. C++ מופיעה בפרויקטים חדשים יותר, לרוב בתת-קבוצה שאינה כוללת הקצאות דינמיות וחריגות.
האם אפשר לעבור מפיתוח תוכנה לפירמוור?
אפשר, והמעבר הנפוץ ביותר הוא ממי שכבר כותב ב-C או ב-C++ בצד השרת. מה שחסר בדרך כלל אינו התכנות אלא הנוחות מול חומרה: לקרוא datasheet, לחבר לוגיק אנלייזר ולהבין תרשים חשמלי. פרויקט אישי על לוח פיתוח זול עם רכיב חיצוני על אפיק SPI מכסה את רוב הפער.
מה זה OTA ולמה הוא כל כך מורכב?
OTA הוא עדכון פירמוור מרחוק. הוא מורכב כי הכשל מגיע לשדה: מכשיר שנכשל בעדכון אינו נגיש לתמיכה, ולעיתים גם לא לחשמל. לכן כל מערכת OTA רצינית בנויה על שתי מחיצות, אימות חתימה לפני החלפה, ומנגנון חזרה אוטומטי לגרסה הקודמת אם החדשה לא הוכיחה את עצמה.
מה זה Watchdog ואיך משתמשים בו נכון?
זהו טיימר חומרתי שמאתחל את המערכת אם לא איפסו אותו בזמן. השימוש הנכון הוא לאפס אותו רק כשכל המשימות הקריטיות דיווחו שהן חיות, ולא מתוך פסיקת טיימר עצמאית - אחרת הוא ימשיך לדווח שהכל תקין בזמן שהמערכת תקועה.
כמה משרות פירמוור יש בישראל?
המילה firmware כמעט אינה מופיעה בכותרות משרות בלוח, ולכן חיפוש לפיה מטעה. הדרך המעשית היא לחפש לפי הטכנולוגיה: כרגע פתוחות 21 משרות שמזכירות Embedded C ו-21 משרות שמזכירות C.
האם צריך תואר בהנדסת חשמל?
לא תמיד, אבל זה היתרון הבולט ביותר. תואר בהנדסת חשמל או בהנדסת מחשבים נותן את הבסיס שקשה להשלים לבד: אותות, אלקטרוניקה בסיסית וארכיטקטורת מחשבים. בוגרי מדעי המחשב נכנסים לתחום, בדרך כלל דרך צוות שמוכן ללוות אותם בחצי שנה הראשונה מול החומרה.