mikrocontroller.net

Forum: Compiler & IDEs Zeiger Umwandlung


Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich muss relativ zeitkritisch 240Bit hintereinander einlesen. So mache
ich es zurzeit:
Mit malloc 240Bit vom Type bool reservieren. Die Bit's hintereinander
in den Speicher schreiben. Danach habe ich etwas Zeit zum verarbeiten.

Ich habe jetzt 240 einzelne Bits, nur brauche ich eigentlich Word und
Byte lange Datenwörter.

Kann ich einen Byte-Pointer z.B. gleich der Startadresse des
Datenfeldes setzen und dann auf die ersten 8Bit per Byte zugreifen?

Wie gruppiere ich meine Bit's ohne sie z.B. per while() in ein Byte zu
schreiben?

Gibt es vielleicht eine viel schönere Lösung?

cu, Felix

(WinAVR Atmel16)

Autor: Nico S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Öhm.. Jetzt mal nur ne Idee:
bool *Daten = malloc(240*sizeof(bool));
char *Bytedings;
Bytedings = (char*) Daten;
Zugriff dann mit Bytedings[0], Bytedings[1], Bytedings[2] usw.

Autor: Nico S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

mit
  Daten[0]  greifst du auf das erste Bit zu, mit
  Daten[1]  auf das zweite, etc.

Mit
  Bytedings[0]  greifst du auf den ersten 8-bittingen Block zu, mit
  Bytedings[1]  auf den zweiten, etc.

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genauso wollte ich es machen, aber irgendwie stehten in Bytedings[0]
nicht die ersten 8 Bits.

Meine Syntax ist allerdings etwas anders.

Bytedings[1] wär bei mir *(Bytedings+1)

Aber daran dürfte es doch nicht liegen???

Autor: Nico S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was steht denn da? Was soll da stehen? Bitte mal posten.

Die Syntax ist soweit äquivalent.

Autor: Besserwisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anstatt
char *Bytedings; könnte es auch
unsigned char *Bytedings; heißen!!

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

Bewertung
0 lesenswert
nicht lesenswert
Der Datentyp "bool" ist nicht ein Bit, sondern in der Regel äquivalent
zu int, also je nach Prozessor 16 oder 32 Bit groß.

Daher kann das oben aufgeführte Typecasting nicht funktionieren.

C unterstützt keine Bit-Datentypen, zwar gibt es Bitfelder, auf die
aber kann nicht mit Arrayoperatoren zugegriffen werden.

Beispiel:

  union
  {
    struct
    {
      unsigned char bit0 : 1;
      unsigned char bit1 : 1;
      unsigned char bit2 : 1;
      unsigned char bit3 : 1;
      unsigned char bit4 : 1;
      unsigned char bit5 : 1;
      unsigned char bit6 : 1;
      unsigned char bit7 : 1;
    } bitfeld;
    unsigned char zeichen;
  } bla;

Hier kann mit

  bla.bitfeld.bit0 = 0;

ein einzelnes Bit manipuliert werden, und mit

  bla.zeichen = 0;

auf -in diesem Falle- alle 8 Bits simultan zugegriffen werden.

Es gibt aber keinen Arrayoperator für Bitfelder, so daß die von Felix
erwähnte Einleseroutine die einzelnen Bits nicht einfach in ein Array
eintragen kann.

Stattdessen müsste entweder mit solchen Bitfeldern wie in meinem
Beispiel gearbeitet werden, was reichlich umständlich ist, oder aber
die Bits werden von vornherein mit entsprechenden Bitoperationen in
ganze Bytes eingetragen:


  unsigned char Wert;
  int i;

  Wert = 0;

  for (i = 0; i < 8; i++)
    Wert |= LeseEingang() << i;

Hier wird vorausgesetzt, daß die Funktion LeseEingang 0 oder 1
liefert.

Das muss bei größeren Bitanzahlen entsprechend adaptiert werden.

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Nico: Ich deute "Was steht da" mal so :)
Die ersten 8Bit 0b11000000(steht auch wirklich im Speicher) -> 0xC0
bekommen habe ich aber 0xD9 was ich als Zeiger ins Nirgendwo gedeutet
habe.


@Besserwisser: bei mir heißt es uint8_t

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
for (i = 0; i < 8; i++)
    Wert |= LeseEingang() << i;

ist das nicht relativ langsam? Ich müsste dann ja noch die Wert'e
hochzählen.

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
äh, also wenn bool=int ist, dann würde das nicht in den Speicher
passen.

240x8Bit = 1920Bit der Atmel hat aber nur 1k RAM, den Speicher bekomme
ich aber.

Oder verpeile ich das jetzt?

Autor: Besserwisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
printf("%i",strlen(bool));

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"ich muss relativ zeitkritisch 240Bit hintereinander einlesen."


Bitstrukturen sind in der Regel sehr ineffizient programmiert.


Wenns wirklich schnell sein soll, dann je 8 Bit seriell in ein Byte
reinschieben, das Byte in einem Byte-Array abspeichern und den Zeiger
aufs Array um 1 hochzählen usw. Also quasi SPI in Software.


Peter

Autor: Karsten Brandt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Besserwisser:

Du meinst sicherlich

printf("%i", *sizeof*(bool)); ;-)

Mit strlen kannst Du nur die Länge eines NULL-terminierten Strings
ermitteln.

Karsten

Autor: Besserwisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar, die Hitze ließ mein Hirn verdunsten.

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein paar Poster wissen es bereits, aber der Rückgabetyp von sizeof ist
eine Ganzzahl in Bytes.... ;-)

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.