Wie implementiert man am einfachsten in C++ eine Klasse welche EEprom
Endurance macht ohne richtig bloated zu sein ? Siehe unten.
Hier die etwas groessere Beschreibung, einfach runterscrollen zu
-----------------------------------------------------------------
Hallo, ich habe eine Applikation, einen Flowmeter welcher von einem
Generator die Kraftstoffmenge anzeigt und loggt. Der Code ist von
Internet runtergeladend und modifiziert, Flow Meter using 4-Digit
7-segment Display
von Circuits4you.com . Daten werden zusaetzlich ins EEprom geloggt, als
circular buffer und dabei muss der Index jedesmal geupdated werden.
Was ich habe,fuer den Index, also im Prinzip ein Write jede 2 Stunden.
1 | #define ENDURANCE_5m 24 #define ENDURANCE_20m 6 #define ENDURANCE_1h 2 #define ENDURANCE_1d 1 #define ENDURANCE_DATA 33 // total
|
Im Ram habe ich einen Log von 1 Minuten Inteval fuer eine Stunde und
danach 8 Stunden im 15 Minuten Interval.
Hingegen Im Eeprom:
4 Stunden im 5Minuten Interval, danach
20 Stunden im 20 Minuten Interval, danach
9 Tage im 1 Stunden Interval , danach
92 Tage im 24 Stunden Interval.
Zweck der Sache ist das Logging und optimierung des Verbrauchs eines
Generators zur Unterstuetzung einer Off-Grid Solaranlage.
Geloggt werden 16bit Variablen, Einheit ml , bzw ml/25 bei 24Stunden
Eintraegen, was 40ml gleichkommt, angezeigt wird lt/h im Display.
1 | ------------------------------------------------------------------
|
Zur Erklaerung,
ee(uint addr) sowie ee_(uint addr) sind einfach
~eeprom_read_byte((unsigned char*)addr); und ee_() ist das write,
bei leerem EEprom (0xff) wird 0 zurueckgeliefert. und ein 0 resultiert
in 0xff.
C code zu eeprom endurance:
1 | NOINLINE byte ee_idx_byte(word start, byte cnt) { // 0=illegal or unitialized byte i,t,ret; word j; ret=-1; for(i=0;i<cnt;i++) if(t=ee(start++)) ret=i; else break; return ret; } NOINLINE byte ee_get_byte(word start, byte cnt) { // 0=illegal or unitialized byte i; i=ee_idx_byte(start,cnt); if(i==-1) return ~0; cnt=ee(start+i); if(!cnt) cnt--; return ret; } NOINLINE void ee_set_byte(word start, byte cnt, byte val) { // 0=illegal !! byte i; word j,t,ret; i=ee_idx_byte(start,cnt); if(i==--cnt) for(i=cnt;i--;ee_(start+i,0)); ee_(start + ++i,val); }
|
Ich habe aehnlichen Code fuer 16bit variable.
Nun moechte ich in Arduino einfach eine Classe haben , wo ich sage
EE_Endurance_byte idx_5m(ENDURANCE_START,24);
und dann einfach idx_5m sowie idx_5m++ oder idx_5m=idx_5m+1 verwenden
kann,
ohne dass mir die Klasse zuviel Ram und Flash hernimmt, was fuer einen
Ansatz wuerdet ihr da nehmen oder koennt ihr mir Beispiele geben wie
dies einfach gemacht werden koennte. Ich habe RingEEprom angesehen, aber
das ist mir zuviel.
Danke im Voraus.