Forum: Compiler & IDEs Hilfe beim Bytepuzzle


von Bjoern B. (tishima)


Lesenswert?

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);
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Bjoern B. (tishima)


Lesenswert?

Jo, Danke!

Laeuft nun schnall genug.......

und mit dem extern nehm ich mir zu Herzen.

mfg,
Bjoern

von Besserwiss (Gast)


Lesenswert?

> Das Schlüsselwort "extern" hat vor einer
> Funktionsdefinition nichts verloren

Ist aber auch nicht 'schädlich', nur überflüssig.

von Die meisten Elche (Gast)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

was ist denn mit union? Müsste man doch hier auch gut verwenden können.

von Volkmar e. P. (keepitsimple)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

Hi,

eine andere Moeglichkeit waere ein struct + union.

Gruß,

Dirk

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Sorry, aber was bitte passt euch an Rufus Lösung nicht?
Was mag euch das Schlüsselwort 'union' in seinem Codeschnippsel wohl
sagen? ;-)

von Simon K. (simon) Benutzerseite


Lesenswert?

Uppes, ganz übersehen unauffällig hust

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
Noch kein Account? Hier anmelden.