volatile en optimalisatie maken weinig verschil. De omvang van de code verandert wel iets maar in de snelheid is daar weinig van terug te vinden.
En als je de assembly bekijkt dan wordt er toch echt met floats gerekend:
code:
DisplayValue = AdcValue * Gain + Offset;
1e6: 69 a5 ldd r22, Y+41 ; 0x29
1e8: 7a a5 ldd r23, Y+42 ; 0x2a
1ea: 8b a5 ldd r24, Y+43 ; 0x2b
1ec: 9c a5 ldd r25, Y+44 ; 0x2c
1ee: 29 8d ldd r18, Y+25 ; 0x19
1f0: 3a 8d ldd r19, Y+26 ; 0x1a
1f2: 4b 8d ldd r20, Y+27 ; 0x1b
1f4: 5c 8d ldd r21, Y+28 ; 0x1c
1f6: cd 88 ldd r12, Y+21 ; 0x15
1f8: de 88 ldd r13, Y+22 ; 0x16
1fa: ef 88 ldd r14, Y+23 ; 0x17
1fc: f8 8c ldd r15, Y+24 ; 0x18
1fe: 8b d1 rcall .+790 ; 0x516 <__mulsf3>
200: a7 01 movw r20, r14
202: 96 01 movw r18, r12
204: 43 d0 rcall .+134 ; 0x28c <__addsf3>
206: 6d a3 std Y+37, r22 ; 0x25
208: 7e a3 std Y+38, r23 ; 0x26
20a: 8f a3 std Y+39, r24 ; 0x27
20c: 98 a7 std Y+40, r25 ; 0x28
Alleen 'systeemeigen' variabelen? Dan kun je niet veel meer doen. Een long int of een uint16_t zijn net zo min systeemeigen als een float.
Volgens mij is er ook niks mis met het gebruik van library funkties. Voor de integer versie had ik ook een library funktie gebruikt voor de conversie (ltoa()).
Maar als je geen library wilt gebruiken, dan kun je ook voor floats een eigen funktie schrijven. Bijvoorbeeld zo:
code:
void ftoa(float x, char *pBuffer, int NrDigits)
{
x = x / 10000.; //< Max x = 9999.
for(int i = 0; ; i++)
{
if(i < NrDigits)
{ uint8_t c;
x *= 10;
c = x;
x -= c;
pBuffer[i] = '0' + c;
}
else
{ pBuffer[i] = 0;
break;
}
}
}
Edit:
Die funktie heeft ook zijn beperkingen natuurlijk. Werkt alleen voor positieve getallen kleiner dan 10000.0 bijvoorbeeld. Maar is wel efficient in code. Als ik deze funktie gebruik ipv dtostrf(), dan is het hele programma niet groter dan 0x6F2 (1778) bytes.