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


von Bubble (Gast)


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!

von Bubble (Gast)


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??

von Sascha W. (sascha-w)


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

von Patty (Gast)


Lesenswert?

Hi,

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

von Bubble (Gast)


Lesenswert?

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

von Sascha W. (sascha-w)


Lesenswert?

na dann sag doch mal wozu man 100 identische Bytes im Flash braucht.

Sascha

von Bubble (Gast)


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...

von Sascha W. (sascha-w)


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

von bix (Gast)


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

von Andreas F. (aferber)


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

von Basti (Gast)


Lesenswert?

Klar geht das.

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

erstes Ergebniss, unter Anwendung, Flash-ROM

von Peter D. (peda)


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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Was du machen willst geht mit einem rekursiven Assembler-Makro wie
1
.macro _NOPS cnt
2
.if (\cnt > 0)
3
   nop
4
_NOPS (\cnt)-1
5
.endif
6
.endm

Anwendung dann
1
_NOPS (1000)

Evtl hilft dir auch .fill oder .space.

von Bubble (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


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.

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.