הספק של תת-מערכת ההתקן נמדד ונרשם לעתים קרובות בסביבת מעבדה עבור תנאי מצב יציב שונים, כגון כאשר המסך דולק, או שהמכשיר במצב הפעלה סרק. זה עובד עבור תת-מערכות עם צריכת חשמל קבועה, או בתנאים הנמדדים בקלות בסביבות מעבדה, אך לא עבור מקרי שימוש מסוימים, כגון כאשר מסך מציג סרטון.
IPower.hal 1.0
מספק ממשק להעברת רמזי כוח ודיווח על נתונים מצטברים על מדדי מצב שינה של תת-מערכת. באנדרואיד 10 ומעלה, הפונקציה המצטברת של דיווח סטטיסטיקה נמצאת בממשקי ה-API של IPowerStats.hal
power-stat, ומספקת דרך לאחזר נתוני שימוש באנרגיה במכשיר. זה מחליף את החלק המצטבר של איסוף הנתונים הסטטיסטיים של ממשק IPower.hal
, להפרדה ברורה יותר של פונקציונליות.
קריאות השירות של IPowerStats
אינן תקופתיות. הם מתרחשים ברגעי מפתח, כגון כאשר יש ירידה של 1% בסוללה. קריאות הן פחות תכופות כאשר הסוללה מתרוקנת, ותכופות יותר כאשר היא גבוהה. הנתונים עשויים להישלח בחזרה לשרתים, ועשויים לשמש בדוחות באגים לצורך ניתוח ובדיקה. זה תומך במאמצים מתמשכים להפחית את צריכת החשמל ולהגדיל את חיי הסוללה.
IPower.hal ו- IPowerStats.hal
גם ממשק IPower.hal
וגם ממשק IPowerStats.hal
זמינים ב-Android 10, אך פונקציונליות איסוף הנתונים הסטטיסטיים IPower.hal
זמינה רק מממשק IPowerStats.hal
. הפונקציונליות של IPowerStats.hal
כוללת ממשקי API לרכישה ושימוש בנתונים שנאספו ממדידות הספק במכשיר עבור מכשירים נתמכים:
- מבצע מדידות אנרגיה ברמת הרכבת הן עבור לקוחות בתדר נמוך (
getRailInfo
) והן עבור לקוחות בתדר גבוה (streamEnergyData
), ומדווח על אנרגיה שנצברה מאז האתחול. - מדווח על מידע הקשור לכל
PowerEntity
נתמך שעבורו נתונים זמינים.PowerEntity
הוא תת-מערכת של פלטפורמה, תחום היקפי או כוח המשפיע על צריכת החשמל הכוללת של המכשיר. - מדווח על קבוצת מצבי ישות כוח (
getPowerEntityStateInfo
) שעבורם הישויות שצוינו מספקות נתוני תושבות, ולאחר מכן מדווח על הנתונים המצטברים עבור כלPowerEntity
שצוין.
ממשקי ה-API של IPowerStats.hal
משמשים את הלקוחות הבאים:
-
Statsd
, כדי לאסוף מדדי צריכת חשמל לכל רכבת. -
Perfetto
, כדי לתאם את צריכת החשמל עם פעילות המעבד. -
Batterystats
, לשיפור ייחוס הסוללה על ידי שימוש בנתונים נמדדים במקום הערכת צריכת הסוללה מתוך קבועים מוגדרים מראש ב-power_profile.xml.
עם אנדרואיד 10 ומעלה, יצרן מכשיר רשאי לבחור בין הפונקציות IPower.hal
לפונקציות IPowerStats.hal
, אך כל הלקוחות חייבים לחזור ל- IPower.hal
אם IPowerStats.hal
אינו מיושם.
אפשרויות הטמעה של IPowerStats.hal
רק הפונקציות של IPower.hal
זמינות באנדרואיד 7 עד אנדרואיד 9. מכשירים ששודרגו לאנדרואיד 10 חייבים להיות בעלי תת-מערכת לניטור כוח חומרה, או אמצעים אחרים זמינים לניטור ורישום סטטיסטיקות הספק. חלק מה-SoCs אוספים עבורך נתונים סטטיסטיים של צריכת חשמל, או שאתה עשוי לקבל מידע על תושבות המדינה של ישות כוח באמצעות תוכנה. חומרה לניטור כוח נחוצה רק כדי לתמוך ב- getRailInfo()
, getEnergyData()
ו- streamEnergyData()
.
אם אתה מיישם IPowerStats.hal
ללא חומרה לניטור כוח, getRailInfo(), getEnergyData()
ו- streamEnergyData()
יחזירו NOT_SUPPORTED
. באופן דומה, getPowerEntityInfo(), getPowerEntityStateInfo()
ו- getPowerEntityStateResidencyData()
עשויים גם להחזיר NOT_SUPPORTED
אם זה לא מיועד לשימוש.
דוגמאות לנתונים המוחזרים על ידי ממשקי API לניטור מסילות כוללות
- מסילת החשמל לתצוגה צרכה X µW.
- מסילת החשמל של המודם צרכה Y µW.
דוגמאות לנתונים המוחזרים על ידי ממשקי API של מצב שינה של תת-המערכת כוללות
- המודם היה רדום X MS.
- ה-SoC היה במצב קריסת כוח עבור Y ms.
- ה-GPU היה במצב השעיה עבור Z ms.
השתמש בתת-מערכת לניטור כוח חומרה
אם לתכנון המכשיר שלך יש תת-מערכת לניטור כוח חומרה, יישם את IPowerStats.hal
על ידי יצירת צומת sysfs יחיד שממנו PowerStats.hal
יכול לנתח נתונים, או על ידי ביצוע אוסף של קריאות מערכת מסוג ioctl .
עליך ליישם את מנהל ההתקן של הליבה שלך באופן שמונע הצפת מצבר. האלגוריתם שבו נעשה שימוש תלוי בתכנון תת-מערכת ניטור הספק החומרה הייחודי שלך, אשר חייב לספק מדידות מתח וזרם באפיק מיידי וממוצע. מנהל ההתקן של הליבה חייב ללכוד נתונים אלה באופן שאינו מנקה את מצברי האנרגיה, והוא חייב לשמור על נתוני האנרגיה המצטברים עבור כל תת-מסילה מאז האתחול, בצורה של משתנה של 64 סיביות שמתגבר עם קריאת האנרגיה מ כל שאילתת מצבר.
נתונים סטטיסטיים עבור רכיב נתון (או אופציונלי, רכיבים מרובים) חייבים להיות בצומת בודד. אמנם זה לא שימוש קונבנציונלי ב- sysfs (שבדרך כלל מגביל כל צומת לערך בודד), זה מבטיח שכל הנתונים יהיו עקביים.
הנחיית עיצוב
- שמור על זמן אחזור נמוך (1 msec, מקסימום) בעת קריאה מצומת sysfs או ביצוע שיחות מערכת.
- ודא שהפונקציונליות התומכת בסטטיסטיקה אינה מגדילה באופן מדיד את צריכת החשמל:
- אל תגדיל את נקודות הגישה (AP) ו/או את ההתעוררות של תת-מערכת כדי לעקוב אחר פרמטרים כגון זמן השהייה במצב שינה.
- העבר נתונים סטטיסטיים בין מעבד היישומים לקושחה בצורה אופורטוניסטית עם תעבורה אחרת במידת האפשר.
- במידת הצורך, תת-המערכת עשויה להשתמש בפונקציות מנהל ההתקן הבאות:
- שמירה פנימית של נתונים במטמון כדי להימנע מהשהייה/התעוררות על חשבון נתונים מעט מיושנים.
- ביצוע אקסטרפולציה כאשר תת המערכת ישנה, כדי לספק זמן שינה מעודכן מבלי להעיר את תת המערכת.
בחר רכיבים, מערכות משנה וסטטיסטיקות
בעת בחירה מאילו רכיבים או תת-מערכות לאסוף נתוני IPowerStats.hal
, בחר כל דבר במכשיר שצורך זרם משמעותי (5 mA או יותר), או שתומך במספר מצבי צריכת חשמל, כגון:
- תת-מערכות SoC בודדות.
- תת-מערכות מחוץ ל-SoC באופן חלקי או מלא, כגון WiFi, מעבד התמונה או מעבד האבטחה.
- ציוד היקפי כגון נוריות LED ומצלמות בעוצמה גבוהה.
- תחומי כוח המשתמשים במצבים שונים (כגון תחום הכוח עבור ה-SoC בכללותו).
התאמה אישית
תכונה אופציונלית זו ניתנת להתאמה אישית. עצב מקרי שימוש והתאם אישית את השימוש שלך:
- החליטו אילו מסילות למדוד, ובאיזו תדירות למדוד אותן.
- החליטו מתי לקרוא את הנתונים, וכיצד לפרש אותם.
- החלט איזו פעולה לנקוט ומתי לנקוט אותה, על סמך הנתונים שלך.
מַתַן תוֹקֵף
בדיקות VTS מבטיחות שדרישות אנדרואיד מתקיימות. ההערות ב- IPowerStats.hal
משמשות לאימות שמכשיר תואם.
לדוגמה, אם אתה קורא ל- getRailInfo()
והוא לא מחזיר דבר, בדיקת VTS נכשלת, מכיוון שלא קיבלת מידע על המסילות המנוטרות, או סטטוס שהוחזר של SUCCESS
. באופן דומה, אם קיבלת מידע על רכבת, אבל הוא מלווה בתגובה NON_SUPPORTED
או FILE_SYSTEM_ERROR
, זה גם כשל. ה-VTS מוודא שהמפרט של יצרן המכשיר נמצא בקובץ HAL, תוך שימוש בדרישות בהערות IPower.hal ו- IPowerStats.hal. דוגמה להערות המשמשות בבדיקת VTS מוצגת להלן:
/** * Rail information: * Reports information related to the rails being monitored. * * @return rails Information about monitored rails. * @return status SUCCESS on success or NOT_SUPPORTED if * feature is not enabled or FILESYSTEM_ERROR on filesystem nodes * access error. */ getRailInfo() generates(vec<e;RailInfo>e; rails, Status status);