תמיכה של FPC ב OpenMoko

כאשר קיבלתי את Neo התחלתי לבדוק איך לגרום ל FPC לעבוד איתו. בהתחלה שלחתי הודעות ברשימת הדיוור, וגיליתי שגם בני (בנידיקט) מנסה לעשות אותו הדבר, רק לו יש הרבה יותר ניסיון ממני בעובדה עם Embedded.  מסתבר שבכלל יש הרבה מפתחי Embedded בקהילת ה FPC. לכמה מהם אפילו יש Free Runner .

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

הסיבה לקושי הוא בכך שיש 2 סוגי ABI עבור ARM בתמיכה של libc, ו FPC תומכת הרבה שנים כבר בגישה הישנה יותר של ARM אבל כמעט בכלל לא בגרסה החדשה.

הגרסאות השונות נקראות:

  1. OABI – תמיכה טובה במעבדי ARM ישנים, אבל אין תמיכה בהרבה תכונות של מעבדי הARM החדשים יותר (FPC תומכת בצורה טובה ב ABI הזה)
  2. EABI – תמיכה חדשה יותר למעבדי ARM עם יכולות טובות יותר. למשל תמיכה במעבד מתמטי ונקודות צפות ועוד הרבה דברים (ל FPC אין תמיכה טובה בו, היות והמימוש לתמיכה מאוד חדש וכמעט ולא נבדק)

סתם בשביל שתבינו טוב יותר, לקח שבוע בערך לאדם בודד לגרום ל FPC לתמוך בצורה מלאה ב iPhone ו iPod בגלל שהם תומכים ב OABI, ולפי הבנתי כבר יש מוצרים מסחריים שנכתבו עם FPC עבור הפלטפורמות האלו.

בקיצור, בני השקיע הרבה יותר ממני והבין איך אפשר לבנות על לינוקס את FPC בשביל שהוא יתמוך ב OpenMoko . לצרוך התמיכה הזו צריך להדר את binutils בצורה הבאה:

./configure –prefix=/opt/crossbinutils –target=arm4tl-unknown-linux

אם אתם שואלים למה צריך את binutils עבור תכנות חוצה פלטפורמות, אז הסיבה לכך היא פשוטה: binutils מכיל כלים כדוגמת gnu-as ו gnu-ld אשר יודעים לקחת קוד וליצור ממנו קבצי ריצה בינאריים כדוגמת a.out, elf וכו'.

במקרה הזה FreeRunner עובד עם ARM EABI, ולכן אנחנו רוצים להצליח על הפלטפורמה שלנו (במקרה הספציפי שלי x86_64 שבאמת רץ ב64 ביט). לשם כך אנחנו צריכים עוד כלים לביצוע הידור לפלטפורמה אחרת, וזה מה שההידור שלנו עושה.

לאחר שיש לנו binutils מוכן עבור ה Neo FreeRunner שלנו,  ניכנס לספריית קוד המקור של FPC ונכתוב את הדבר הבא:

make clean all OS_TARGET=linux CPU_TARGET=arm BINUTILSPREFIX=/opt/crossbinutils/bin/arm4tl-unknown-linux- OPT="-dFPC_ARMEL -O- -dFPC_ABI_EABI" CROSSOPT="-dFPC_ARMEL -O-" FPC=/usr/bin/ppc386 NOGDB=1

השורה עושה ניקוי של מה שנוצר בעבר, ויוצרת מחדש את המהדר עם שלל הספריות שהוא מכיל ואנחנו מתאימים את זה למעבד ה ARM.  אנחנו אומרים לו איפה למצוא את הכלים של binutils ואיך להדר את המהדר ואת ppcrossarm, ועם איזה מהדר להשתמש בשביל לעשות את זה. וFPC יוצר 2 דברים חשובים:

  1. מהדר חוצה פלטפורמות בשם ppcrossarm – מאפשר לבצע תכנות חוצה פלטפורמות מהפלטפורמה שאנחנו משתמשים ל arm.
  2. תמיכה מלאה במהדר שיכול לרוץ בתוך openmoko.

הבעיה העיקרית היא ב ppcrossarm. כרגע הוא לא עובד כמו צריך, ולכן הבינארי שהוא יוצר לא יצליח לרוץ ב OpenMoko . כאשר תורץ האפליקצהי שהודרה עם ppcrossarm תתקבל הודעות שגיאה שה ABI לא נתמך.

לכן יש צורך להשתמש כרגע במהדר בתוך FreeRunner.

במידה ואתם רוצים לחסוך מעצמכם הידור של FPC בתוך OpenMoko (לקח לבני שעתיים), ניתן להוריד את כל הנדרש מהאתר שלו בכתובת הבאה:

http://www.my-distribution.org/files/fpc-2.3.x-arm-20090319.tar.gz

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

http://www.my-distribution.org/files/fpc-2.3.x-arm-20090319-nodir.tar.gz

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

תכנות מהנה ובהצלחה

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s