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
Gast
#366837
> Das Schlüsselwort "extern" hat vor einer > Funktionsdefinition nichts verloren Ist aber auch nicht 'schädlich', nur überflüssig.
Gast
#366838
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.
was ist denn mit union? Müsste man doch hier auch gut verwenden können.
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
Gast
#366841
Hi, eine andere Moeglichkeit waere ein struct + union. Gruß, Dirk
Sorry, aber was bitte passt euch an Rufus Lösung nicht? Was mag euch das Schlüsselwort 'union' in seinem Codeschnippsel wohl sagen? ;-)
Uppes, ganz übersehen unauffällig hust