Forum: Mikrocontroller und Digitale Elektronik Instruction Cache disable auf ARM Cortex-M7 (Teensy 4.0)


von Martin O. (ossi-2)


Lesenswert?

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
  }

von Jim M. (turboj)


Lesenswert?

Lies mal das RM: Der Prozessor hat auch z.B. im FlexSPI einen (kleinen) 
Cache.

Könnte für die Schleife oben knapp reichen - und dann kommt es u.U. auf 
Alignments an, ob da nochmal was gelesen werden muss oder nicht.

Abschalten kann man nur den Cache im Cortex-M7 Core.

Ansonsten stellt sich mir spontan die Frage, in welchem Flash oder RAM 
der Code läuft. Das ist bei dem nicht mehr egal. FLASHMEM  impliziert 
FLASH, was o.g. Cache hat.

von Jürgen S. (starblue) Benutzerseite


Lesenswert?

Versuch mal, den Code im RAM laufenzulassen.

Flash ist vergleichsweise langsam (und hat deswegen wie schon gesagt 
eigene Cache- bzw. Prefetch-Logik).
Ich weiß nicht, wie es beim Teensy ist, aber z.B. beim LPC43xx mit 204 
MHz braucht das RAM keine Waitstates, Flash dagegen 9.

von Auweia (Gast)


Lesenswert?

> Versuch mal, den Code im RAM laufenzulassen.

> Flash ist vergleichsweise langsam (und hat deswegen wie schon gesagt
> eigene Cache- bzw. Prefetch-Logik).
> Ich weiß nicht, wie es beim Teensy ist, aber z.B. beim LPC43xx mit 204
> MHz braucht das RAM keine Waitstates, Flash dagegen 9.

Ja, aber:
Bei ARMen die beim Flash nur 1-3 Waitstates brauchen und intensiven
Gebrauch vom RAM beim Zugriff auf Daten machen, kann es passieren
das der Code vom Flash trotzdem schneller laeuft!
Da steht sich dann der RAM quasi selber im Weg weil die Zugriffe
serialisiert werden muessen.

Manche DSP haben DARAM (Dual-Access-RAM) und koennen zwei oder mehr
Zugriffe innerhalb eines Zyklus. Bei 300 MHz Clock resultieren da
dann knackige Zugriffszeiten von 1.5 ns...

von Jim M. (turboj)


Lesenswert?

Auweia schrieb:
> Bei ARMen die beim Flash nur 1-3 Waitstates brauchen und intensiven
> Gebrauch vom RAM beim Zugriff auf Daten machen, kann es passieren
> das der Code vom Flash trotzdem schneller laeuft!

Der i.MX im Teensy 4.0 hat mehr als einen internen RAM Block - aber nur 
externen Flash, der dementsprechend lange Zugriffszeit hat. Daher läuft 
Code aus dem internen RAM deutlich schneller solange der Cache nicht im 
Spiel ist.

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.