mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Bitbefehle auf das RAM anwenden?


Autor: Be Mi (bemi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Macht es Sinn beim ATmega für boolsche Variablen/Flags einzelne Bits zu 
verwenden?

Also:
UART0_RxStatus |= (1<<UART0_RXSTATUS_ESCAPESEQENCE);

UART0__RxStatus ist als unsigned char definiert.

Oder macht es mehr Sinn für boolsche Variablen/Flags jeweils ganze Bytes 
zu verwenden?
UART0_RxStatus_ESCAPESEQ = 1;

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommt drauf an. Bits sparen RAM, kosten aber ein wenig mehr FLASH und 
CU-Zeit. Bytes brauchen mehr RAM, sind aber schneller und brauchen 
weniger FLASH.

MFG
Falk

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt noch eine dritte Variante. Wenn Platz sowohl in RAM wie in ROM 
kritisch sind, kann man 24 Bits in den 3 frei verwendbaren 
bitadressierbaren I/O-Registern GPIOR0-2 unterbringen, die genau deshalb 
in der aktuellen AVR-Generation vorhanden sind (in 
Tiny2313,Mega88,Mega164 drin, nicht aber in Mega8,Mega16).

Einen weiteren Charme entwickeln diese Bits, weil sie mit den 
I/O-Bitbefehlen ohne Abschaltung der Interrupts atomar manipulierbar 
sind. Was bei Variablen im RAM nicht der Fall ist.

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Kommt drauf an. Bits sparen RAM, kosten aber ein wenig mehr FLASH und
>>CU-Zeit. Bytes brauchen mehr RAM, sind aber schneller und brauchen
>>weniger FLASH.

Das stimmt für Compiler/Hichsprachen, aber nicht allgemeingültig.
Wenn man in reinem ASM arbeitet ist die bitweise Nutzung von Flags die 
schnellste und GLEICHZEITIG codesparendste Variante, jedenfalls beim 
AVR, weil es dafür relativ ideale Opcodes gibt. Allerdings sollten diese 
Flags dann in Registern liegen, nicht im SRam.

Jochen Müller

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn man in reinem ASM arbeitet ist die bitweise Nutzung von Flags die
> schnellste und GLEICHZEITIG codesparendste Variante
> Allerdings sollten diese Flags dann in Registern liegen...
Die sollten nicht nur, die müssen sogar. Denn soooo schön orthogonal ist 
der Befehlssatz vom AVR nun auch wieder nicht.


Ich habe mir angewöhnt, jeden Zustand auf 1 Byte (bei 8-Bittern) bzw. 
short (bei 16ern) oder longs (bei 32ern, PC) abzubilden (idealerweise 
immer die Speicherbusbreite, dann ist für jede Variable nur 1 Buszyklus 
nötig).

Denn dann ist (1) die Tipparbeit am geringsten, und (2) die Lesbarkeit 
des Codes super. Und ich muß nicht immer nach den doofen (3) Defines für 
das Bit suchen. Und ich brauche (4) im Debugger nicht das Bit 
rauspfriemeln, um zu sehen, was Sache ist...usw. usf.

Autor: Be Mi (bemi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Hilfe.

Ich werde mich dann wohl an die 1. Variante halten.

Grüe,
Bernd

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.