mikrocontroller.net

Forum: Compiler & IDEs ARM7: Daten im Flash ablegen


Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
edit: erledigt. Mods bitte löschen.

Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, noch nicht ganz:

Ich möchte beim Arm7 Daten im Flash ablegen:

const uint32_t  data_vw[] _attribute_ ((section(".rodata")))   = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x07, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,...

(Die Attribute Sache braucht man eigentlich  nicht, const reicht aus)


Soweit so gut, die Daten stehen bei .rodata drin. Es sind 8 Bit Daten, 
aber ich weiss nicht ob ich die mit uint32_t ablegen soll oder mit 
uint8_t, da der Arm7 nunmal 32 Bit Zellen hat.

Debugge ich dann mal los, um zu schauen, ob er die Daten auch holen kann 
schmiert der Debugger ins Nirwana beim Zugriff ab. Auch wenn ich die auf 
eine Variable zuweisen will, jeder Zugriff führt zum Debugger-Crash.


Aufruf mit
GDisplay_Show_Bitmap((uint32_t*)data_vw,sizeof(data_vw));


void GDisplay_Show_Bitmap(uint32_t *ptr,uint32_t size)
{
  volatile uint32_t i,j,k;

  for (i=0;i<size;i++)
  {
       k = (uint32_t)(*ptr)++;  // Hier ist Debugger weg!

  }

Der ptr Zeiger steht absolut richtig auf der Speicherzelle im Flash wo 
das erste Byte liegt. Lege ich die Daten ins interne Ram, lasse also 
"const" weg klappt es.

Hat vielleicht mal jemand ein Beispiel für den ARM (nicht AVR, da weiss 
ich wie es geht) wie man Daten ablegen und holen kann?

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du versuchst in dem Beispiel ins Flash zu schreiben. Das geht
so nicht. Das
uint32_t *ptr
 sollte auch ein
const uint32_t *ptr
 sein.

Wenn du ein Array aus Bytes brauchst dann kannst du das auch so
anlegen.
Folgendes ist also kein Problem:
const uint8_t* data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
void printData(const uint8_t* p, int size)
{
   for (int i = 0; i < size; i++) {
      rprintf("%u ", *p++);
   }
   rprintf("\n");
}

int main()
{
/* init...
   blah
   blupp
*/

   printData(data, sizeof(data)/sizeof(uint8_t)); // 9/1
}

Die Daten stehen dabei im Flash, wo sie mit 'const' auch hingehören.

Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
const uint8_t* data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

Dieser Ausdruck erzeugt: Initialization makes pointer from integer 
without a cast.

Ich habs aber schon. War schon so richtig, nur statt (*ptr)++ muss ich 
*(ptr++) schreiben. Die alte Falle...

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, das Sternchen muß da weg, sonst ist es ein Zeigerarray.
Passiert mir ständig...

Autor: Christian J. (elektroniker1968)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Klappt jedenfalls, die Bilddaten sind im Flash :-)

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.