AVR Bitbefehle auf das RAM anwenden?

OP #992717
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;
#992796
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.
#992798
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
Moderator (Firma: Titel) Persönliche Seite #992825
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren