현재 히트 펌프 시스템의 온도, 유량, 전압, 전력 및 에너지를 표시하는 그래픽 LCD 시스템을 개발 중입니다. 그래픽 LCD를 사용한다는 것은 SRAM의 절반과 플래시의 ~ 75 %가 화면 버퍼와 문자열에 의해 사용되었음을 의미합니다.
현재 에너지에 대한 최소 / 최대 / 평균 수치를 표시하고 있습니다. 일일 수치가 재설정되는 자정에 시스템은 하루의 소비량이 이전 최소값 또는 최대 값보다 높거나 낮은 지 확인하고 값을 저장합니다. 평균은 누적 에너지 소비를 일 수로 나누어 계산합니다.
지난 주와 월의 일일 평균 (간단 성을 위해 4 주), 즉 평균을 표시하고 싶습니다. 현재 여기에는 지난 28 일 동안의 값 배열을 유지하고 매월 및 매주 마지막 7 일 동안 전체 배열에 대한 평균을 계산하는 것이 포함됩니다.
처음에는 에너지가 "12.12kWh"형식이므로 플로트 배열을 사용하여이 작업을 수행했지만 28 * 4 바이트 = 112 바이트 (SRAM의 5.4 %)를 사용했습니다. 단 하나의 소수점 분해능 만 신경 쓰지 않으므로 uint16_t를 사용하고 그림에 100을 곱하는 것으로 변경되었습니다. 이는 12.12가 1212로 표시되고 표시 목적으로 100으로 나눕니다.
배열의 크기가 56 바이트로 줄었습니다 (훨씬 더 좋습니다!).
내가 볼 수있는 수치를 uint8_t로 줄이는 간단한 방법은 없습니다. 소수점 이하 자릿수 ( "12.12kWh"대신 "12.1kWh")의 손실을 허용 할 수 있지만 소비는 종종 25.5kWh (255는 8 비트 부호없는 정수로 표시되는 가장 높은 값)보다 높습니다. 소비량이 10.0kWh 이하 또는 35.0kWh 이상이었던 적이 없으므로 저장된 수치에서 10을 뺄 수 있지만 언젠가는 이러한 한계를 초과한다는 것을 알고 있습니다.
그런 다음 9 비트 값을 배열로 묶는 코드를 테스트했습니다. 이것은 0-51.2kWh의 범위를 제공하고 총 32 바이트를 사용합니다. 그러나 이와 같이 배열에 액세스하면 특히 평균을 계산하기 위해 모든 값을 반복해야 할 때 속도가 느립니다.
내 질문은-수명, 28 일 및 7 일 세 개의 창으로 이동 평균을 계산하는보다 효율적인 방법이 있습니까? 효율성은 SRAM 사용 측면에서 더 작지만 큰 코드를 사용하지 않는 것을 의미합니다. 모든 값을 저장하지 않아도 되나요?