Ich möchte auf dem Teensy 4.0 Board ein Programm laufen lassen mit dem man den Einfluss des Instruction-Cache sehen kann. Dazu habe ich mein Programm in FLASHMEM gepackt un den Cache disabled. Die Cache diable Routine habe ich von core_cm7.h (CMSIS). Jetzt sollte man meinen dass die Schleife langsamer läuft als mit Cache. Seltsamerweise hängt das empfindlich vom Rest des Programmes ab. Schltet man die angegebene Zeile ein oder aus geht auch das caching an oder aus. Was mache ich falsch? Wie schaltet man den Cache richtig aus?
1 | #define led 13
|
2 | |
3 | void SCB_DisableICache (void){ |
4 | asm("dsb"); |
5 | asm("isb"); |
6 | SCB_CCR &= ~(uint32_t)SCB_CCR_IC ; /* disable I-Cache */ |
7 | SCB_CACHE_ICIALLU = 0UL; /* invalidate I-Cache */ |
8 | asm("dsb"); |
9 | asm("isb"); |
10 | }
|
11 | |
12 | double xx ; |
13 | |
14 | FLASHMEM void setup() { |
15 | pinMode(led, OUTPUT); |
16 | Serial.begin(115200); |
17 | while(!Serial){} ; |
18 | Serial.print("Hello ARTICLEteensy40disableIcacheDemo1forumPost...\n"); |
19 | Serial.printf("setup=%08XH\n",setup) ; |
20 | SCB_DisableICache(); |
21 | |
22 | // if the following line is deleted a loop cycle needs 130ns,
|
23 | // if this line is enabled a loop needs 6.6ns
|
24 | Serial.printf("SCB_CCR & SCB_CCR_IC)=%08XH\n", SCB_CCR & SCB_CCR_IC ) ; |
25 | |
26 | Serial.printf("wait 5 secs...") ; delay(5000) ; |
27 | while(1){ |
28 | xx=0.0 ; |
29 | for(int k=0 ; k<20 ; k++){ |
30 | CORE_PIN13_PORTSET = CORE_PIN13_BITMASK; // here-1 |
31 | xx=xx+ 1.0 ; |
32 | CORE_PIN13_PORTCLEAR = CORE_PIN13_BITMASK; // here-2 |
33 | }
|
34 | Serial.printf("x=%15.10f\n",xx) ; |
35 | delay(50) ; |
36 | }
|
37 | }
|
38 | |
39 | void loop(){ |
40 | }
|