Forum: Mikrocontroller und Digitale Elektronik ATmega Registeradressen mit/ohne Offset 0x20


von Veit D. (devil-elec)


Lesenswert?

Hallo,

bin gerade beim ATmega2560.

Gibt es eine einfache Erklärung warum die unteren Register von 0x00 bis 
0x3F noch eine 2. Adresse mit einen Offset von 0x20 haben? Warum haben 
die eine 2. Adresse und alle anderen ab 0x60 nicht? Warum gibt es diese 
Unterscheidung bzw. dieses Offset überhaupt? Ab 0x15 bis 0x3F sind es ja 
keine I/O Register mehr. So zum Verständnis gefragt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Veit D. schrieb:
> Gibt es eine einfache Erklärung warum die unteren Register von 0x00 bis
> 0x3F noch eine 2. Adresse mit einen Offset von 0x20 haben?

Ja: das sind einfach zwei unterschiedliche Adressbereiche.

Der eine ist der IO-Adressbereich, der geht von 0 bis 63 (0x3F). Mehr 
Platz ist in den entsprechenden Befehlen (IN/OUT) einfach nicht, dafür 
sind sie schnell. Für die ursprünglichen AVRs genügte dieser Bereich, 
aber in dem Maße, wie die Peripherie wuchs, reichte es irgendwann nicht 
mehr.

Die IO-Bereiche waren allerdings beim AVR schon immer auch in den 
normalen Speicherbereich gemappt und von da aus zugreifbar, dann halt 
mit 2 Takten Zugriffszeit. Allerdings hatte man sich beim Design 
dazumals entschlossen, auf den Speicheradressen 0 bis 31 die 
CPU-Register zu spiegeln, deshalb taucht die Peripherie dort erst ab 
Adresse 32 (0x20) auf. Das ist just der Offset, den du siehst.

Da das Einblenden der CPU-Register in den Speicherbereich keinen 
wirklichen praktischen Nutzen hat, hat man dies beim Xmega dann 
aufgegeben, dort sind beide Adressen gleich.

: Bearbeitet durch Moderator
von Veit D. (devil-elec)


Lesenswert?

Hallo,

Dankeschön. Dann muss ich nur mit den Offsetadressen (wenn soweit 
vorhanden) arbeiten. Das erleichtert vieles im Umgang damit.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du nicht gerade in Assembler programmieren willst, musst du dich 
eigentlich gar nicht drum kümmern. Die symbolischen Namen werden vom 
C-Compiler passend automatisch umgesetzt.

von Xaver (Gast)


Lesenswert?

Jörg W. schrieb:
> Wenn du nicht gerade in Assembler programmieren willst, musst du dich
> eigentlich gar nicht drum kümmern. Die symbolischen Namen werden vom
> C-Compiler passend automatisch umgesetzt.

Üblicherweise ist das korrekt. Ich habe bisher erst einmal absichtlich 
den Registerzugriff über RAM ld/st Befehle genutzt: eine 
Assemblerimplementierung für Shuffling und Dummy S-Box lookups (DPA 
Countermeasure) für AES. Da gab es eine map mit den 
zufälligen/gemischten Registeradressen zum Umbenennen. War das 
effizienteste, das mir für diesen Zweck eingefallen ist. :-)

von Veit D. (devil-elec)


Lesenswert?

Hallo,

der Grund warum ich Adressen hinterlegen möchte ist dem damaligen Thema 
geschuldet. Beitrag "[AVR] Unerwarteter Compilerfehler mit constexpr"

von foobar (Gast)


Lesenswert?

Das gleiche Problem hast du auch bei einigen AVRs (z.B. Attinys) mit dem 
Flash: das ist zusätzlich in den Daten-Adressbereich gemappt - FlashAdr 
0 entspricht DatenAdr 0x8000 usw.  Je nachdem wie du drauf zugreifst 
(z.B. LD vs LPM) musst du unterschiedliche Adressen benutzen.

von c-hater (Gast)


Lesenswert?

Veit D. schrieb:

> Gibt es eine einfache Erklärung warum die unteren Register von 0x00 bis
> 0x3F noch eine 2. Adresse mit einen Offset von 0x20 haben?

Weil das halt das Mapping des IO-Space in den SRAM-Space ist. Darunter 
liegt das "Registerfile", also das Mapping der MCU-Register in den 
SRAM-Space. Das ist im allgemeinen ziemlich nutzlos und wurde deswegen 
in späteren AVR8-Cores auch entsorgt.

> Warum haben
> die eine 2. Adresse und alle anderen ab 0x60 nicht?

Weil halt der IO-Space nur 0x40 Adressen umfasst. Alle Register, die 
hier nicht reingepaßt haben, sind halt nur im SRAM-Space erreichbar.

> Ab 0x15 bis 0x3F sind es ja
> keine I/O Register mehr.

Doch, natürlich. Es ist nur nicht mehr jede IO-Instruktion mehr darauf 
anwendbar. Oder anders ausgedrückt: auch der IO-Space ist nochmals 
segmentiert, einige Instruktionen (in, out) können jede Adresse im 
IO-Space ansprechen, andere hingegen (sbi, cbi, sbis, sbis) sind auf 
einen Teil davon beschränkt. Die Grenze ist übrigens 0x1f, nicht 0x15...

Liest du einfach mal die "instruction set reference", dann wird klar, 
woher diese Beschränkungen kommen...

von Veit D. (devil-elec)


Lesenswert?

Danke auch Euch.

: Bearbeitet durch User
von Arne (Gast)


Lesenswert?

Jörg W. schrieb:
> Da das Einblenden der CPU-Register in den Speicherbereich keinen
> wirklichen praktischen Nutzen hat

Bei Controllern ohne zusaetzlichen RAM (ATtiny11/12) war das durchaus 
nuetzlich, um mit Zeiger-Register und ld/st ueber ein Datenfeld 
iterieren zu koennen.

von Theor (Gast)


Lesenswert?

Arne schrieb:
> Jörg W. schrieb:
>> Da das Einblenden der CPU-Register in den Speicherbereich keinen
>> wirklichen praktischen Nutzen hat
>
> Bei Controllern ohne zusaetzlichen RAM (ATtiny11/12) war das durchaus
> nuetzlich, um mit Zeiger-Register und ld/st ueber ein Datenfeld
> iterieren zu koennen.

Ach. Das brennt mir schon seit der Antwort von Jörg auf der Seele. Sei 
umarmt, Bruder im Geiste. :-)

Ich selbst habe etwas Ähnliches in einem Programm gemacht, um die 
Register zu sichern und wieder zu laden. Effektiv ist das natürlich 
einige Takte langsamer, zumal man das R30 und R31 sowie ein weiteres 
Register dennoch mit PUSH/POP behandeln muss. Aber der Code war dann 
doch ein klitzekleines Bisschen kleiner als 32 PUSH/POPs.

Naja. Ist Offtopic, aber ich habs mir von der Seele geschrieben. :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Arne schrieb:
> Bei Controllern ohne zusaetzlichen RAM (ATtiny11/12) war das durchaus
> nuetzlich

OK, stimmt, aller Anfang war ja der AT90S1200.

Aber danach hätte man das Feature auch wirklich sang- und klanglos in 
der Versenkung verschwinden lassen können.

von Rolf M. (rmagnus)


Lesenswert?

Arne schrieb:
> Jörg W. schrieb:
>> Da das Einblenden der CPU-Register in den Speicherbereich keinen
>> wirklichen praktischen Nutzen hat
>
> Bei Controllern ohne zusaetzlichen RAM (ATtiny11/12) war das durchaus
> nuetzlich, um mit Zeiger-Register und ld/st ueber ein Datenfeld
> iterieren zu koennen.

Ja, es gab glaub mal eine Appnote, die das nutze, um einen Ringpuffer in 
den Registern zu implementieren.

Jörg W. schrieb:
> Aber danach hätte man das Feature auch wirklich sang- und klanglos in
> der Versenkung verschwinden lassen können.

Ich fand dieses Feature immer irgendwie cool, wenn auch zugegebenermaßen 
eher nutzlos. Das war einfach was besonderes, das nicht jeder hat. :)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rolf M. schrieb:
> Das war einfach was besonderes, das nicht jeder hat.

OK, das ist wahr. :-)

Allerdings ist der Ärger, den dadurch die Verschiebung zwischen Memory 
und IO addresses für die Tools produziert hat, leider in keinem 
Verhältnis zum marginalen Nutzen, den das bei den allerersten AVRs mal 
gehabt hat. Sowohl GCC als auch avr-libc enthalten einige Verrenkungen, 
um trotzdem eine sinnvolle symbolische Abstraktion der IO-Register zu 
ermöglichen.

von c-hater (Gast)


Lesenswert?

Jörg W. schrieb:

> Allerdings ist der Ärger, den dadurch die Verschiebung zwischen Memory
> und IO addresses für die Tools produziert hat, leider in keinem
> Verhältnis zum marginalen Nutzen, den das bei den allerersten AVRs mal
> gehabt hat. Sowohl GCC als auch avr-libc enthalten einige Verrenkungen,
> um trotzdem eine sinnvolle symbolische Abstraktion der IO-Register zu
> ermöglichen.

Wenn das wirklich so wäre, würde irgendwas mit der Sprache nicht 
stimmen. In Assembler ist das wirklich trivial abzubilden. Da aber C 
glücklicherweises auch nur ein gepimpter Macroassembler ist, sollte es 
auch in C keine wirklich tiefgreifenden Verrenkungen bedeuten. Und tut 
es auch nicht...

Eine andere Sache ist die Segmentierung des IO-Space, also die Tatsache, 
dass es IO-Space erster und zweiter Klasse gibt. DAS ist schon etwas 
aufwendiger zu behandeln, auf jeden Fall für den Codegenerator. Sehr 
wahrscheinlich geht es bei den von dir ermittelten "Verrenkungen" im 
wesentlichen eher um dieses Problem...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

c-hater schrieb:
> In Assembler ist das wirklich trivial abzubilden.

Abhängig vom verwendeten Befehl (IN/OUT vs. LD*/ST*) eine 
unterschiedliche Adresse zu benutzen, ist in Assembler einfach 
abzubilden? Also
1
IN R24, PINA

wird (bspw.) assembliert als
1
IN R24, 0x19

während
1
LDR R24, PINA

übersetzt wird zu
1
LDR R24, 0x39

?

von c-hater (Gast)


Lesenswert?

Jörg W. schrieb:

> Abhängig vom verwendeten Befehl (IN/OUT vs. LD*/ST*) eine
> unterschiedliche Adresse zu benutzen, ist in Assembler /einfach/
> abzubilden?

Nein, natürlich nicht. Das Problem ist: du zäumst das Pferd von der 
falschen Seite auf.

Das Problem, vor dem ein Compiler steht, (oder auch das Macro eines 
Assemblers) ist ein ganz anderes, nämlich:

Entscheide für einen beliebigen IO-Zugriff, ob er sich über In/Out 
erledigen läßt oder ob lds/sts verwendet werden muß. Vorgabe ist also 
die Adresse, nicht die Operation.

Und das ist wirklich einfach, entsprechende Asm-Makros wurden hier schon 
mehrfach gepostet. Und natürlich macht das auch dein geliebter 
C-Compiler effektiv exakt so...

Aber ich kann natürliche gerne noch einmal meine ganz persönlichen 
Asm-Makros posten, damit selbst du (vielleicht irgendwann) weißt, 
worüber wir hier eigentlich reden...

.MACRO UIN
.IF @1 < $40
  in @0,@1
.ELSE
  lds @0,@1
.ENDIF
.ENDMACRO

.MACRO UOUT
.IF @0 < $40
  out @0,@1
.ELSE
  sts @0,@1
.ENDIF
.ENDMACRO

Das ist doch wirklich trivialster Scheiß. Ich hätte dich für kompetenter 
gehalten...

Das Problem ist eben nur, dass sich das nur für in/out so einfach 
abhandeln läßt. Es gibt ein Register als Quelle oder Ziel, und eine 
Adresse, auf die es lesend oder schreibend zuzugreifen gilt. Und welche 
Opcode zu verwenden ist, kann problemlos aus der Adresse abgeleitet 
werden.

Bei den anderen Operationen im IO-Space (also die möglicherweise 
verwendbaren Assembler-Operationen sbi, cbi, sbis, sbic) ist das aber 
leider nicht so. Die lassen sich nur unter Verwendung eines zusätzlichen 
MCU-Registers abbilden, wenn das Target halt nicht im IO-Space unterhalb 
0x20 liegt, in dem eine direkte Abbildung auf eben diese Instruktionen 
möglich ist.

Kurzfassung: du hast keine Ahnung, wovon du redest (aber offensichtlich 
einen Haufen Arschkriecher, die dich bewertungstechnisch trotzdem gut 
aussehen lassen wollen). Mir sträuben sich die Nägel, wenn ich solche 
Bewertungen sehe (zum Glück schaue ich sie mir nur selten an, weil meist 
nur als Gast unterwegs...). Ich hoffe, dir ist wohl bei dieser 
penetranten Massage des Analgangs...

Bedenklich finde ich allerdings, dass du auch Moderator bist. Moderator 
ohne hinreichende Kompetenzen in der Sache kann eigentlich nur falsch 
sein...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

c-hater schrieb:
> Moderator ohne hinreichende Kompetenzen in der Sache kann eigentlich nur
> falsch sein

Hauptsache, du hast Kompetenz.

Eigentlich wollte ich was erwidern, aber nach dem Lesen dieses Satzes 
lasse ich dein Pamphlet ohne weiteren Kommentar so stehen.

von Helmut -. (dc3yc)


Lesenswert?

Könnte bitte einer der Herren Moderatoren den obigen flatus von c-hater 
löschen?

von c-hater (Gast)


Lesenswert?

Jörg W. schrieb:

> Eigentlich wollte ich was erwidern, aber nach dem Lesen dieses Satzes
> lasse ich dein Pamphlet ohne weiteren Kommentar so stehen.

Mir wäre es lieber, du würdest dich irgendwie zu den besprochenen 
Sachverhalten äußern. Das Gehakele um irgendwelche "Meinungen" ist 
absolut huppse. Das nützt niemandem. Am Ende zählt nur eins: Fakten.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

c-hater schrieb:
> Mir wäre es lieber, du würdest dich irgendwie zu den besprochenen
> Sachverhalten äußern.

Nicht mit dem unsinnigen Ton, den du da anschlägst.

Da ich aber selbst in die Diskussion involviert bin, werde ich das 
natürlich nicht löschen. Wenn es also gelöscht wird, dann weil auch 
andere Moderatoren der Meinung sind, dass dieser Tonfall einfach in 
diesem Forum unangebracht ist.

von c-hater (Gast)


Lesenswert?

Jörg W. schrieb:

> Nicht mit dem unsinnigen Ton, den du da anschlägst.

Ich?!

Ich versuche ständig, die Diskussion in sachliche Bahnen zu lenken, 
allen Meinungs-Scheiß daraus zu entfernen. Ich versuche auch, dich zu 
Äußerungen in der Sache zu bewegen, zu sachlichen Erwiderungen auf die 
von mir vorgebrachten sachlichen Argumente.

Also irgendwas läuft hier definitiv schief...

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich muss auch dazu was sagen an c-hater.
Du bleibst eben gerade jetzt NICHT mehr sachlich in deinen Äußerungen.
Sachlich wäre gewesen alle Beleidigungen rauszulassen.
Sachlich wäre gewesen wenn du mit deiner Kompetenz, die dir sicherlich 
niemand streitig macht, dich nur auf das Thema der 
Adressenunterscheidung zu konzentrieren. Du hast es doch mit deinem 
Wissen gar nicht nötig andere zu beleidigen. Schreib einfach wie es nach 
deiner Meinung nach richtig ist oder wie es laut deiner Meinung 
einfacher ist und gut ist. Manchmal liegen zwischen vermeintlich 
unterschiedlichen Meinungen nur falsch formulierte Sätze, weil alle 
eigentlich irgendwie das Gleiche meinen, sich aber unterschiedlich 
ausdrücken. Im Grunde machst du dir deine Kompetenz mit deinen 
Beleidigungen im gleichem Atemzug zu Nichte. Das muss doch nicht sein.

von Mitleset (Gast)


Lesenswert?

Veit D. schrieb:
>      Im Grunde machst du dir deine Kompetenz mit deinen
> Beleidigungen im gleichem Atemzug zu Nichte. Das muss doch nicht sein.

Kompetenz hin oder her. Der Typ ist ein Psychopath, hochgradig krank. 
Ist ja nicht seine erste Entgleisung hier...

Ja lieber c-hater, Du mußt jetzt ganz tapfer sein: Du bist ein armes 
Schwein

von c-hater (Gast)


Lesenswert?

Veit D. schrieb:

> ich muss auch dazu was sagen an c-hater.
> Du bleibst eben gerade jetzt NICHT mehr sachlich in deinen Äußerungen.
> Sachlich wäre gewesen alle Beleidigungen rauszulassen.

Grundsätzlich stimme ich dir zu. Die Sache ist nur: Welcher 
Beleidigungen habe ich mich denn eigentlich schuldig gemacht?

Ich kann keine sehen. Könntest du sie spezifizieren, sozusagen als 
neutraler Beobachter?

von c-hater (Gast)


Lesenswert?

Mitleset schrieb:

> Ja lieber c-hater, Du mußt jetzt ganz tapfer sein: Du bist ein armes
> Schwein

Mag sein, wenn's dich glücklich macht.

Allerdings weiß ich im Gegensatz zu dir nachweisbar, wovon ich rede, 
wenn ich rede...

von M. K. (sylaina)


Lesenswert?

c-hater schrieb:
> Ich?!
>
> Ich versuche ständig, die Diskussion in sachliche Bahnen zu lenken,
> allen Meinungs-Scheiß daraus zu entfernen. Ich versuche auch, dich zu
> Äußerungen in der Sache zu bewegen, zu sachlichen Erwiderungen auf die
> von mir vorgebrachten sachlichen Argumente.
>
> Also irgendwas läuft hier definitiv schief...

Naja, wirklich jeder sagt dir hier, dass du dich im Ton vergriffen hast. 
Und du kommst immer noch nicht auf die Idee, dass deine Wortwahl 
vielleicht nicht doch ungünstig war?

c-hater schrieb:
> Welcher
> Beleidigungen habe ich mich denn eigentlich schuldig gemacht?

Also das hier:
c-hater schrieb:
> Kurzfassung: du hast keine Ahnung, wovon du redest (aber offensichtlich
> einen Haufen Arschkriecher, die dich bewertungstechnisch trotzdem gut
> aussehen lassen wollen). Mir sträuben sich die Nägel, wenn ich solche
> Bewertungen sehe (zum Glück schaue ich sie mir nur selten an, weil meist
> nur als Gast unterwegs...). Ich hoffe, dir ist wohl bei dieser
> penetranten Massage des Analgangs...

Kann durchaus als Beleidigung aufgefasst werden. Und das willst du nicht 
erkannt haben? Wer genau soll dir das jetzt glauben?

However, hier jetzt weiter zu diskutieren bringt herzlich wenig, deine 
sachbezogenen Ausführungen erscheinen mir richtig. Überdenke einfach nur 
bei deinen nächsten Posts doch mal die Wortwahl, lass die 
unterschwelligen Vorwürfe, egal gegen wen, einfach weg und du wirst 
sehen, du bekommst auch mehr Antworten ;)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

M. K. schrieb:
> deine sachbezogenen Ausführungen erscheinen mir richtig

Selbst das sind sie nicht, aber darüber rede ich mit ihm erst dann, wenn 
er einsieht, dass solch eine Wortwahl nicht ins Forum gehört.

Ich hatte es ihm schon einmal geschrieben: die Akzeptanzgrenze für das 
Forum ist nicht, ob bereits eine strafrechtlich relevante Beleidigung 
vorliegt. Eine vernünftige Diskussion erfordert, dass man sich deutlich 
unterhalb dieser Grenze auszudrücken gewillt ist. Sich selbst 
grenzenlose Kompetenz zuzuschreiben und andere der völligen Inkompetenz 
zu bezichtigen, ist sowieso eine schlechte Basis für jegliche 
Diskussionen.

von Veit D. (devil-elec)


Lesenswert?

c-hater schrieb:
>
> Grundsätzlich stimme ich dir zu. Die Sache ist nur: Welcher
> Beleidigungen habe ich mich denn eigentlich schuldig gemacht?
>
> Ich kann keine sehen. Könntest du sie spezifizieren, sozusagen als
> neutraler Beobachter?

Hallo,

weil du nachgefragt hast, bekommste natürlich eine Antwort.
Wir reden vom Posting vom 7.04.20 22:44 Uhr.

Du beginnst absolut sachlich. Alles i.O.
Unterhalb vom Makro erscheint dieser Satz.
> Ich hätte dich für kompetenter gehalten...
Nicht schön, aber wenn man nicht dünnhäutig ist, kann man das bewußt 
überlesen und gut ist. Kleine Stichelei - geschenkt.

Dann gehts wieder sehr sachlich weiter.

Am Ende teilst du ohne erkennbaren Grund leider gegen Jeden aus.
> (aber offensichtlich einen Haufen Arschkriecher,
Hier gegen alle Forenteilnehmer.

> Ich hoffe, dir ist wohl bei dieser penetranten Massage des Analgangs
und hier gegen Jörg direkt

Hättest du die letzten beiden "Sätze" einfach weggelassen, wäre in 
meinen Augen alles okay gewesen. Meistens hilft es einfach einen Tag 
später zu antworten. Also die Antwort lesen und nicht sofort darauf zu 
reagieren. Gelingt vielleicht nicht immer, aber immer öfters wäre gut. 
:-)

Das wäre meine neutrale Einschätzung zum Thema.

Beitrag #6213050 wurde von einem Moderator gelöscht.
von M. K. (sylaina)


Lesenswert?

Moby schrieb im Beitrag #6213050:
> Auch das ist eine Beleidigung.

Also ich hätte da jetzt eher auf einen kranken Menschen getippt ;) :D

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

M. K. schrieb:
> Also ich hätte da jetzt eher auf einen kranken Menschen getippt

Stimmt schon, aber diese Einschätzung steht eher einem Arzt zu denn 
einem Forenteilnehmer.

von M. K. (sylaina)


Lesenswert?

Jörg W. schrieb:
> Stimmt schon, aber diese Einschätzung steht eher einem Arzt zu denn
> einem Forenteilnehmer.

Das ist richtig, aber im Kontext hier sollte man nicht alles so 
wortwörtlich oder gar persönlich nehmen. Alles easy ;)

Beitrag #6213888 wurde von einem Moderator gelöscht.
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.