Hallo allerseits,
ich habe auf Stackexchange diesen Vorgang gefunden. [1] "Number of
Cycles"
Zunächst die erste Frage an die Profis: Macht der Kram exakt das, was er
machen soll?
Nun zu meiner Beobachtung: Führe ich einfach folgendes aus:
1 | reset_timer();
|
2 | start_timer();
|
3 | stop_timer();
|
und lasse mir das Ergebnis von getCycles() ausgeben, so erhalte ich die
Zahl "35". Führe ich eine Multiplikation zweier 32-Bit Zahlen aus,
erhalte ich ebenfalls 35.
Selbst bei 40k rekursiven Additionen wird mir der Wert 35 ausgegeben.
Führe ich eine selbstprogrammierte Operation (GF(p^16) Multiplikation)
durch, erhalte ich einen von 35 abweichenden Wert. Aber die Anfängliche
Ausgabe irritiert mich sehr und daher stelle ich Zweifel an diese
Benchmarkingvorgehensweise.
Mein Board ist übrigens das Cortex M4: STM32F407VGT6 auf einem CJMCU
Board.
[1]
https://stackoverflow.com/questions/32610019/arm-m4-instructions-per-cycle-ipc-counters
Edit: Vlt. hätte ich mir mal den Code genauer anschauen müssen. Dort
wird ein Bit durch eine "Oder" Operation aktiviert.. das kann nicht
klappen :D
Vorschlag:
1 | void start_timer(){
|
2 | *DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter
|
3 | }
|
4 |
|
5 | void stop_timer(){
|
6 | *DWT_CONTROL = *DWT_CONTROL & 0xFFFFFFFE ; // disable the counter
|
7 | }
|
und
1 | void reset_timer(){
|
2 | DWT_CYCCNT = (int *)0xE0001004; //address of the register
|
3 | DWT_CONTROL = (int *)0xE0001000; //address of the register
|
4 | SCB_DEMCR = (int *)0xE000EDFC; //address of the register
|
5 | *SCB_DEMCR = *SCB_DEMCR | 0x01000000;
|
6 | *DWT_CYCCNT = 0; // reset the counter
|
7 | *DWT_CONTROL = 0;
|
8 | }
|
Diese "Vorschläge" führen nun dazu, dass eine Ausgabe ohne Operationen
"19" und eine Multiplikation "uint32_t c = 0xFF*0xFFFF" 18 "cycles"
braucht. Da stimmt also immer noch was nicht ;)