mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Code im Flasch wird überschrieben ??


Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leutz,

ich versuche gerade, ein Laufschriftboard in C aufzusetzen.
Allerdings hab ich grosse Probleme mit der Zeichentabelle.
Proz: Atmel AVR 90S8535 (8k Flash, 512Byte RAM)

Diese ist als 2-dimensionales Array angelegt:

static const unsigned char array[83][5]={/*{0,0,0,0,0},*/
{0,0,242,0,0},
{0,224,0,224,0},
{40,254,40,254,40},
.......
};

Die ist schon gekürzt (normalerweise wärens über 100 Zeichen)

Füge ich zur Darstellungsroutine noch etwas Code hinzu, so werden die
letzten Zeichen nur noch als Datenmüll angezeigt.

Schreibt der das Array ins RAM (415 Byte) oder bleibt das zur
Bearbeitung im Flash ?
Warum zerstört das Hinzufügen von Code meine letzten Zeichen
(aufsteigend) ?


Vielen Dank für die Hilfe!

Greetz,
Thorsten

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
welcher Compiler?
static const kommt mir irgendwie komisch vor - static bedeutet
RAM-Variable, die nicht überlagert wird. Sinnvollerweise sollten
Konstanten aber im ROM abgelegt werden (was du ja wahrscheinlich
willst). Wahrscheinlich läuft dir der Stack in den Datenbereich.

Versuchs mal so:
const unsigned char test[...];
oder
flash unsigned char test[...];

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

mit const unsigned char hab ichs auch schon probiert, dann gibtz gar
keine ausgabe mehr aufm LED-Display.

Meine Ausgabe:
//Spalten:
unsigned char binary[5]={1,2,4,8,16};
...

for(j=0; j<=4; j++)
{
 PORTB = binary[4-j];
 PORTC = array[i][j];
 delay_ms(1);
}


Greetz,
thorsten

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aufgrund der Harvard-Architektur der AVRs werden konstante Variablen aus
dem Flash-ROM ins RAM kopiert, es sei denn, die Konstanten werden
explizit so deklariert, daß sie nur im Flash abgelegt werden. Dann aber
sind für den Zugriff auf die Variablen auch spezielle Operationen
erforderlich.

Ein Beispiel findest Du in diesem Thread:
http://www.mikrocontroller.net/forum/read-1-154143...

Autor: Mark Hämmerling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salve,

falls Du gcc mit avr-libc verwendest, schau mal in die Doku der
avr-libc. Dort steht, wie Du solche Daten in den Flash bekommst.
Stichwort "pgmspace.h".

Denn ja, der Compiler legt Dein Array in den RAM. Da hilft (leider)
auch kein "const".

Um die Daten dann zu lesen, benötigst Du ein pgm_read_byte(), was aber
als Maschinencode nicht (oder nicht wesentlich?) aufwendiger ist als
ein RAM-Lesevorgang. Insofern sehr empfehlenswerte Methode.

Mark

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Compiler (zum 2.Mal)?

Autor: Mark Hämmerling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salve,

hmpf ich sollte vor dem Losschreiben doch nochmal einen Reload
machen. Es sieht so aus, als hätte ich nur von Rufus abgeschrieben. :)

Allgemein mal ne Frage zu anderen Compilern (kenne nur den gcc)...
verhalten sich alle AVR-C-Compiler so, daß sie unabhängig vom
const-Attribut Variablen ins RAM legen? Würde mich nur mal
interessieren.

@Thorsten... bzgl. Deines Betreffs: Prost! ;)

Mark

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Compiler:
WinAVR-20050214 (AVR-gcc)

greetz,
tho

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei CodeVision wird es, wenn ich Speicherklasse  "flash" angebe, auch
im flash (und nur dort!) abgelegt.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rennt .... (scheinbar)

schnippsel:

static unsigned char feld[83][5] PROGMEM ={/*{0,0,0,0,0},*/
{0,0,242,0,0},
{0,224,0,224,0},
{40,254,40,254,40},
...


Greetz & many theanx for help,
thorsten

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...frage ist nur, warum dass "static" sein muss ...
ohne rennts net.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"@Thorsten... bzgl. Deines Betreffs: Prost! ;)"

sry, vertippzt gehabt ;-))

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"...frage ist nur, warum dass "static" sein muss ...
ohne rennts net."

Wo ist denn der Schnipsel untergebracht? Etwa innerhalb einer
Funktion?!

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.