So, nachdem ich gejoggt habe, gemütlich gebadet habe und der Kopf dadurch "freigeblassen" habe, habe ich eine Lösung gefunden. Jetzt bin ich bei 240µs anstatt 2.4 ms und habe auch noch knapp 400 Byte an Flash gespart, da kein abs und pow mehr gelinkt werden muss. Auch denke ich, das der Code einfacher ist. Wieviel der "einfachere" Code, oder besser kleinere Kode ausmacht, und wieviel abs, hab ich nicht gemessen.
Peters Hinweis hat mich in die richtige Richtung gelenkt. Es muss die Anzahl der Vergleiche und Abfragen reduziert werden. Wie hab ich das jetzt gemacht? Ich habe mich an qsort und co. erinnert. Binäre Suche [1]. Jetzt brauche ich nur noch log(n)/log(2) Anfragen. Entsprechend weniger memcpy_P und kein abs/pow mehr. Bei meinem 22 Samples brauche ich also nur noch 4.45 Abfragen. Sprich entweder 4 oder 5. Je nach dem wo der Eintrag liegt. Vorher war die Laufzeit O(n) anstatt O(log n).
Hier der Code:
Nochmals danke für den "Stuppser"Code:118 // binary search without recursion 119 unsigned char st = 0; 120 unsigned char en; 121 unsigned char m; 122 switch (s) 123 { 124 case kt81_210: en = sizeof(t_kt81_210)/sizeof(sensorvalues_flash)-2; break; // -2: because start = 0 and endline is a 0/0 which we dont need 125 case kt81_110: en = sizeof(t_kt81_110)/sizeof(sensorvalues_flash)-2; break; 126 default: 127 return 0.0; 128 } 129 130 sensorvalues_flash tmp; 131 while (en-st>1) 132 { 133 m = st + (en-st)/2; 134 memcpy_P(&tmp, ¤t[m], sizeof(sensorvalues_flash)); t1 = tmp; 135 if (r > t1.r) // if we use at sometime a NTC, we need to adjust this 136 { 137 // right side 138 st = m; 139 } 140 else 141 { 142 // left side 143 en = m; 144 } 145 } 146 147 // read the best matching lines 148 memcpy_P(&tmp, ¤t[st+0], sizeof(sensorvalues_flash)); t1 = tmp; 149 memcpy_P(&tmp, ¤t[st+1], sizeof(sensorvalues_flash)); t2 = tmp; 150 151 // interpolate 152 float dr = t2.r-t1.r; 153 154 float f = (r-t1.r)/dr; 155 return t1.t+(t2.t-t1.t)*f;
@Besserwessi: Klar, ich habe eine Scheduler drin, der die Takte verteilt. Erst lauft die Konvertierung über den SPI (in mehreren Zyklen), dann die Umwandlung im letzten. Hier wird diese Funktion aufgerufen.
[1] http://de.wikipedia.org/wiki/Bin%C3%A4re_Suche







Zitieren

Lesezeichen