mikrocontroller.net

Forum: Compiler & IDEs Hilfe beim Bytepuzzle


Autor: Bjoern Buettner (tishima)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bjoern Buettner (tishima)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo, Danke!

Laeuft nun schnall genug.......

und mit dem extern nehm ich mir zu Herzen.

mfg,
Bjoern

Autor: Besserwiss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das Schlüsselwort "extern" hat vor einer
> Funktionsdefinition nichts verloren

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

Autor: Die meisten Elche (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Volkmar e. P. (keepitsimple)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

eine andere Moeglichkeit waere ein struct + union.

Gruß,

Dirk

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uppes, ganz übersehen unauffällig hust

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.