Zitat von
MisterMou
Gibt es da wieder Tricks die ich noch nicht kenne um die printInt() zu beschleunigen?
Der "Trick" nennt sich "effektiverer Code"
Warum glaubst Du besser als itoa() zu sein ? Noch dazu Du umständlich programmierst. Hast ja bemerkt dass Divisionen "teuer" sind, für Multiplikationen gibt's in manchen AVR's Unterstützung durch den MUL Opcode, Divisionen müssen immer per Code gemacht werden.
Hier führst Du gleich 2 Divisionen durch, wovon Du eine hättest sparen können.
Code:
num-=num%10;
num/=10;
Ein Modulo 10 enthält die gleiche Division wie num/=10, die Multiplikation und Differenzbildung als Modulo zu Fuß wär' wahrscheinlich billiger gewesen.
Dein Code benötigt so ganze 2570 Takte mit printInt(0,0,6,29999).
Code:
void printInt(unsigned char xPos, unsigned char yPos, unsigned char length, int num){
char buff[7];
unsigned char slen;
unsigned char spccnt = 0;
itoa(num, buff, 10);
slen = strlen(buff);
if (slen < length) {
spccnt = length - slen;
memset((void*)&text[yPos][xPos], ' ', spccnt);
xPos += spccnt;
length -= spccnt;
}
memcpy((void*)&text[yPos][xPos], (void*)&buff, length);
}
printInt(0,0,6,29999);
Braucht noch 1370.
Code:
const int idiv[6] PROGMEM = {0, 1, 10, 100, 1000, 10000};
void printInt(unsigned char xPos, unsigned char yPos, unsigned char length, int num){
unsigned int idx = 5;
char lz = 1;
char prlz;
char chval;
char isminus = 0;
unsigned char *txtptr = &text[yPos][xPos];
if (num < 0) {
num = 0 - num;
length--;
isminus = 1;
}
else
*txtptr++ = ' ';
while ((idx) && (length--)) {
chval = '0';
prlz = lz;
while (num >= pgm_read_word(&(idiv[idx]))) {
num -= pgm_read_word(&(idiv[idx]));
chval++;
lz = 0;
}
if ((prlz != lz) && (isminus)) {
prlz = lz;
*txtptr++ = '-';
}
idx--;
if ((lz) && (idx)) chval = ' ';
*txtptr++ = chval;
}
}
printInt(0,0,6,29999);
Der noch 540.
Das einzig Lästige dabei ist, durch das Alignement des Fonts kommt const int idiv[6] PROGMEM auf $D00 zu liegen, der Compiler aligned für den darauffolgenden Code nochmals und verhaut damit knapp 240 Bytes Flash, aus der .map-Datei:
Code:
0x00000d00 idiv
0x00000e00 . = ALIGN (0x2)
Lesezeichen