Grafikdaten im Flash ablegen

Gast #119353
Lesenswert?
• ▲
▼
Hallo,
ich versuche gerade beim M16C 64kB Grafikdaten über Assembler an
Adresse A0000 (oberster Flash Block bei 384kB) ins Flash zu schreiben.
Dazu verwende ich ein einfaches Assemblerprogramm (eigentlich kein
Programm, sondern nur Daten):
.section Grafikdaten
.org a0000h
.Byte "hier stehen die Grafikdaten"

Solange ich bei org unter a0000 bleibe funktioniert es, aber a0000
aufwärts verursacht einen Fehler beim Compilen:
test.a30 2 Error (asp30): Operand value is not defined

Nun das nächste Problem:
Ich schreibe jetzt, sagen wir mal 10 Bilder mit je 1024Bytes ins Flash
an Adresse A0000.
Wie kann ich in C ein Array erzeugen, das genau diese Daten enthält,
also an Adresse A0000 beginnt und in etwas so aufgebaut ist:
Bilder [10] [1024] ?
Gast #119354
Lesenswert?
• ▲
▼
Hi

IIRC ist es nötig die Zahl für den Assembler als Zahl zu markieren ->
du mußt eine Null vor die eigentlich Zahl stellen. Ansonsten kann der
Assembler nicht zwischen einer irgendwo definierten Konstante A0000h
und deiner Zahl A0000h unterscheiden.

.org 0a0000h sollte also funktionieren.

bilder[10][1024] dürfte eigentlich nicht funktionieren da bilder[10]
einen Pointer zurückgeben müßte. Diese Pointer müßtest du in einer
Schleife getrennt initialisieren.

uint8_t * bilder;

bildbayte = *(bilder+1024*x+y);

für den Zugriff auf Bild x an Byte y sollte aber funktionieren.

Matthias
Gast #119355
Lesenswert?
• ▲
▼
Super, Danke !
Das mit der vorgestellten 0 hat schonmal funktioniert.
Das mit den Pointern bekomme ich dann hoffentlich auch noch hin, sowas
lernt man leider in der Schule in Informatik nicht. Und die meisten C
Tutorials sind für Mikrocontroller eher weniger zu gebrauchen.
Gast #119356
Lesenswert?
• ▲
▼
Eine frage habe ich noch zu dem Pointer:
Wie bekomme ich die Adresse a0000h in den Pointer ?
In allen Beispielen werden nur Variablenadressen mit
Pointer=&Variable geladen, aber ich muss benötige ja sowas wie
Pointer = a0000h, was aber in einem Fehler beim Compilen endet.
Gast #119358
Lesenswert?
• ▲
▼
So habe ich das auch gemacht, der Compiler meldet keinen Fehler, aber
auf dem LCD erscheint etwas, das eher nach Programmcode aussieht.
Im Debugger sieht man, dass der Pointer nicht mit A0000h initialisiert
wird, sondern mit 0. Aber die Software ist doch OK, oder ?


    char *_far Bilddaten;

    Bilddaten= (unsigned char *)0xA0000;

    for (y=0; y<8; y++)
      for (x=0; x<256; x++)
          {SendCom (29);   //Data Write
           SendDat (*Bilddaten);
           Bilddaten++; }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren