Forum: Mikrocontroller und Digitale Elektronik Startadresse vom Ram Code im Flash


von Tobi (Gast)


Lesenswert?

Hallo,
ich habe ein STM32F7 vor mir liegen und würde gerne Code im TCM 
ausführen.
Leider fehlt mir nur noch ein Schritt zum Funktionierenden Code.
Währen des Starts muss ich den Code aus dem Flash in den Ram kopieren.
Leider fehlt mir die Information wo der Code im Flash abgelegt wurde und 
wie lang er ist.
Wie kann ich mit dem Linkerscript eine Globale erzeugen, mit der ich die 
Informationen erhalte.

Hier ein Ausschnitt aus meinen Linkerscript:
1
MEMORY
2
{
3
  FLASH (rx)       : ORIGIN = 0x08000000, LENGTH = 1024K - 128K
4
  RAM (xrw)        : ORIGIN = 0x20010000, LENGTH = 256K
5
  ITCM_MEM (xrw)   : ORIGIN = 0x00000000, LENGTH = 16K
6
  DTCM_MEM (rw)    : ORIGIN = 0x20000000, LENGTH = 64K
7
}
8
  .itcm :
9
  {
10
      . = ALIGN(4);
11
      _sitcm = .;        /* create a global symbol at data start */
12
       *(.itcm);
13
      . = ALIGN(4);
14
      _eitcm = .;        /* define a global symbol at data end */
15
  } >ITCM_MEM AT>FLASH

Hier die Funtion die im TCM ausgeführt werden soll:
1
__attribute__( ( long_call, section(".itcm") ) )
2
float iir_filter(float x)
3
{
4
  if(x != x){
5
    x = 0;
6
  }
7
  z[0] = x - Za[1] * z[1] - Za[2] * z[2] - Za[3] * z[3];
8
  y =  Zb[0] * z[0] + Zb[1] * z[1] + Zb[2] * z[2] + Zb[3] * z[3];
9
  z[3] = z[2];
10
  z[2] = z[1];
11
  z[1] = z[0];
12
  return y;
13
}

Mfg Tobi

von Little B. (lil-b)


Lesenswert?

Die Addresse im Flash erhälst du mit LOADADDR()
1
MEMORY
2
{
3
  FLASH (rx)       : ORIGIN = 0x08000000, LENGTH = 1024K - 128K
4
  RAM (xrw)        : ORIGIN = 0x20010000, LENGTH = 256K
5
  ITCM_MEM (xrw)   : ORIGIN = 0x00000000, LENGTH = 16K
6
  DTCM_MEM (rw)    : ORIGIN = 0x20000000, LENGTH = 64K
7
}
8
9
SECTIONS
10
{
11
  _siitcm = LOADADDR(.itcm);
12
13
  .itcm :
14
  {
15
      . = ALIGN(4);
16
      _sitcm = .;        /* create a global symbol at data start */
17
       *(.itcm);
18
      . = ALIGN(4);
19
      _eitcm = .;        /* define a global symbol at data end */
20
  } >ITCM_MEM AT>FLASH

hilft dir das?

von hust (Gast)


Lesenswert?

Danke .. mir hat das geholfen.
Ich ergänze dann gleich etwas...


Ich hab jetzt auch ewig gesucht warum es im debugmode zwar funktioniert
aber nach einem Reset das gerät hängen bleibt.
Der Debugger scheint die Daten direkt reinzukopieren.

Ich habe die copy-funktion in der
1
extern unsigned long _siitcm;
2
extern unsigned long _sitcm;
3
extern unsigned long _eitcm;
4
5
void SystemInit(void)
6
{
7
  // copy to ITCM RAM !!!
8
  unsigned long *pulSrc, *pulDest;
9
  pulSrc = &_siitcm;
10
11
  for(pulDest = &_sitcm; pulDest < &_eitcm; )
12
  {
13
    *(pulDest++) = *(pulSrc++);
14
  }
15
.....

im .ld
1
  _siitcm = LOADADDR(.itcm);  
2
    /* ITCM RAM for critical functions */
3
  .itcm :
4
  {
5
    . = ALIGN(4);    
6
    _sitcm = .;        /* create a global symbol at itcm start */
7
    *(.itcm)
8
    *(.itcm*)    
9
    . = ALIGN(4);
10
    _eitcm = .;        /* define a global symbol at itcm end */
11
  } >RAM4 AT> ROM

funktionen landen mit
1
__attribute__((section(".itcm")))  void foo(){
2
   // code
3
4
}

im ITCM


Gerade bei rechenintensiven Funktionen boostet das ordentlich.
Ich habe den TJpgDec von elm chan hier laufen und erreiche so fast die 
doppelte Geschwindigkeit.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.