mikrocontroller.net

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


Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Martin Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.