Hallo!
Hab folgende Routine programmiert und braeuchte mal ein Tip, wie ich
das optimieren kann.....
Gibt es ne elegantere Lösung wie ich die einzelnen Byte's optimaler
zum DWORD zusammpuzzeln kann. braeuchte nen Geschwindigkeitszuwachs von
x2
mfg,
Bjoern
extern uint32_t counter_Read_DWord (void)
//######################################################################
######
{
static uint32_t temp=0;
unsigned char Data0=0;
unsigned char Data1=0;
unsigned char Data2=0;
unsigned char Data3=0;
// Counter in schieberegister uebertragen
CPLD_load_set();
CPLD_clock_set();
nop();
CPLD_clock_reset();
CPLD_load_reset();
Data0=read_spi();
Data1=read_spi();
Data2=read_spi();
Data3=read_spi();
temp=Data3;
temp=temp<<8;
temp|=Data2;
temp=temp<<8;
temp|=Data1;
temp=temp<<8;
temp|=Data0;
return (temp);
}
Ja:
uint32_t counter_read_dword(void)
{
union
{
uint32_t ui32;
uint8_t ui8[4];
} temp;
// ... anderes Geraffel
for (i = 0; i < 4; i++)
temp.ui8[i] = read_spi();
return (temp.ui32);
}
Gegebenenfalls ist die Reihenfolge der einzelnen Bytes zu vertauschen.
Nebenbei: Das Schlüsselwort "extern" hat vor einer
Funktionsdefinition nichts verloren und ist bei einer
Funktionsdeklaration (Prototyp) implizit.
Jo, Danke! Laeuft nun schnall genug....... und mit dem extern nehm ich mir zu Herzen. mfg, Bjoern
> Das Schlüsselwort "extern" hat vor einer > Funktionsdefinition nichts verloren Ist aber auch nicht 'schädlich', nur überflüssig.
Naja. Vor einer Funktionsdeklaration hätte "extern" ja noch fast einen Sinn, nur ist sowas ja eh schon explizit. Bei einer Definition sagt es eigentlich dem Compiler, daß da gar kein Funktionsrumpf folgen müsste ... glücklicherweise wird das vom Compiler ignoriert.
Hi,
ein weiterer Vorschlag für Deine Routine. Die Lösung von Rufus habe ich
auch öfters benutzt, nur verbraucht sie viele Bytes. Wenn es eng im
Flash wird geht auch folgende Routine. Ob sie schneller ist habe ich
noch nie ausprobier.
uint32_t counter_read_dword(void)
{
uint32_t ui32;
uint8_t *ptr;
ptr = (uint32_t *) &ui32;
//-- hier entsprechend die bytereihenfolge anpassen
//-- big endian bzw. little endian
ptr[ 0 ] = read_spi();
ptr[ 1 ] = read_spi();
ptr[ 2 ] = read_spi();
ptr[ 3 ] = read_spi();
return( ui32 );
}
Gruß
Volkmar
Sorry, aber was bitte passt euch an Rufus Lösung nicht? Was mag euch das Schlüsselwort 'union' in seinem Codeschnippsel wohl sagen? ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.