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.