Forum: Mikrocontroller und Digitale Elektronik Konstante in Flash ablegen - ARM7 LPC2119 von Philips


von Roman (Gast)


Lesenswert?

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

von Roman (Gast)


Lesenswert?

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?

von Martin Thomas (Gast)


Lesenswert?

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

von Roman (Gast)


Lesenswert?

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

von Martin Thomas (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.