www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Makro: Konstanten im Flash-Speicher


Autor: Bubble (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

gibt es einen derartigen Befehl(oder Makro) der es ermöglicht eine 
Konstante bei der Kompilierung als Programmcode zu schreiben?

Bsp:
...

.org $2a
.BYTES 100 0xfd        ; Makro/Befehl

...
erzeugt:

0x2a: 0xfdfd
0x2c: 0xfdfd
0x2e: 0xfdfd
0x30: 0xfdfd
0x32: 0xfdfd

...

Mit .db bzw .dw kann muss jeder einzelne Wert ja selber geschrieben 
werden.

Unter nasm ist mir so eine Konstruktion bekannt, jedoch nicht für den 
avr-assembler.


Danke schon mal!

Autor: Bubble (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier das NASM-Gegenstück:

"The TIMES prefix causes the instruction to be assembled multiple times. 
This is partly present as NASM's equivalent of the DUP syntax supported 
by MASM-compatible assemblers, in that you can code"

zerobuf:        times 64 db 0

Quelle: http://www.nasm.us/doc/nasmdoc3.html


Ich brauche sowas unbedingt auch für den AVR-Assembler...

Irgendwelche Ideen??

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

auch wenn ich den Sinn des ganzen nicht erkenne - wie oft brauchst du 
denn die Funktion in deinem Programm? - ist mir auch keine sinnvolle 
Möglichkeit bekannt das mit Assemblerdirektiven zu lösen.
Bleibt nur der Editor und copy&paste

Sascha

Autor: Patty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

des würde mich auch interessieren, falls jemand eine Idee/Lösung dafür 
hat.

Autor: Bubble (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die Funktion unsinnig wäre, wäre sie doch in NASM nicht 
implementiert...

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na dann sag doch mal wozu man 100 identische Bytes im Flash braucht.

Sascha

Autor: Bubble (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unter Nasm benutz ich sowas wenn ich nen Bootloader geschrieben hab und 
die letzten 2 Bytes eine Signatur dafür sind, dass der Code ein 
Bootloader ist.
"times" füllt sozusagen nicht-vorhandenen Code mit 0-Bytes(oder 0xff) 
auf und setzt am Ende die 0x55AA Signatur.

In Assembler will ich nur in einen 1000-Byte langen NOP-Block 
springen^^, um mir das Nachdenken über die Schleifenkonstrukte zu 
ersparen (Delay).

Falls es so einen Befehl nicht gibt, verwerfe ich mal die Idee...

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bubble schrieb:
> Unter Nasm benutz ich sowas wenn ich nen Bootloader geschrieben hab und
> die letzten 2 Bytes eine Signatur dafür sind, dass der Code ein
> Bootloader ist.
> "times" füllt sozusagen nicht-vorhandenen Code mit 0-Bytes(oder 0xff)
> auf und setzt am Ende die 0x55AA Signatur.
dann würde es doch reichen die Signatur an die Endadresse zu setzen - 
zwischen Programm und Signatur steht nach dem Erase der Blöcke eh' 0xFF

> In Assembler will ich nur in einen 1000-Byte langen NOP-Block
> springen^^, um mir das Nachdenken über die Schleifenkonstrukte zu
> ersparen (Delay).
das habe ich auch noch nicht gehört - musst aber viel Speicher haben

> Falls es so einen Befehl nicht gibt, verwerfe ich mal die Idee...
genau, ein Delay mit Schleifen zu programmieren ist doch auch kein 
Problem

Sascha

Autor: bix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bubble schrieb:
> In Assembler will ich nur in einen 1000-Byte langen NOP-Block
> springen^^, um mir das Nachdenken über die Schleifenkonstrukte zu
> ersparen (Delay).

Das ist jetzt aber nicht Dein Ernst, oder?

Und wenn Du mal eine Sekunde warten musst? Brauchst Du dann 16 Mio Nops?

Manchmal sollte man sich das Nachdenken nicht ersparen ;-)

Grüße

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bubble schrieb:
> Wenn die Funktion unsinnig wäre, wäre sie doch in NASM nicht
> implementiert...

NASM ist für Architekturen, wo man z.B. mal eben ein Alignment auf eine 
Cache-Zeile haben will, und deshalb die Bytes dazwischen mit irgendwas 
füllen muss (je nach Anwendung vorzugsweise mit etwas, was nicht zu 
einer "Invalid Opcode"-Exception oder gar irgendwelchen sinnlosen 
Befehlen führt).

Bei 8bit-Controllern braucht man das aber tendenziell eher nicht.

Andreas

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar geht das.

http://lmgtfy.com/?q=avr+assembler+flash

erstes Ergebniss, unter Anwendung, Flash-ROM

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bubble schrieb:
> In Assembler will ich nur in einen 1000-Byte langen NOP-Block
> springen^^, um mir das Nachdenken über die Schleifenkonstrukte zu
> ersparen (Delay).

Das ist jetzt aber nicht Dein Ernst?

Delays macht man ganz einfach zyklusgenau:

http://www.mikrocontroller.net/attachment/416/Mdelay.asm


Peter

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was du machen willst geht mit einem rekursiven Assembler-Makro wie
.macro _NOPS cnt
.if (\cnt > 0)
   nop
_NOPS (\cnt)-1
.endif
.endm

Anwendung dann
_NOPS (1000)

Evtl hilft dir auch .fill oder .space.

Autor: Bubble (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
> .macro _NOPS cnt
> .if (\cnt > 0)
>    nop
> _NOPS (\cnt)-1
> .endif
> .endm

Danke! Endlich jemand der Sinn und Frage getrennt behandelt!! Es geht 
also doch! Rekursion wäre mir nicht in den Sinn gekommen.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bubble schrieb:
> Danke! Endlich jemand der Sinn und Frage getrennt behandelt!! Es geht
> also doch! Rekursion wäre mir nicht in den Sinn gekommen.
Geht im AVR Studio soweit ich mich erinnere aber maximal bis zu einer 
Tiefe von 6 Ebenen.

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.