Guten Abend,
ich möchte gerne verstehen wie der Cache arbeitet.
Weis jemand an welcher Adresse der Cache liegt? Hab den NVM Bereich
komplett ausgelesen aber nicht fündig geworden. Bzw. ich konnte irgendwo
im NVM Adress Bereich (Nach den Registern) Werte ermitteln die aber
keine Instruktionen darstellen.
Als Nächstes würde ich gerne verstehen ob man die Zyklen trotz Cache
genau berechnen kann oder ob die mehr oder weniger von unterschiedlichen
Faktoren abhängig sind.
Habe mal eine for Schleife ausgewertet und dazu mal Berechnungen
gemacht:
1 | //for(uint32_t X = 0; X<5000; X++);
|
2 |
|
3 | LDR R3, [PC, #136] <A> <2c>
|
4 | SUBS R3, #1 <B> <1c>
|
5 | CMP R3, #0 <C> <1c>
|
6 | BNE.N 732 <D> true = 1c else 2c
|
7 | _______________________
|
8 | ---Cache off
|
9 | 0WS --- 20003 = A+5000*(B+C+D2)+D1
|
10 | 1WS --- 30005 = A[+WS]+5000*(B[+WS]+C[+WS]+D2)+D1[+WS]
|
11 | 2WS --- 40007 = A[+WS]+5000*(B[+WS]+C[+WS]+D2)+D1[+WS]
|
12 | 3WS --- 50009 = A[+WS]+5000*(B[+WS]+C[+WS]+D2)+D1[+WS]
|
13 | _______________________
|
14 | ---Cache on
|
15 | 0WS --- 20003 = A+5000*(B+C+D2)+D1
|
16 | 1WS --- 20006 = ?
|
17 | 2WS --- 20009 = ?
|
18 | 3WS --- 20012 = ?
|
19 | _______________________
|
Der Cache wird hier eh erst richtig aktiv wenn Waitstates aktiviert
sind.
Ist das richtig das der Sprungbefehl keine Waitstates benötigt? Bzw. ist
die Berechnung so richtig? Die Anzahl der Zyklen habe ich durch den
systick Timer ermittelt.
Wie ist das nun wenn der Cache eingeschaltet ist, wie und warum kommt es
zu dieser Zyklus Zusammenführung?
BG
Umbrecht