Genau, was reingeladen werden soll bestimmt man selbst, indem man im
Linkerscript das ITCM als eigenständigen Speicher deklariert. z.B.
(Achtung Adressen sind hier exemplarisch muss natürlich zum
Microcontroller passen)
1 | MEMORY
|
2 | {
|
3 | ...
|
4 | FLASHrwx) : ORIGIN = 0x00000000, LENGTH = 64K
|
5 | ITCM(rwx) : ORIGIN = 0x00200000, LENGTH = 8K
|
6 | ...
|
7 | }
|
Da fällt mir grad auf, klar kann man ins ITCM rein schreiben, sonst
würde das ja gar nicht funktionieren. Ich glaube beim DTCM kann man
keinen Code ausführen, so war das wohl :-)
Jedenfalls, dann die Sektion befüllt
1 | ...
|
2 | .itcm :
|
3 | {
|
4 | *muldi3*(.text .rodata)
|
5 | *memcpy*(.text .rodata)
|
6 | ...
|
7 | } >ITCM AT>FLASH
|
8 |
|
9 | /* symbole definieren um die positionen für relokierung
|
10 | * zu kennen */
|
11 | PROVIDE (itcm_start = ADDR(.itcm));
|
12 | PROVIDE (itcm_load_start = LOADADDR(.itcm));
|
13 | PROVIDE (itcm_load_end = LOADADDR(.itcm) + SIZEOF(.itcm));
|
14 | ...
|
Und dann Ganz wichtig, bevor irgend ein code aus dem ITCM ausgeführt
wird,
am besten direkt im Reset Handler
1. ITCM aktivieren (falls notwendig)
2.
1 | extern uint32_t itcm_start, itcm_load_start, itcm_load_end;
|
2 | uint32_t *dst, *src;
|
3 |
|
4 | /* Daten von Flash nach ITCM kopieren */
|
5 | dst = &itcm_addr;
|
6 | src = &itcm_load_start;
|
7 |
|
8 | while(src < &itcm_load_end)
|
9 | *(dest++) = *(src++);
|
Den letzten Schritt nennt man relokieren. Das muss gemacht werden bevor
auch nur eine Funktion aus dem ITCM genutzt wird, deswegen auch manuelle
Umsetzung des Memcopy.