mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STm32F103 und F407: Konstanten sicher ins Flash legen?


Autor: Christian J. (Firma: privat) (christianj)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich überlege grad, wie ich es sicher anstellen kann, dass der Linker 
Konstrukte wie

function(foo,"Ich bin ein Parameter");

oder

const* text = "Blablablab...... lange Geschichte"

sicher ins Flash packt und daraus nicht einen Initializer baut, der das 
dann alles im Ram kopiert beim Startup.

Ich habe mal mein Linker Script angepappt. Gibt es da sichere Methoden, 
dass der GCC Linker da RAM sparend arbeitet? Dem Compiler ist das ja 
egal der weiss ja nicht mal dass es Flash gibt.

Bei Variablen zwinge ich diese mit

#define CCRAM  __attribute__((section(".ccram")))
#define BKRAM  __attribute__((section(".bkram")))
#define RAM    __attribute__((section(".ram")))

Work_t   Work_Bk BKRAM;             // Instanz der Haupt Datenbasis im 
Backup RAM
Work_t   Work CCRAM;                // Arbeitskopie der Datenbasis im 
CCRAM

in ihren Bereich hinein, das map File zeigt mir auch an, dass das 
erfolgreich ist.

Aber wie zwingt man diesen String in den Flash hinein?
function(foo,"Ich bin ein Parameter");

Gruss,
Christian

: Bearbeitet durch User
Autor: A. S. (achs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Toolchain, die stringliterale nicht ins flash packt, ist kaputt 
oder kann nicht aus flash lesen.

Etwas anderes sind char-arrays oder String-Ptr. Oder irgend was gut 
gemeintes.

: Bearbeitet durch User
Autor: Christian J. (Firma: privat) (christianj)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
A. S. schrieb:
> Eine Toolchain, die stringliterale nicht ins flash packt, ist kaputt
> oder kann nicht aus flash lesen.

Ähm.... es liegt irgendwo alles im Flash ohne Strom. Aber dann kommt 
auch so ein böser Initilizer, der im Startup steht und packt schonmal 
alles ins RAM, wie zb die Initwerte statischer oder globaler Variablen. 
Und warum nicht auch Literale? Das weiss ich eben nicht.....

Autor: m.n. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian J. schrieb:
> const* text = "Blablablab...... lange Geschichte"

Warum sollte der Linker das ins RAM packen? Das Programm kann sich die 
Konstante sonstwo aus dem großen Adressraum holen.

Autor: Grummel Grummel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein kleines Testprogramm zeigt dass ein Textstring sehr wohl
im Flash (ab 0x8000_0000) liegt, siehe Adressraum des F103.

Das RAM wäre ja ab 0x2000_0000.
#include "stm32f10x_conf.h"
#include <stdio.h>

const char mytext[] = "bla bla bla bla bla bla bla bla bla bla bla bla ";
char  tmpstr[120];

int main(void)
{
  char *myptr;

  while(1)
  {
    myptr = (char *)&mytext[0];
    sprintf (tmpstr, "address of mytext is %08lx", (uint32_t)myptr);
  }
}

Autor: Mw E. (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haste denn Probleme oder ist das jetzt theoretischer natur?

Im Linkerscript wird .rodata wird zu .text zusammengefasst und ins ROM 
gepackt.
Einen temporären umkopierer seh ich da auch nicht.
Also alles gut.

Guck dir mal bei . data das AT() dahinter  an.
Das sorgt dafür, dass für den RAM gelinkt wird, aber es beim Image im 
ROM liegt.
"the AT keyword specifies the load address of the section"
Bei .text ist das nicht.

Autor: Christian J. (Firma: privat) (christianj)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Mw E. schrieb:
> Haste denn Probleme oder ist das jetzt theoretischer natur?

Nur informieren bei jenen, die es wissen bevor ich anfange nachher 
wieder alles ändern zu müssen, da ich kiloweise Text reinpacken will in 
die Bastelei. Die IDE verbirgt vieles vor dem User, es läuft aber eben 
so, wie die Bauer von EmBitz es vorsehen.

"the AT keyword specifies the load address of the section"
Bei .text ist das nicht.

Bin da nur rudimentär gebildet in Linker Scripten :-) Hauptsache sie 
funktionieren.....

>> sprintf (tmpstr, "address of mytext is %08lx", (uint32_t)myptr);

Und wo liegt "address of mytext" zur Laufzeit? Ich habe keine IDE offen 
grad..... haste mal das map File?

: Bearbeitet durch User
Autor: Grummel Grummel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian J. schrieb:
> Und wo liegt "address of mytext" zur Laufzeit? Ich habe keine IDE offen
> grad.....

In meinem Fall bei 0x0800_0d24.

Ok, vorher eine Null zuviel angegeben, Flash begint bei 0x0800_0000.

Autor: Christian J. (Firma: privat) (christianj)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
myptr = (char *)&mytext[0];

da reicht doch myptr = mytext, oder? Ein Array ist doch ein Vektor.

char *p = "Hallo";

lässt sich ja auch mit
p[0], p[1] etc ansprechen...

Autor: Grummel Grummel (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Christian J. schrieb:
> da reicht doch myptr = mytext, oder?

Willst du jetzt alle Syntax-Varianten durchspielen oder
willst du dein Problem geklärt haben?

Autor: Christian J. (Firma: privat) (christianj)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Grummel Grummel schrieb:
> In meinem Fall bei 0x0800_0d24.

Ich setze gleich auch mal einen Test auf, denn genau das ist meine 
Frage: Ist das wirklich so? Natürlich liegt das im Flash, wo sonst. Aber 
sobald das Programm läuft kopiert der Startup viel Zeugs ins RAM, wo es 
dann dieses reduziert. Beim Arduino habe ich damit das RAM total 
zugeballert, bis mir jemand erklärte wie es richtig geht. Nur ist ein 
AVR eben Harvard Struktur und der Cortex eine Von-Neumann Maschine. Da 
scheint dann wohl der Unterschied zu liegen....

Autor: Grummel Grummel (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Christian J. schrieb:
> Ist das wirklich so?

[] Du liest schon alle Beiträge zu deinem Thread?
[] Ist mir egal was die anderen schreiben.

Mw E. schrieb:
> Im Linkerscript wird .rodata wird zu .text zusammengefasst und ins ROM
> gepackt.
> Einen temporären umkopierer seh ich da auch nicht.
> Also alles gut.

Autor: A. S. (achs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grummel Grummel schrieb:
> Willst du jetzt alle Syntax-Varianten durchspielen oder
> willst du dein Problem geklärt haben?

Es ist ja noch die Frage, ob er ein Problem hat, oder nur Angst davor 
oder es sich durch kompensatorische Tricks erst schafft.

Autor: Christian J. (Firma: privat) (christianj)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Grummel Grummel schrieb:
>> Also alles gut.

Ja, scheint so.....  alles gut!

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.

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