Forum: Mikrocontroller und Digitale Elektronik FLASH im normalen Addressbereich AVR128DA


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Peter S. (cbscpe)


Bewertung
0 lesenswert
nicht lesenswert
Ich arbeite mich jetzt gerade in die neue AVR128DA MCU Familie ein und 
habe dabei gesehen, dass ein Teil das Flash, nämlich die oberen 32kbyte, 
in den Adressraum der Daten gemapped ist. Das finde ich natürlich sehr 
praktisch habe aber noch nicht herausgefunden wie ich das im Assembler 
"konstruiere", d.h. wie verfahre ich mit den Labels und wie benutze ich 
sie dann im Assembler, bis jetzt ging das ja etwa so

[avrasm]
 .cseg

 ldi  zl, low(2*message)
 ldi  zh, high(2*message)
 ldi  r16, 1
 sts  rampz, r16
 elpm r0, Z
 ...

 .org 0xC000
message:
 .db "Hello World"

[avrasm]

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Es wird einer der vier 32 KiB-Blöcke des Flash gemapped, in 
NVMCTRL_CTRLB.FLMAP wird eingestellt, welcher.
Sollte jedoch ein Bootloader vorhanden sein, sind die Errata zu 
beachten.

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
Mit C wäre es einfacher: Für ".rodata" wird im Linker Skript eine neue 
Section angelegt, die entsprechende Adressen enthält. Damit entfällt der 
sonst übliche Kopfstand für String Konstanten im Flash.

In Assembler müsste man sinngemäß dasselbe tun, was aber IMO aufwändiger 
wäre als obige traditionelle Lösung, die weiterhin verfügbar bleibt.

Ich sehe in der offiziellen AVR Assembler Doku derzeit noch keine 
direkte unterstützung für "Flash im RAM-Segment" - weder CSEG, noch DSEG 
oder ESEG würden passen.

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
an Peter S., Beispiel:
1
.org 0
2
    ldi     r16,NVMCTRL_FLMAP_SECTION0_gc
3
    sts     NVMCTRL_CTRLB,r16
4
    ldi     ZH,high(alpha*2 +$8000)
5
    ldi     ZL,low (alpha*2 +$8000)
6
    ld      r16,z
7
    rjmp    alpha_end
8
    
9
alpha:
10
.db "ao"
11
alpha_end:
12
    ...

von spess53 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi

Geht doch ganz einfach:

[avrasm]
ldi r16,byte3(message*2)
out rampz, r16
ldi ZL,byte1(message*2)
ldi ZH,Byte2(message*2)
...

.org 0xC000
message:
 .db "abc"
[{avrasm]

MfG Spess

von c-hater (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
spess53 schrieb:

> Geht doch ganz einfach:
[...]

Naja, klar geht das einfach, hat man ja schon immer so gemacht, seitdem 
es AVR mit mehr als 64k Flash gab.

Ist nur nicht das, was der TO wollte, er wollte das Mapping in den 
SRAM-Bereich benutzen. Für den Zugriff auf konstante Strings bringt das 
natürlich eher keinen Vorteil, der Code wird dadurch weder schneller 
noch kleiner. Dazu kommt noch der Mapping-Bug, der die Sache 
verkompliziert, so dass der Code tendenziell sogar größer und langsamer 
werden dürfte.

Die einzige derzeit sinnvolle Anwendung für das Mapping sehe ich beim 
Zugriff auf Arrays von konstante Strukturen mit bis zu 64 Byte Größe. Da 
läßt sich einiges beschleunigen, weil halt auf den gemappten Flash mit 
ldd zugegriffen werden kann, was deutlich fixer vonstatten geht als die 
beim lpm-Zugriff nötige manuelle Addition des Offsets zum Indexregister.

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ein gewisser Vorteil könnte auch die Verwendbarkeit von y (sowie x, wenn 
auch ohne ldd) sein.

von Peter S. (cbscpe)


Bewertung
0 lesenswert
nicht lesenswert
Genau, ich brauch das Mapping um auf verlinkte Strukturen zugreifen zu 
können. Z.Bsp. für den Command Line Parser. Im Moment ist das eher 
aufwändig, weil nur das Z register auf die verlinkten Informationen 
zugreifen kann und man keine Adressierung mit Offset und kein 
Autodecrement hat.

Danke für das Beispiel, das probiere ich gleich mal aus.

Ja leider bietet der avrasm2 überhaupt keine Unterstützung, es ist 
sowieso ein ziemlich einfach gehaltener Assembler. Aber damit muss man 
leben.

von Moby (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Peter S. schrieb:
> es ist
> sowieso ein ziemlich einfach gehaltener Assembler. Aber damit muss man
> leben.

Na Gott sei Dank würd ich mal sagen.
Zu einer einfachen Sprache gehören einfache Tools. Das schätze ich an 
Asm am meisten.

von c-hater (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Peter S. schrieb:

> Ja leider bietet der avrasm2 überhaupt keine Unterstützung, es ist
> sowieso ein ziemlich einfach gehaltener Assembler.

Er hat alles, was nötig ist, um die Unterstützung zu schaffen, nämlich 
recht ordentliche Macro-Fähigkeiten (auch wenn die in einigen Details 
deutlich verbesserungswürdig wären).
Wie auch immer: Mit einem Satz gut durchdachter Macros wird auch die 
Benutzung von gemapptem Flash zum Kinderspiel.

von c-hater (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
S. Landolt schrieb:

> Ein gewisser Vorteil könnte auch die Verwendbarkeit von y (sowie x, wenn
> auch ohne ldd) sein.

Richtig. Je nach Problem kann auch dies noch einen deutlichen 
zusätzlichen Vorteil bedeuten. Auch die vom TO erwähnte zusätzliche 
Möglichkeit zum Prädecrement könnte gelegentlich durchaus sehr nützlich 
sein.

Haben wir also festgestellt, dass das Mapping insgesamt sehr nützlich 
sein könnte. Muss jetzt bloß noch MC seine Hausaufgaben machen und den 
Bug beseitigen...

Ich persönlich würde mich schämen, ernsthaft ein Hardware mit einem 
derartig gravierenden Bug auszuliefern. Aber das haben garantiert nicht 
Leute entschieden, die programmieren oder Hardware designen...

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]
  • [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.