מערכות משובצות ומצבי "קיוסק"

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

אחת השיטות שהיתה נהוגה בעבר היתה להכניס PC קטנטן (עם מעבד Atom או Celeron) ועליו להריץ Windows ועליו את האפליקציות הדרושות, להקשיח את המערכות ולמכור אותה. הבעיות בדרך כלל הן:

  • עדכוני אבטחה – קשה להתקין עדכוני אבטחה ל-Windows כשאין לך תקשורת חיצונית, ומה לעשות ש-Windows דורש המון עדכוני אבטחה.
  • מחיר רשיון – 150-200$ לרשיון Windows Pro (מחיר שונה ל-Windows Embedded אבל כיום המוצר מאבד פופולריות במהירות לטובת פתרונות מבוססי Linux).
  • קבלת Latency נמוך – לא חשוב כמה תכוונן את Windows, תמיד יהיו "קפיצות" שישבשו את ה-Latency.

לכן הרוב עוברים למערכות מבוססות ARM.

לוחות מבוססי מעבדי ARM כדוגמת I.MX6/7/8 ומעבדים אחרים קיימים בשוק זמן רב ובשנים האחרונות המחירים צונחים (בעיקר עקב פופולריות של Raspberry Pi). מחשב קטן שרק לפני כמה שנים היה עולה מאות דולרים, צנח למחירים שכיום נמדדים בעשרות דולרים (כולל אחסון קבוע כמו eMMC). פאנלים ללוחות כאלו קל לחבר (דרך LVDS לדוגמא) והתוספת ל-Touch היא דולרים בודדים, ולכן יש רצון מצד חברות שונות לבנות פתרונות שאותם הם משלבים במוצריהם – הכוללים מעבדי ARM, עם צג מגע וחוויית משתמש טובה. יש אפילו חברה מסויימת שמייצרת Appliance בגודל 1U .. .עם מסך מגע נשלף. לאן הגענו….

לקוח כזה בסופו של דבר צריך לבנות Image שיוכנס ב-eMMC של הלוח. ה-Image אמור לכלול את כל חלקי התוכנה ויש מספר אפשרויות:

  • לינוקס "רגיל" – אפשרות אחת היא לקחת הפצת לינוקס רגילה (Debian, CentOS וכו') עם Kernel שמגיע מיצרן (או שהאינטגרטור מקמפל תוך שימוש ב-BSP, Cross compiler וכו') ופשוט מקימים לינוקס עם התקנת התוכנות הנדרשות (בשימוש yum/apt) וההגדרות הכרוכות בכך, ולבסוף מכינים Image. יש כלים כמו kickstart (ל-CentOS) או Preseed (ל-Debian) כדי להכין Image כזה.
    הבעיה בשיטה זו היא שיש צורך בידע רציני להגדיר את הסביבה הגרפית (Xorg, Wayland, שימוש ב-OpenGL וכו') מכיוון שאין אוטומציה שניתן להשאיל מ-X86 ויש צורך להשקיע מאמצים מרובים להגדיר את הכל.
    חסרון נוסף: אבטחה. במקרים רבים החבילות המגיעות עם תלויות שאין בהן צורך עבור אותה מערכת משובצת ולכן יש לקמפל את החבילות מחדש ללא אותן תלויות או במקרה היותר קשה – לבטל/להחליף תלויות באחרות. חבילות מיותרות ופונקציונאליות שאינה דרושה, גם אם אינן מופעלות יכולות פוטנציאלית לגרום לחורי אבטחה במערכת.
  • Yocto – אחד הכלים הכי פופולריים. עם Yocto אפשר ליצור Image מצומצם לדברים שאנו צריכים בלבד. מערכת Yocto בונה לנו את כל המערכת ולבסוף מכינה Image שניתן "לזרוק" על כרטיס מיקרו SD או על eMMC. המערכת מספיק חכמה בשביל לא לקמפל חבילות שכבר קומפלו ולא היה בהן שינויים, וכל יצרן לוחות ARM תומך בה.
    החסרון עם Yocto: בלא מעט מקרים תצטרך לדעת איך לבנות Recipe כדי להוסיף את החבילה שאתה רוצה ועם אלו ספריות ו-Compile Flags לעיתים. בנוסף – תצטרך להוסיף את ההגדרות לכל חבילה שתרצה בתוך ה-Yocto. בכל הקשור לגרפיקה – גם כאן, תצטרך לשבור את הראש איך להגדיר את הדברים.
  • Boot2QT – זהו מוצר של חברת TrollTech שמשתמש ב-Yocto כדי לבנות מערכת גרפית מוכנה. לא תצטרך לשבור את הראש על Touch, על הגדרות Frame Buffer או Xorg ופרמטרים אחרים. מוצר הדגל של החברה (QT Creator) נותן לך לכתוב אפליקציות גרפיות ולנסות אותן על מחשבך או ישירות על המערכת המשובצת (מבלי להכין כל פעם Image מחדש כדי לנסות את הקוד שכתבת). המערכת קטנה ועולה תוך שניות ספורות. היא גם הופכת את החיים להרבה יותר קלים מבחינת שימוש ב-Yocto והיא מסתירה לא מעט חלקים מורכבים ומטפלת בקומפילציה.
    החסרון: זו מערכת מסחרית. ישנה גירסה חופשית אך אם תשתמש בה, תצטרך לשחרר את כל הקוד שכתבת באפליקציה הגרפית.
  • Android – עוד פתרון שחברת "אגד" לדוגמא – שמחה לאמץ אותו לנהגים כמערכת קופה/כרטוס. כל יצרן מערכת ARM בדרך כלל משחרר גירסת אנדרואיד ולחברה שרוצה להשתמש בכך, ניתן לקחת את גירסת האנדרואיד ולהוריד חלקים שאין צורך בהם, ואם צריך לכתוב אפליקציות יעודיות, לא חסרים מפתחי אנדרואיד (וכן, יש גם מצב קיוסק באנדרואיד) כך שניתן לכתוב את האפליקציה ולשלב אותה ב-Android הפנימי שיווצר ל-Image שירוץ על המערכת. אם צריכים חבילות לינוקס, אפשר להרים מערכת כמו Linux Deploy שתרוץ ברקע, להקים הפצת לינוקס מינימלית שצריכים עם החבילות הדרושות ואז מהאפליקציה שלכם לתקשר דרך Socket או דרך TCP אל האפליקציה (אישית עשיתי זאת פעמיים וזה הציל פעם אחת פרויקט מביטול מאחר והאפשרויות האחרונות לא אפשרו התקנת חבילות מסויימות).
    החסרון: אם מחפשים Boot של 3-5 שניות – תשכחו מזה. בנוסף, קימפול קרנל למערכת אנדרואיד אינו עניין פשוט הואיל ויש לא מעט חלקים שאנדרואיד כן צריך והפצות לינוקס רגילות לא צריכות.

כפי שניתן לראות – יש מספר אופציות לבניית מערכת מבוססת ARM. לכל דרך יש יתרונות וחסרונות וגם דרישות זכרון שונות. כך לדוגמא אם הוחלט שמערכת ה-ARM תהיה עם 512 מגהבייט זכרון בלבד, כדאי יהיה לוותר על מתודת האנדרואיד ואותו דבר אם הוחלט שלא יהיה touch. מצד שני, אם אתם צריכים להכניס 20 אפליקציות לינוקס פופולריות, אולי הדרך של בניית הפצת לינוקס תהיה עדיפה עבורכם.

לסיכום: מערכות ARM קיימות היום במחירים מאוד תחרותיים ובניית Image עם הדברים שאתם רוצים ניתנת לביצוע. כדאי לבדוק קודם כל מה אתם רוצים להריץ ורק אז לבדוק את האפשרויות לעיל. אם יש לכם צורך ביעוץ בנידון – אתם מוזמנים ליצור קשר.