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


von Be M. (bemi)


Lesenswert?

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

Also:
1
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?
1
UART0_RxStatus_ESCAPESEQ = 1;

von Falk B. (falk)


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

von Andreas K. (a-k)


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.

von Jochen M. (taschenbuch)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Be M. (bemi)


Lesenswert?

Danke für eure Hilfe.

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

Grüe,
Bernd

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.