Startadresse vom Ram Code im Flash

Gast #4668952
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
#4668981
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?
Gast #4719332
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren