ขณะนี้ฉันกำลังพัฒนาระบบ LCD กราฟิกเพื่อแสดงอุณหภูมิการไหลแรงดันไฟฟ้าพลังงานและพลังงานในระบบปั๊มความร้อน การใช้กราฟิก LCD หมายความว่าครึ่งหนึ่งของ SRAM ของฉันและประมาณ 75% ของแฟลชของฉันถูกใช้จนหมดโดยบัฟเฟอร์หน้าจอและสตริง
ขณะนี้ฉันกำลังแสดงตัวเลขพลังงานต่ำสุด / เฉลี่ย / เฉลี่ยเวลาเที่ยงคืนเมื่อรูปประจำวันรีเซ็ตระบบจะตรวจสอบว่าปริมาณการใช้พลังงานสำหรับวันนั้นสูงกว่าหรือต่ำกว่าค่าต่ำสุดหรือค่าต่ำสุดก่อนหน้านี้และเก็บค่าไว้ ค่าเฉลี่ยจะคำนวณโดยหารปริมาณการใช้พลังงานสะสมด้วยจำนวนวัน
ฉันต้องการแสดงค่าเฉลี่ยรายวันในสัปดาห์ที่แล้วและเดือนที่แล้ว (4 สัปดาห์สำหรับความเรียบง่าย) เช่นค่าเฉลี่ยเคลื่อนที่ ขณะนี้สิ่งนี้เกี่ยวข้องกับการบำรุงรักษาอาร์เรย์ของค่าในช่วง 28 วันที่ผ่านมาและการคำนวณค่าเฉลี่ยของทั้งอาร์เรย์สำหรับรายเดือนและ 7 วันล่าสุดสำหรับรายสัปดาห์
ตอนแรกฉันทำสิ่งนี้โดยใช้อาร์เรย์ลอย (เนื่องจากพลังงานอยู่ในรูปแบบ "12.12kWh") แต่ใช้ 28 * 4 ไบต์ = 112 ไบต์ (5.4% ของ SRAM) ฉันไม่รังเกียจที่จะมีเพียงจุดทศนิยมเดียวของความละเอียดดังนั้นฉันจึงเปลี่ยนเป็นการใช้ uint16_t และคูณตัวเลขด้วย 100 ซึ่งหมายความว่า 12.12 แทนด้วย 1212 และฉันหารด้วย 100 เพื่อการแสดงผล
ขนาดของอาร์เรย์ลดลงเหลือ 56 ไบต์ (ดีกว่ามาก!)
ไม่มีวิธีการเล็กน้อยเพื่อลดรูปลงเป็น uint8_t ที่ฉันเห็น ฉันสามารถทนต่อการสูญเสียตำแหน่งทศนิยม ("12.1kWh" แทนที่จะเป็น "12.12kWh") แต่การบริโภคมักจะสูงกว่า 25.5kWh (255 เป็นค่าสูงสุดที่แสดงด้วยเลขจำนวนเต็ม 8 บิตที่ไม่ได้ลงนาม) การบริโภคไม่เคยต่ำกว่า 10.0kWh หรือสูงกว่า 35.0kWh ดังนั้นฉันอาจลบ 10 จากตัวเลขที่เก็บไว้ แต่ฉันรู้ว่าวันหนึ่งเราจะเกินขีด จำกัด เหล่านี้
ฉันทดสอบโค้ดเพื่อแพ็คค่า 9 บิตลงในอาร์เรย์ ซึ่งจะให้ช่วง 0-51.2kWh และใช้ทั้งหมด 32 ไบต์ อย่างไรก็ตามการเข้าถึงอาเรย์แบบนี้ค่อนข้างช้าโดยเฉพาะเมื่อคุณต้องวนซ้ำค่าทั้งหมดเพื่อคำนวณค่าเฉลี่ย
ดังนั้นคำถามของฉันคือ - มีวิธีที่มีประสิทธิภาพมากขึ้นในการคำนวณค่าเฉลี่ยเคลื่อนที่ด้วยสามหน้าต่าง - อายุการใช้งาน 28 วันและ 7 วัน? ประสิทธิภาพหมายถึงมีขนาดเล็กลงในแง่ของการใช้ SRAM แต่ไม่มีโทษของรหัสขนาดใหญ่ ฉันจะหลีกเลี่ยงการเก็บค่าทั้งหมดได้หรือไม่?