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.