Hilfe beim Bytepuzzle

OP #366834
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);
}
Persönliche Seite #366835
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.
Gast #366838
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.
#366840
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.