כדי לקבוע את צריכת האנרגיה של רכיב מסוים, אפשר להשוות בין הזרם שנמשך מהמכשיר כשהרכיב במצב הרצוי (למשל, מופעל, פעיל, סורק) לבין הזרם שנמשך מהמכשיר כשהרכיב כבוי. כדי למדוד את הזרם הממוצע המיידי שנמשך מהמכשיר במתח נומינלי, משתמשים במעקב צריכת אנרגיה חיצוני, כמו ספק כוח למדידה או כלים מיוחדים למעקב אחרי סוללות (למשל, תוכנת Power Monitor ו-Power Tool של Monsoon Solution Inc.).
לרוב, היצרנים מספקים מידע על הזרם הנצרך על ידי רכיב ספציפי. כדאי להשתמש במידע הזה אם הוא מייצג במדויק את המתח שנמשך בפועל מסוללת המכשיר. עם זאת, חשוב לאמת את הערכים שסופקו על ידי היצרן לפני שמשתמשים בהם בפרופיל צריכת האנרגיה של המכשיר.
בקרת צריכת החשמל
במהלך המדידה, חשוב לוודא שהמכשיר לא מחובר למקור טעינה חיצוני, כמו חיבור USB למארח פיתוח שמשמש להרצת Android Debug Bridge (adb). המכשיר שנבדק עלול למשוך זרם מהמארח, וכך להקטין את המדידות בסוללה. כדאי להימנע מחיבורי USB On-The-Go (OTG), כי מכשיר ה-OTG עלול למשוך זרם מהמכשיר שנבדק.
לא כולל הרכיב שנמדד, המערכת צריכה לפעול ברמת צריכת אנרגיה קבועה כדי למנוע מדידות לא מדויקות שנגרמות כתוצאה משינויים ברכיבים אחרים. פעילויות מערכת שעלולות לגרום לשינויים לא רצויים במדידות צריכת החשמל כוללות:
- פעילות של קליטה, שידור או סריקה ברשתות סלולריות, Wi-Fi ו-Bluetooth. כשלא מודדים את עוצמת הרדיו הסלולרי, מגדירים את המכשיר למצב טיסה ומפעילים את ה-Wi-Fi או את ה-Bluetooth לפי הצורך.
- הפעלה/כיבוי של המסך. הצבעים שמוצגים כשהמסך פועל יכולים להשפיע על צריכת החשמל בטכנולוגיות מסך מסוימות. כשמוסיפים רכיבים שאינם מסך, צריך לכבות את המסך.
- השהיה/המשך של המערכת. מצב שבו המסך כבוי יכול להפעיל השעיה של המערכת, וכתוצאה מכך חלקים מהמכשיר יעברו למצב של הספק נמוך או כבוי. המצב הזה עלול להשפיע על צריכת החשמל של הרכיב שנמדד, ולגרום לתנודות גדולות במדדי החשמל כי המערכת ממשיכה לשלוח התראות מדי פעם וכו'. פרטים נוספים זמינים במאמר שליטה בהשהיית המערכת.
- יחידות CPU שמחליפות מהירות ונכנסות/יוצאות ממצב חוסר פעילות של מתזמן עם צריכת אנרגיה נמוכה.
במהלך הפעולה הרגילה, המערכת מבצעת התאמות תכופות למהירויות המעבדים, למספר הליבות של המעבדים (CPU) שמחוברות לאינטרנט ולמצבים אחרים של הליבה של המערכת, כמו מהירות של מערכי ה-bus של הזיכרון והמתח של מסילות החשמל שמשויכות למעבדים ולזיכרון. במהלך הבדיקה, השינויים האלה משפיעים על מדידות ההספק:
- פעולות של שינוי קצב המהירות של המעבד יכולות לצמצם את השינוי של קצב השעון והמתח של מערכי הזיכרון ורכיבים אחרים בליבה של המערכת.
- פעילות תזמון יכולה להשפיע על אחוז הזמן שבו מעבדים נמצאים במצבי פעילות במצב המתנה עם צריכת אנרגיה נמוכה. במאמר שליטה במהירויות של מעבדים מוסבר איך למנוע את ההתאמות האלה במהלך הבדיקה.
לדוגמה, Joe Droid רוצה לחשב את הערך screen.on
של מכשיר. הוא מפעיל את מצב טיסה במכשיר, מפעיל את המכשיר במצב יציב, שומר על מהירות קבועה של המעבד ומשתמש ב-wakelock חלקי כדי למנוע השהיה של המערכת. לאחר מכן, יוסי מכבה את המסך של המכשיר ומבצע מדידה (200 mA). לאחר מכן, ג'ו מפעיל את מסך המכשיר בהירות מינימלית ומבצע מדידה נוספת (300 mA). הערך של screen.on
הוא 100mA (300-200).
הערה: לרכיבים שאין להם צורת גל שטוח של צריכת זרם כשהם פעילים (כמו רדיו סלולרי או Wi-Fi), מודדים את הזרם הממוצע לאורך זמן באמצעות כלי למעקב אחר צריכת חשמל.
כשמשתמשים במקור מתח חיצוני במקום בסוללה של המכשיר, יכול להיות שהמערכת תתקל בבעיות בגלל תרמוסטט של סוללה לא מחובר או פינים משולבים של מד דלק (כלומר, קריאה לא חוקית של טמפרטורת הסוללה או של קיבולת הסוללה שנותרו עלולה לכבות את הליבה או את מערכת Android). סוללות מזויפות יכולות לספק אותות על פינים של תרמוסטט או מד דלק, שמחקים את קריאות הטמפרטורה ומצב הטעינה של מערכת רגילה. הן עשויות גם לספק כבלים נוחים לחיבור למקורות מתח חיצוניים. לחלופין, אפשר לשנות את המערכת כך שתתעלם מהנתונים הלא חוקיים מהסוללה החסרה.
השעיה של מערכת הבקרה
בקטע הזה נסביר איך להימנע ממצב השהיה של המערכת כשלא רוצים שהוא יפריע למדידות אחרות, ואיך למדוד את צריכת החשמל במצב השהיה של המערכת כשרוצים למדוד אותה.
מניעת השעיית המערכת
השהיה של המערכת עלולה לגרום לתנודות לא רצויות במדידות החשמל ולהעביר את רכיבי המערכת למצבי צריכת אנרגיה נמוכה שלא מתאימים למדידת צריכת אנרגיה פעילה. כדי למנוע השהיה של המערכת בזמן שהמסך כבוי, צריך להשתמש ב-wakelock חלקי זמני. מחברים את המכשיר למארח פיתוח באמצעות כבל USB ומפעילים את הפקודה הבאה:
adb shell "echo temporary > /sys/power/wake_lock"
במצב wake_lock
, מצב המסך כבוי לא מפעיל השהיה של המערכת.
(חשוב לזכור לנתק את כבל ה-USB מהמכשיר לפני שמודדים את צריכת החשמל).
כדי להסיר את ה-wakelock:
adb shell "echo temporary > /sys/power/wake_unlock"
השעיה של מערכת המדידה
כדי למדוד את צריכת החשמל במצב ההשהיה של המערכת, מודדים את הערך של cpu.idle
בפרופיל האנרגיה. לפני שמתחילים למדוד:
- מסירים את ה-wakelocks הקיימים (כפי שמתואר למעלה).
- כדי למנוע פעילות בו-זמנית של הרדיו הסלולרי, שעשוי לפעול במעבד נפרד מחלקי ה-SoC שבשליטת השהיה המערכת, צריך להעביר את המכשיר למצב טיסה.
- מוודאים שהמערכת במצב השהיה:
- מוודאים שהמדידות הנוכחיות מגיעות לערך יציב. הקריאות צריכות להיות בטווח הצפוי לצריכת החשמל של SoC במצב השהיה, בתוספת צריכת החשמל של רכיבי המערכת שעדיין מחוברים לחשמל (כמו USB PHY).
- בדיקת הפלט של מסוף המערכת.
- מעקב אחר אינדיקציות חיצוניות לסטטוס המערכת (למשל, נורית LED נכבית כשהמערכת לא במצב השהיה).
שליטה במהירויות המעבד
אפשר להעביר מעבדים פעילים למצב אופליין או להעביר אותם למצב אונליין, לשנות את מהירויות השעון ואת המתחים המשויכים (שעשויים להשפיע גם על מהירויות של מערכי ה-bus של הזיכרון ועל מצבי צריכת אנרגיה אחרים של ליבות המערכת), ולהעביר אותם למצבי פעילות במצב המתנה עם צריכת אנרגיה נמוכה יותר בזמן שהם נמצאים בלולאת המתנה של הליבה. כשמודדים מצבי צריכת אנרגיה שונים של המעבד לפרופיל צריכת האנרגיה, חשוב להימנע מהשונות בצריכת האנרגיה כשמודדים פרמטרים אחרים. בפרופיל צריכת האנרגיה מוגדרות אותן מהירויות ותכונות צריכת אנרגיה לכל מעבדים.
בזמן מדידת הספק של המעבד (CPU), או בזמן שמשאירים את הספק של המעבד קבוע כדי לבצע מדידות אחרות, חשוב לשמור על מספר המעבדים שמחוברים לאינטרנט קבוע (למשל, מעבד אחד מחובר לאינטרנט והשאר אופליין או מחוברים באמצעות חיבור חם). שמירת כל מעבדי ה-CPU, מלבד אחד, במצב חוסר פעילות בתזמון עשויה להניב תוצאות סבירות. עצירת מסגרת Android באמצעות adb shell stop
יכולה להפחית את הפעילות של תזמון המערכת.
צריך לציין את מהירויות המעבד הזמינות למכשיר ברשומה cpu.speeds
של פרופיל צריכת האנרגיה. כדי לקבל רשימה של מהירויות המעבד הזמינות, מריצים את הפקודה:
adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
המהירויות האלה תואמות למדידות ההספק התואמות בערך cpu.active
.
בפלטפורמות שבהן מספר הליבות שמחוברות לרשת משפיע באופן משמעותי על צריכת החשמל, יכול להיות שתצטרכו לשנות את מנהל או הנהג של cpufreq בפלטפורמה. רוב הפלטפורמות תומכות בשליטה במהירות המעבד באמצעות ה-governor של cpufreq במרחב המשתמש, ושימוש בממשקי sysfs כדי להגדיר את המהירות. לדוגמה, כדי להגדיר מהירות של 200MHz במערכת עם מעבד אחד בלבד או בכל המעבדים שמשתמשים במדיניות cpufreq משותפת, משתמשים במסוף המערכת או במעטפת adb כדי להריץ את הפקודות הבאות:
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
הערה: הפקודות המדויקות משתנות בהתאם להטמעת cpufreq בפלטפורמה.
הפקודות האלה מוודאות שהמהירות החדשה לא חורגת מהגבולות המותרים, מגדירות את המהירות החדשה ואז מדפיסות את המהירות שבה המעבד פועל בפועל (לצורך אימות). אם המהירות המינימלית הנוכחית לפני הביצוע גבוהה מ-200000, יכול להיות שתצטרכו להפוך את הסדר של שתי השורות הראשונות, או להריץ שוב את השורה הראשונה כדי להוריד את המהירות המינימלית לפני הגדרת המהירות המקסימלית.
כדי למדוד את הזרם הנצרך על ידי מעבד שפועל במהירויות שונות, משתמשים במסוף המערכת כדי להציב את המעבד בלולאה שמקושרת למעבד באמצעות הפקודה:
# while true; do true; done
מבצעים את המדידה בזמן שהמחזור מתבצע.
במכשירים מסוימים יש הגבלה על מהירות המעבד המקסימלית במהלך פעולת 'האטת המעבד עקב חום' בגלל מדידת טמפרטורה גבוהה (כלומר, אחרי הפעלת מעבדים במהירויות גבוהות למשך תקופות ממושכות). כדאי לבדוק אם יש הגבלות כאלה באמצעות הפלט של מסוף המערכת בזמן ביצוע המדידות, או על ידי בדיקת יומן הליבה אחרי המדידה.
כדי לקבל את הערך של cpu.awake
, מודדים את צריכת האנרגיה כשהמערכת לא במצב השהיה ולא מבצעת משימות. המעבד צריך להיות בלולא מעגל של זמן השהיה (idle loop)
של מתזמן צריכת אנרגיה נמוכה, שבו הוא יכול לבצע הוראה של ARM Wait For Event או במצב צריכת אנרגיה נמוכה ספציפי ל-SoC עם זמן אחזור מהיר ליציאה שמתאים לשימוש במצב חוסר פעילות.
כדי למדוד את הערך של cpu.active
, צריך למדוד את צריכת החשמל כשהמערכת לא במצב השהיה ולא מבצעת משימות. מעבד אחד (בדרך כלל המעבד הראשי) צריך להריץ את המשימה, בזמן שכל שאר המעבדים צריכים להיות במצב חוסר פעילות.
מדידת עוצמת המסך
כשמודדים את צריכת החשמל במסך מופעל, חשוב לוודא שמכשירים אחרים שמופעלים בדרך כלל כשהמסך מופעל מופעלים גם כן. לדוגמה, אם מסך המגע והתאורה האחורית של המסך מופעלים בדרך כלל כשהמסך מופעל, חשוב לוודא שהם מופעלים במהלך המדידה כדי לקבל דוגמה ריאליסטית לצריכת החשמל במצב 'מסך מופעל'.
צריכת החשמל של טכנולוגיות תצוגה מסוימות משתנה בהתאם לצבעים שמוצגים, ולכן מדידות החשמל משתנות באופן משמעותי בהתאם למה שמוצג במסך בזמן המדידה. במהלך המדידה, חשוב לוודא שמופיע במסך משהו שתואם למאפייני צריכת החשמל של מסך ריאליסטי. כדאי לבחור בין הקיצוניות של מסך שחור לגמרי (שצורך את כמות החשמל הנמוכה ביותר בטכנולוגיות מסוימות) לבין מסך לבן לגמרי. אפשרות נפוצה היא תצוגה של לוח זמנים באפליקציית היומן, עם שילוב של רקע לבן ואלמנטים שאינם לבנים.
מודדים את המסך במצב מופעל בבהירות מינימלית ובבהירות מקסימלית של התצוגה או התאורה האחורית. כדי להגדיר את הבהירות המינימלית:
- שימוש בממשק המשתמש של Android (לא מומלץ). ב'הגדרות' > 'בהירות המסך', מחליקים את פס ההזזה לבהירות המסך המינימלית. עם זאת, ממשק המשתמש של Android מאפשר להגדיר את הבהירות רק ל-10-20% לפחות מהבהירות האפשרית של הלוח או של התאורה האחורית, ולא מאפשר להגדיר את הבהירות נמוכה כל כך עד שהמסך לא יהיה גלוי בלי מאמץ רב.
- שימוש בקובץ sysfs (מומלץ). אם האפשרות הזו זמינה, משתמשים בקובץ sysfs כדי לשלוט בהבהירות של הלוח עד לרמה המינימלית הנתמכת על ידי החומרה.
בנוסף, אם קובץ ה-sysfs של הפלטפורמה מאפשר להפעיל ולהשבית את לוח ה-LCD, את התאורה האחורית ואת המסך המגע, אפשר להשתמש בקובץ כדי לבצע מדידות כשהמסך מופעל וכשהוא כבוי. אחרת, מגדירים wakelock חלקי כדי שהמערכת לא תעבור למצב השהיה, ואז מפעילים ומכבים את המסך באמצעות לחצן ההפעלה.
מדידת עוצמת ה-Wi-Fi
מבצעים מדידות Wi-Fi ברשת שקטה יחסית. להימנע מיצירת עומס נוסף על ידי עיבוד נפח גדול של תנועה בשידור חי שלא קשור לפעילות שנמדדת.
הערך wifi.on
מודד את צריכת האנרגיה כשה-Wi-Fi מופעל אבל לא משדר או מקבל באופן פעיל. המדד הזה נמדד לרוב כהפרש בין צריכת החשמל במצב השהיה (שינה) של המערכת כש-Wi-Fi מופעל לעומת מצב שבו הוא מושבת.
הערך wifi.scan
מודד את צריכת האנרגיה במהלך סריקת Wi-Fi לאיתור נקודות גישה. אפליקציות יכולות להפעיל סריקות Wi-Fi באמצעות
startScan()
API של הכיתה WifiManager. אפשר גם לפתוח את 'הגדרות' > 'Wi-Fi'. במצב הזה מתבצעים סריקות של נקודות גישה כל כמה שניות, עם קפיצה לכאורה בצריכת החשמל, אבל צריך לנכות מהמדידות האלה את צריכת החשמל של המסך.
הערה: כדי ליצור תעבורת נתונים נכנסת ויוצאת ברשת, צריך להשתמש בהגדרה מבוקרת (כמו iperf).