สถิติพลังงานHAL

พลังงานของระบบย่อยของอุปกรณ์มักจะถูกวัดและบันทึกในสภาพแวดล้อมห้องปฏิบัติการสำหรับสภาวะคงที่ต่างๆ เช่น เมื่อหน้าจอเปิดอยู่ หรืออุปกรณ์อยู่ในสถานะพลังงานที่ไม่ได้ใช้งาน วิธีนี้ใช้ได้กับระบบย่อยที่มีการดึงพลังงานคงที่ หรือภายใต้สภาวะที่วัดได้ง่ายในสภาพแวดล้อมของห้องปฏิบัติการ แต่ไม่ใช่สำหรับการใช้งานบางกรณี เช่น เมื่อหน้าจอแสดงวิดีโอ

IPower.hal 1.0 จัดเตรียมอินเทอร์เฟซสำหรับการส่ง คำแนะนำด้านพลังงาน และการรายงานข้อมูลสะสมบนตัววัดสถานะสลีปของระบบย่อย ใน Android 10 และสูงกว่า ฟังก์ชันการรายงานสถิติสะสมจะอยู่ใน API การรวบรวมสถิติพลังงาน IPowerStats.hal และให้วิธีการดึงข้อมูลการใช้พลังงานบนอุปกรณ์ ซึ่งจะแทนที่ส่วนที่รวบรวมสถิติสะสมของอินเทอร์เฟซ 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 แต่ละรายการที่ระบุ

IPowerStats.hal APIs ถูกใช้โดยไคลเอ็นต์ต่อไปนี้:

  • Statsd เพื่อรวบรวมตัวชี้วัดการใช้พลังงานต่อราง
  • Perfetto เพื่อเชื่อมโยงการใช้พลังงานกับกิจกรรมของ CPU
  • Batterystats เพื่อปรับปรุงการระบุแหล่งที่มาของแบตเตอรี่โดยใช้ข้อมูลที่วัดได้ แทนที่จะประเมินการใช้แบตเตอรี่จากค่าคงที่ที่กำหนดไว้ล่วงหน้าใน power_profile.xml.

เมื่อใช้ Android 10 และสูงกว่า ผู้ผลิตอุปกรณ์อาจเลือกระหว่างฟังก์ชัน IPower.hal และ IPowerStats.hal แต่ไคลเอ็นต์ทั้งหมดจะต้องถอยกลับไปใช้ IPower.hal หากไม่ได้ใช้งาน IPowerStats.hal

อ็อพชันการใช้งาน IPowerStats.hal

เฉพาะฟังก์ชัน IPower.hal เท่านั้นที่มีให้ใช้งานบน Android 7 ถึง Android 9 อุปกรณ์ที่ได้รับการอัปเกรดเป็น Android 10 จะต้องมีระบบย่อยการตรวจสอบพลังงานด้วยฮาร์ดแวร์ หรือวิธีการอื่นที่พร้อมใช้งานเพื่อตรวจสอบและบันทึกสถิติพลังงาน SoC บางตัวรวบรวมสถิติการใช้พลังงานสำหรับคุณ หรือคุณอาจได้รับข้อมูลสถานะการอยู่อาศัยของเอนทิตีพลังงานผ่านซอฟต์แวร์ ฮาร์ดแวร์การตรวจสอบพลังงานจำเป็นต่อการสนับสนุน 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 มิลลิวินาที) เมื่ออ่านจากโหนด sysfs หรือทำการเรียกระบบ
  • ตรวจสอบให้แน่ใจว่าฟังก์ชันสถิติที่รองรับไม่ได้เพิ่มการระบายพลังงานอย่างวัดผลได้:
    • อย่าเพิ่มจุดเข้าใช้งาน (AP) และ/หรือการปลุกระบบย่อยเพื่อติดตามพารามิเตอร์ เช่น เวลาที่ใช้ในโหมดสลีป
    • ถ่ายโอนสถิติระหว่างตัวประมวลผลแอปและเฟิร์มแวร์ตามโอกาสกับการรับส่งข้อมูลอื่นๆ เมื่อเป็นไปได้
  • หากจำเป็น ระบบย่อยอาจใช้ฟังก์ชันไดรเวอร์ต่อไปนี้:
    • การแคชข้อมูลภายในเพื่อหลีกเลี่ยงเวลาแฝง/การปลุก โดยสูญเสียข้อมูลเก่าเล็กน้อย
    • ดำเนินการคาดการณ์เมื่อระบบย่อยอยู่ในโหมดสลีป เพื่อจัดเตรียมเวลาพักเครื่องที่อัปเดตโดยไม่ต้องปลุกระบบย่อย

เลือกส่วนประกอบ ระบบย่อย และสถิติ

เมื่อเลือกส่วนประกอบหรือระบบย่อยที่จะรวบรวมข้อมูล IPowerStats.hal ให้เลือกสิ่งใดก็ได้บนอุปกรณ์ที่กินกระแสไฟจำนวนมาก (5 mA หรือมากกว่า) หรือที่รองรับโหมดการสิ้นเปลืองพลังงานหลายโหมด เช่นต่อไปนี้:

  • ระบบย่อย SoC ส่วนบุคคล
  • ระบบย่อยบางส่วนหรือทั้งหมดอยู่นอก SoC เช่น WiFi ตัวประมวลผลภาพ หรือตัวประมวลผลความปลอดภัย
  • อุปกรณ์ต่อพ่วง เช่น LED และกล้องกำลังแรงสูง
  • โดเมนพลังงานที่ใช้โหมดที่แตกต่างกัน (เช่น โดเมนพลังงานสำหรับ SoC โดยรวม)

การปรับแต่ง

คุณสมบัติเสริมนี้สามารถปรับแต่งได้ ออกแบบกรณีการใช้งานและปรับแต่งการใช้งานของคุณ:

  • ตัดสินใจว่าจะวัดรางไหน และจะวัดบ่อยแค่ไหน
  • ตัดสินใจว่าจะอ่านข้อมูลเมื่อใด และจะตีความข้อมูลอย่างไร
  • ตัดสินใจว่าจะดำเนินการใดและเมื่อใด โดยพิจารณาจากข้อมูลของคุณ

การตรวจสอบ

การทดสอบ VTS ช่วยให้มั่นใจว่าเป็นไปตามข้อกำหนดของ Android ความคิดเห็นใน 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);