Konstante in Flash ablegen - ARM7 LPC2119 von Philips

Gast #473663
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!!!
Gast #473669
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?
Gast #473741
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
Gast #473797
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
Gast #473959
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.