Forum: Mikrocontroller und Digitale Elektronik AVRASM: wie Scratch-Register richtig benennen


von Frank R. (zausel)


Lesenswert?

Hallo zusammen,

ich lese schon einige Zeit in diesm Forum mit und habe auch schon kleine 
Programme auf ATMegas erstellt. Nun möchte ich auch einmal eine 
Anfängerfrage in das Forum stellen. Ich hoffe ihr könnt mir helfen.

Bei der Programmierung in Assembler versuche ich die Variablen soweit 
als möglich in den Registern zu halten. Damit dies übersichtlich bleibt 
teile ich die Variablen bei der Definition am Anfang der ASM-Datei in 
verschiedene Gruppen ein: Grundsätzlich unterscheide ich ersteinmal 
zwischen globalen und lokalen Variablen. Beide Gruppen teile ich weiter 
in Variablen von "asynchronen" und "synchronen" Programmteilen (also ISR 
und Hauptprogramm/Unterprogramme). Dadurch kann ich recht einfach sehen, 
welche Variablen (oder besser Register) ich ohne vorheriges Sichern 
einfach in der ISR oder dem Unterprogramm als Hilfsvariable werwenden 
kann. Hier im Forum habe ich dafür den Begriff Scratch-Register 
gefunden.

Nun würde ich diesen Registern per DEF-Direktive gern selbsterklärende 
Namen zuweisen. Da die Scratch-Register in den unterschiedlichen 
Routinen unterschiedliche Aufgaben übernehmen, sollen sie auch 
unterschiedlich (also mehrfach) benannt werden.

Der Assembler übersetzt die Programme zwar ordentlich, allerdings 
bekomme ich für die doppelte Definiton der Register Warnungen:

J:\Projekte\Sign.asm(52): warning: Register r21 already defined by the 
.DEF directive
J:\Projekte\Sign.asm(54): warning: Register r15 already defined by the 
.DEF directive
J:\Projekte\Sign.asm(55): warning: Register r21 already defined by the 
.DEF directive

Ich verwende den AVRASM, AVR macro assembler 2.1.42 (build 1796 Sep 15 
2009 10:48:36)

Ich würde diese Warnungen für den DEF-Block der Scratch-Register nun 
gerne unterdrücken. Allerdings möchte ich die Warnung nicht ganz 
abschalten, da sie an anderer Stelle durchaus auf einen Fehler hinweisen 
kann. Leider habe ich dazu nichts in der AVRASM-Dokumentation finden 
können. Gibt es eine Möglichkeit meinen Wunsch zu realisieren? Mir würde 
schon ein Link mit einem groben Hinweis wo ich die Information finden 
kann helfen.

Schon mal vielen Dank für Eure Hilfe.
Frank

von Niels U. (slein)


Lesenswert?

Ich mach das immer so:

; partly usable registers R0-R15
.DEF rglastcmd     = R13  ; holds received and checked comand
.DEF rgtadrA       = R14  ; left half of ir address to listen to
.DEF rgtadrB       = R15  ; right half of ir address to listen to
; fully functional registers R16-R25
.DEF rgtmp         = R16  ; tmp
.DEF rgtmp2        = R17  ; tmp
.DEF rgtmp3        = R18  ; tmp
.DEF rgi           = R19  ; various counters
.DEF rgrxbitcount  = R20  ; bit receive counter
.DEF rgrxbytecount = R21  ; byte receive counter
.DEF rgrxtmp       = R22  ; rx shift register
.DEF rgrxstart     = R23  ; 0 if no start occured, 1 if start was 
received
.DEF rgtransip     = R24  ; 1 if transfer to µc is in progress, 0 if not
              ; bit1 holds flag for next bit to write
              ; upper half is used as bit counter

rg davor um register schnell im code zu erkennen.
tmp sieht man gleich was es ist, kommt man nicht durcheinander mit 
mehreren Namen für ein register, für temporäre Sachen und Parameter für 
kurze Routinen.
Dazu noch Zähler, Status bytes und Konstanten, je nach Bedarf :)

Kommentare nicht vergessen und insbesondere die Funktion der temporären 
register gut dokumentieren...

von spess53 (Gast)


Lesenswert?

Hi

Ich bin in 13 Jahren AVR-Assemblerprogrammierung ohne 'defs' oder sg. 
'Scratchregister' ausgekommen. Und werde es auch weiterhin. 'defs' mögen 
bei kleineren Programmen die Anschaulichkeit verbessern, bei grösseren 
Programmen ist es eher lästig.

MfG Spess

von AVRASM-Nutzer (Gast)


Lesenswert?

@ Niels Unwichtig
leider hilft das Frank nicht weiter
ihm geht es um die Unterdrückung der warning Hinweise

und leider kann ich auch nicht helfen
ich lebe einfach mit den warning Hinweisen (und übersehe sie)
mich interessiert eigentlich nur die tabellarische
Zusammenfassung am Ende - bin notorisch am Anschlag
mit dem Flash-Speicher. :-)

wann gibt es endlich ATtiny4313?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Frank Richter schrieb:
> Dadurch kann ich recht einfach sehen,
> welche Variablen (oder besser Register) ich ohne vorheriges Sichern
> einfach in der ISR oder dem Unterprogramm als Hilfsvariable werwenden
> kann.
Oh, Oh... das kann aber eine böse Falle sein! Funktionen/Unterprogramme 
sollten immer so sein das sie möglichst rückwirkungsfrei seind, d.h. der 
Aufrufer hat danach alles wie es vorher war (Rückgabewert ausgenommen).

Wenn du nämlich ein Unterprogramm hast was ein anderes aufruft (oder 
eine ISR die ein Unterprogramm aufruft) und jeder geht davon aus er kann 
machen was er will... gibt es ganz sicher Datenmatsch.

von Ronny S. (Firma: Schmidt GmbH & Co.KG) (searay)


Lesenswert?

Also ich habe damals mit dem 8085 angefangen, in Maschinensprache zu 
programmieren, da gab es nur einen Accu, den Rest mußte man sich selbst 
ausdenken. Wenn man bedenkt, daß 16 universell ohne Einschränkungen 
verwendbare Register an sich doch recht wenige sind, wenn es um eine 
"richtige" technische Verwendung eines AVR gehen soll, so kommt man doch 
schnell an den Punkt, wo man den Überblick über die unterschiedlichen 
Verwaltungsverhältnisse unterschiedlicher Register(gruppen) verliert - 
soweit meine Meinung und Erfahrung:

Ich verwende in allen Fällen eine Accu (R16), dann brauche ich mir nur 
um ihn Gedanken machen, wenn mal was nicht läuft. Bedenkt man, daß die 
Hilfsmittel arg beschränkt sind (die Simulatoren des AVR-Studio sind 
doch eher Dreck - wie will man z. B einen rxd-bedingten Interrupt eines 
USART auslösen: geht nicht, nur über Umschreiben der ISR und call aus 
dem Hauptprogramm!!), bleibt oft nur der eigene Speicheroszi, ein paar 
Aus- und Eingänge und ein Display, um Programme zu debuggen.

Mir ist schon bewußt, daß der Accu die Vorteile des RISC-Prozessings 
zunichte macht, aber praktisch ist er allemal und man muß nur ihn 
verfolgen, wenns mal "hängt". Wie oben schon von anderen empfohlen: Eine 
genaue Dokumentation/Kommentierung ist wohl das wichtigste. Leider 
bietet AVR-Studio da auch keine wirklichen modernen Hilfmittel an, wie 
z. B. "Merkzettel"-Fensterchen oder Info-Fenster, wo man sich 
Funktion/Verwendung an einer betreffenden anderen Stelle im Text ansehen 
könnte, um die aktuelle Zeile zu verstehen.

Ich persönlich halte inzwischen nicht mehr viel von den AVRs und der vom 
Hersteller zur Verfügung gestellten Entwicklungsumgebung, es wirkt und 
ist "billig", der tatsächliche Aufwand muß vom Entwickler/Hersteller 
betrieben werden - und das paßt einfach nicht mehr in diese Zeit!

von spess53 (Gast)


Lesenswert?

Hi

>wie will man z. B einen rxd-bedingten Interrupt eines
>USART auslösen: geht nicht, nur über Umschreiben der ISR und call aus
>dem Hauptprogramm!!),

Wenn man keine Ahnung hat, sollte nam sich mit solchen Meinungen 
zurückhalten. Im obigen Fall hilft ein einfacher Klick auf das RXC-Bit 
im UCSRA-Register und schon wird der Interrupt ausgelöst. Und wenn du zu 
einem ganz konkreten Zeitpunkt (oder mehreren) haben willst erstellst du 
ein Stimuli-File.

MfG Spess

von Simon K. (simon) Benutzerseite


Lesenswert?

Einer der Gründe, warum ich auf C umgestiegen bin. Da werden die 
Register/der Speicher automatisch und möglichst ideal verwaltet. Mehr 
Zeit sich auf die wirklich wichtigen Sachen zu konzentrieren.

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.