המיקרו-בקר של הארדואינו Uno הוא של 8 ביטים. זה של ה-MSP430 Launchpad עובד עם 16 ביטים, וללוחות מתקדמים כמו Arduino Due, Tiva-C Launchpad ואפילו Rapsberry Pi יש מיקרו-בקרים/מעבדים של 32 ביט. מה זה בעצם אומר? מה נותן המספר הזה? למה אין מיקרו-בקר של, נניח, 19 ביטים, ואיזה כדאי לבחור בשביל הפרויקט הבא שלכם?
עיבוד נתונים
בעולם האמתי, כמובן, שום דבר לא כזה פשוט – ועדיין, את אופן הפעולה של כל המיקרו-בקרים והמעבדים כיום אפשר לתמצת לצורך העניין כך: הם מעתיקים פיסות מידע מהזיכרון (או מאמצעי קלט) לתוך רגיסטרים פנימיים, מבצעים פעולות לוגיות ו/או מתמטיות על הרגיסטרים האלה, ומעתיקים את התוצאות מהרגיסטרים בחזרה לזיכרון (או לאמצעי פלט). את הפעולות האלה הם יכולים לעשות לאט או מהר – כאן נכנסת לתמונה מהירות השעון – אבל אנחנו נתעלם מזה ונתמקד רק בביטים.
כשאומרים על מיקרו-בקר כלשהו שהוא, נניח, 8 ביטים, הדבר הראשון שזה אומר זה שכל רגיסטר פנימי שלו הוא בגודל 8 ביטים. בייט יחיד, שמסוגל לאחסן מספר בטווח 0-255 (כולל) או, בייצוג אחר, 128- עד 127. זה טוב ויפה כשעובדים עם מספרים קטנים, אך מה קורה כשמגיע פתאום מספר שנמצא מחוץ לטווח? למשל, הקלט האנלוגי של הארדואינו מחזיר לנו ערכים בין 0 ל-1023, אז איך המיקרו-בקר מתמודד איתם?
מה שקורה הוא שהמיקרו-בקר חייב "לשבור" את המספר הגדול ולטפל בו בשלבים. גם אם נהיה אופטימיים, ברור שעיבוד של ערך בן 16 ביטים ייקח למיקרו-בקר האומלל לפחות פי שניים זמן מאשר עיבוד של ערך בן 8 ביטים. במקרים כאלה, אפשר לומר (שוב, בקירוב גס!) שמיקרו-בקר של 16 ביט יהיה מהיר פי שניים ממיקרו-בקר של 8 ביטים, אפילו אם מהירות השעון שלהם במגהרץ זהה.
כתובות
וזה לא הכל. לארדואינו Uno יש 2 קילובייט של זיכרון RAM, מה שאומר שה"כתובת" של בייט יחיד בזיכרון יכולה להיות כל מספר בטווח 0 עד 2047 (כולל). גם המספרים האלה, כמובן, חוצים בקלילות את גבול ה-255 של שמונת הביטים, אז אפילו כדי לשלוף בייט אחד קטן מהזיכרון צריך לבצע טריק כזה או אחר שגוזל זמן ו/או מקום. כלומר, "מרחב הכתובות" של המיקרו-בקר וקלות השליפה של נתונים מהכתובות האלה קשורים גם הם למספר הביטים של הרגיסטרים.
לא הכל ורוד
יחד עם זאת, היתרון של מיקרו-בקרים בעלי יותר ביטים הוא לא בהכרח מוחלט. נניח שאני רוצה לאחסן כמות מסוימת של נתונים מטיפוס בייט (8 ביט) בזיכרון של מיקרו-בקר בעל 32 ביט. אם המיקרו-בקר יקצה לכל אחד מהם כתובת משלו – ובהינתן שיחידת הזיכרון ה"טבעית" שם היא בת 32 ביט – אז על כל בייט אחד יתבזבזו שאר 24 הביטים שבכתובת. לעומת זאת, אם המיקרו-בקר יצופף את הבייטים ויצמיד אותם זה לזה כדי למנוע בזבוז, כל יחידת זיכרון בסיסית תכיל למעשה ארבעה נתונים שונים, וכדי לחלץ כל אחד מהם יידרש עיבוד נוסף.
למה לא 19?
אין שום מגבלה טכנית על רגיסטרים בגודל 1, 2, 17 או 31 ביטים, ובטכנולוגיות הייצור של ימינו, גם הרבה יותר מזה. הסיבה לכך שמספרי הביטים בפועל הם שתיים-בחזקת-N (כש-N שווה 3 ומעלה, אם כי יש גם מיקרו-בקרים נדירים של 4 ביט) היא הסטנדרט של טיפוסי המשתנים עצמם. אין טעם לעבוד ב-9 ביט כשכל המערכות האחרות בעולם מותאמות ל-8 או ל-16 ביט.
בנוסף, מכיוון שבחומרה הכל נעשה בבסיס 2, קל יותר לתכנן וליישם מערכות שעובדות על כפולות ועל חזקות של 2.
סיכום: מה עדיף?
למרות ההסתייגות למעלה, בהנחה שכל הפרמטרים האחרים זהים (וכידוע זו הנחה שלא תמיד מתקיימת), מיקרו-בקר עם יותר ביטים יהיה "חזק" יותר ומתאים יותר למשימות שדורשות עיבוד אינטנסיבי של מספרים גדולים, כגון יישומים עם חישובים מתמטיים בזמן אמת, עבודה עם מולטימדיה וכדומה.
מצד שני, יש המון משימות שלא מחייבות עוצמה שכזו, אפילו אם במבט ראשון נדמה שכן, ותכנות חכם יכול לגרום גם למיקרו-בקר צנוע של 8 ביטים להפיק תוצאות מרשימות. לפעמים שיקולים של מחיר, צריכת חשמל, גודל פיזי והיכרות קודמת הופכים דווקא את המיקרו-בקרים עם מספר הביטים הנמוך יותר למועדפים עבור מערכת מסוימת.
אחלה פוסט, רק אוסיף תוספת קטנה עבור ההסבר על מגבלות הביטים ולמה הם כפולות של 2. הסיבה שהם כפולות של 2 זה לא בגלל שזה הסטנדרט (זה קצת כמו לשאול למה X והתשובה היא כי זה X), אלא בגלל שבכל מעבד מודרני – כשאתה רוצה לגשת לכתובת מסויימת- מה שאתה עושה בחומרה זה להשתמש ב multiplexer (או mux בקיצור) שיש בחומרה של הבקר\מעבד. אם לומדים איך ה Mux בנוי אז יש לו n כניסות (ביטים) ו 2 בחזקת n ערכי מטרה פוטנציאליים שאת הערך שנמצא בהן הוא יכול לספק ביציאה בהינתן מספר n כלשהו (הכתובת המבוקשת). בבקר עם register שבו… לקרוא עוד »
איך מצאת את הפוסט הזה מ-2013 😀
מה שכתבת קשור לסיבה שהזכרתי, אולי יותר מדי בקצרה (בפסקה שמתחילה ב"בנוסף") – ושים לב ש-MUX של 9 ביט, למשל, לא מחייב מרחב כתובות מלא ממשי בסיליקון. הדוגמה הכי פשוטה – מיקרו-בקר עם SRAM בגודל 2K, שזה מבחינה מעשית 11 ביט.
אז הגדרה יותר נכונה היא כח מחשוב גדול יותר ולא בהכרח מהירות?
ההבדל בין 256 ל 4 מיליארד הוא עצום.
כן, זה ניסוח די מדויק. וההבדל באמת גדול. מזכיר לי איך עד לא מזמן, מערכות הפעלה ומעבדים (32 ביט) יכלו לתמוך ב-4GB של זיכרון RAM לכל היותר, והיום (64 ביט) הגבול התיאורטי כל כך גבוה שכבר אין לו אפילו שם 🙂
אז איך באמת לארדואינו יש יותר מ256 בייטים של זיכרון RAM?
שאלה טובה שתקפה גם למיקרו-בקרים 8-ביט אחרים. לעתים זה נפתר על ידי החלפת pages (נדמה לי שב-PIC זה ככה), לפעמים על ידי address bus פנימי עם יותר מ-8 ביטים… בכל מקרה יש לפתרונות האלה השפעה על הביצועים, משמעותית מספיק כדי שאי אפשר יהיה לסבול אותה במחשב אישי.
אז 32 ביט הוא מהיר יותר זה בעצם ההבדל? לא יצא לי עוד לעשות פרויקט שמצריך מהירות יותר גדולה מ8 ביט . 8 ביט גם יותר חסכוני בחשמל לא?
ושאלה אחרונה זה טווח הערכים ב 32 ביט?
0 – 42949672965
1. מהירות: לא בהכרח. אפשר למצוא 8-ביט מהירים ו-32 ביט איטיים… אבל ככלל ל-32 ביט אכן יש שעון מהיר יותר, והם יכולים גם "להספיק יותר" בכל פעולה בסיסית מתמטית או לוגית על מספרים גדולים.
2. חסכון בחשמל: לא בהכרח… הרושם שלי הוא ש-32-ביט מודרניים נבנים מתוך מודעות לקטע הזה ויכולים להיות די חסכוניים, גם אבסולוטית וגם בחישוב יחסי למהירות השעון.
3. לא – ה-6 האחרון במספר לא צריך להיות שם 🙂 הטווח, אם מסתכלים על מספרים חסרי סימן, הוא אפס עד שתיים-בחזקת-שלושים-ושתיים-פחות-אחד.