Hallo Zusammen, ich habe folgendes Problem. Ich möchte mehrere bilder auf meinem Mikrocontroller Speichern, die ich dann auf einem display anzeigen kann. ich hab die Bilder folgendermaßen als Variablen deklariert: unsigned char picture[] = { 0x00,0x3A,.... }; wenn ich nun 3 Bilder der Größe 240*128 Pixel anlege (entspricht 32 char arrays mit jeweils 3840 char), wird eines der Bilder nicht mehr vollständig angezeigt. liegt das daran, dass die ilder im ram gespeicht werden und dieser nicht ausreicht. wenn ja, wie kann ich die bilder im flash ablegen? brauchen ja eigentlich keine variablen zu sein... irgendwelche vorschläge? ach ja : ich programmiere in c mit der entwicklungsumgebung Hitop von Hitex! Danke für eure Hife!!!
Hab gerade mehrere Möglichkeiten gefunden die Konstanten im Flash zu speichern, wurde in folgenden Beispielen für denselben Zweck benutzt. #include <avr/pgmspace.h> //WinAVR #include <progmem.h> //AVR-GCC const unsigned char code carbmp[]= { //Keil const rom unsigned char carbmp[]= { //Microchip C18 const unsigned char carbmp[]= { //SDCC prog_uchar carbmp[]= { //AVR-GCC, WinAVR Hab aber keine Ahnung wie das bei meinem GNU C Compiler funktioniert! hat jemand damit erfahrung?
Beim arm-elf-gcc sollte const unsigned char xyz[] reichen, damit landen die Daten dann in "rodata". Zugriff wie beim PC gewohnt (keine besondere Zugriffsfunktionen wie bei arm-gcc erforderlich). z.B. - im Header-File: extern const unsigned char font_mt1_glyph_table[]; - im C-File: const unsigned char font_mt1_glyph_table[] = { 0x00, 0x1F, ... bzw. im Beispiel oben ein const dazu: const unsigned char picture[] = ... Kann man relativ leicht mittels (arm-elf-)nm prüfen. Siehe auch Linker-Skript, um zu sehen, wo rodata "landet". Martin Thomas
Mein Linker-Skriptsieht so aus, ist für mich allerdings ziemlich nichtssagend: /******************************************* Memory Definitions *******************************************/ MEMORY { IntCode (rx) : ORIGIN = 0x00000000, LENGTH = 128k IntDataRAM (rw) : ORIGIN = 0x40000000, LENGTH = 16k } /******************************************* Section Definitions *******************************************/ SECTIONS { /*******************************************/ .text : { _code_start_ = .; objects\startup.o (.text) /* Startup code */ objects\*.o (.text) . = ALIGN(4); _code_end_ = .; *(.glue_7t) *(.glue_7) } >IntCode =0 . = ALIGN(4); /* .rodata section which is used for read-only data (constants) */ .rodata . : { *(.rodata) } >IntCode . = ALIGN(4); _etext = . ; PROVIDE (etext = .); /*******************************************/ .data : AT (_etext) { /* used for initialized data */ _data_start_ = . ; PROVIDE (_data_start_ = .) ; *(.data) SORT(CONSTRUCTORS) _data_end_ = . ; PROVIDE (_data_end_ = .) ; } >IntDataRAM . = ALIGN(4); _edata = . ; PROVIDE (edata = .); /*******************************************/ .bss : { /* used for uninitialized data */ __bss_start = . ; _bss_start_ = . ; *(.bss) . = ALIGN(4); _bss_end_ = . ; } >IntDataRAM /*******************************************/ .bss2 : { /* used for uninitialized data */ __bss2_start = . ; _bss2_start_ = . ; *(COMMON) . = ALIGN(4); _bss2_end_ = . ; } >IntDataRAM und was ist gemeint mit "(arm-elf-)nm prüfen"? bitte noch um ein wenig detailliertere Beschreibung. Danke für deine geduld! Grüße
Das .rodata . : { *(.rodata) } >IntCode sollte schon reichen. Mit "const" wird die "Variable" (Konstante) .rodata zugeordnet und rodata landet im "IntCode"-Bereich (wegen >IntCode), der bei 0 beginnt und damit im Flashspeicher (0 ist ein Alias für Start des internen Flash-Speichers wenn remapping nicht aktiv). Also einfach mit const ausprobieren. zu nm: Auch wenns abgedroschen ist: Die beste Beschreibung ist die Dokumentation. google: nm manual. Gleich auf der ersten Ergebnisseite schon Links zu brauchbarer Information. z.B. arm-elf-nm mit Namen der elf-Datei und Ausgabe umleiten: arm-elf-nm main.elf > egal.txt . In egal.txt findet man dann die Ausgabe mit den Adressen. Weiteres siehe Dokumentation. Für carbmp sollte mit dem const irgendwas mit 00.... (also im "Flash-Bereich") angegeben werden, ohne const landet carbmp in .data und nm sollte eine Adresse >=40000000 (also im "IntDataRAM") ausgeben.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.