Hi, ich habe mal ne Frage zu der debug Funktion in der CooCox IDE im Zusammenhang mit dem STM32F4Discovery board. Ich würde gerne irgendwie sehen können wie viel Zeit die Ausführung einer Codezeile z.B. bei einem breakpoint benötigt. Also ich setzt z.B. vor einer for Schleife einen breakpoint und danach und möchte dann feststellen wie viel Zeit die Ausführung der for Schleife benötigt. Wie kann man das dort feststellen? thx Paul
Das kannst du machen indem du einen Timer einstellst und die Werte am Ende ausliest. Der Debugger kann das jedoch meines Wissens nach nicht. Also du musst das schon selber bauen.
du kannst dir auch am Anfang und am Ende der For-Schleife jeweils den aktuellen CPU-TIC-Wert "merken" die Differenz der beiden Werte entspricht "ungefähr" der Anzahl der CPU-Takte hier ein Beispiel :
1 | //--------------------------------------------------- |
2 | // DEBUG (fuer Zeitmessungen) |
3 | //--------------------------------------------------- |
4 | volatile unsigned int *DWT_CYCCNT = (volatile unsigned int *)0xE0001004; |
5 | volatile unsigned int *DWT_CONTROL = (volatile unsigned int *)0xE0001000; |
6 | volatile unsigned int *SCB_DEMCR = (volatile unsigned int *)0xE000EDFC; |
7 | uint32_t dbg_tstart; |
8 | uint32_t dbg_tstop; |
9 | uint32_t dbg_time; |
10 | //--------------------------------------------------- |
11 | |
12 | |
13 | void main(void) |
14 | { |
15 | |
16 | //--------------------------------------------------- |
17 | // DEBUG (fuer Zeitmessungen) |
18 | //--------------------------------------------------- |
19 | *SCB_DEMCR = *SCB_DEMCR | 0x01000000; |
20 | *DWT_CYCCNT = 0; // reset the counter |
21 | *DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter |
22 | |
23 | |
24 | |
25 | // hier soll die Zeit gemessen werden |
26 | dbg_tstart=*DWT_CYCCNT; // START |
27 | for(n=0;n<100;n++) { |
28 | // hier deine Funktion |
29 | } |
30 | dbg_tstop=*DWT_CYCCNT; // STOP |
31 | |
32 | // hier das Ergebnis der Messung |
33 | dbg_time=(dbg_tstop-dbg_tstart); // Differenz |
34 | |
35 | // 1TIC bei 168MHz = 5,9ns |
36 | |
37 | |
38 | while(1) { |
39 | |
40 | } |
41 | } |
hmm... also ich habe das so mal ausprobiert... das funktioniert leider gar nicht, start und stop tic sind leider immer gleich.
...sehr komisch, die Timer funktionieren wohl (LED blinken lassen etc.), ich habe das ganze jetzt einfach mit Timer1 als up counter mit prescaler 1 und period 1 gemacht, vor dem zu beobachtendem code den timer gestartet und nach dem code den counter wert geholt, der ist immer 0, was nicht sein kann da der code :
1 | uint8_t screenBuffer[4800]; //(640*480) / (8*8) |
2 | uint16_t tileBuffer0[16384]; //(8*8) * 256 |
3 | uint16_t line = 0; |
4 | uint16_t col = 0; |
5 | uint16_t screenBufferIndex; |
6 | uint8_t tileBuffer0LineOffset; |
7 | uint8_t tileBuffer0Col; |
8 | uint16_t tileBuffer0Index; |
9 | |
10 | TIM_Cmd(TIM1, ENABLE); |
11 | |
12 | for (line = 0; line < 480; line++) |
13 | {
|
14 | for (col = 0; col < 640; col++) |
15 | {
|
16 | screenBufferIndex = (line / 8) * 80 + (col /8); |
17 | tileBuffer0LineOffset = line % 8; |
18 | tileBuffer0Col = col % 8; |
19 | tileBuffer0Index = screenBuffer[screenBufferIndex] * 64 + (tileBuffer0LineOffset * 8) + tileBuffer0Col; |
20 | pixelLine[col] = tileBuffer0[tileBuffer0Index]; |
21 | }
|
22 | }
|
23 | |
24 | int timerValue = TIM_GetCounter(TIM1); |
jawohl eindeutig mehr Zeit als 5,9ns benötigt. Als ich Timer2 ausprobiert habe, habe ich ihn auch mal auf 1 Sekunde eingestellt (prescaler = 42000-1; period = 2000-1;) da war timerValue dann 303... alles sehr komisch...
Ohne deine Initialisierung kann hier wohl keiner was dazu sagen, ich glaube du hast den Timer/ Clocks/ Prescaler falsch konfiguriert...
Moin,
1 | #define CORE_SysTickEn() (*((u32*)0xE0001000)) = 0x40000001
|
2 | #define CORE_SysTickDis() (*((u32*)0xE0001000)) = 0x40000000
|
3 | #define CORE_GetSysTick() (*((u32*)0xE0001004))
|
damit müsste es gehen. Moritz
Paul schrieb: >mit prescaler 1 und period 1 und wie hoch denkst du, zählt ein "Counter" mit diesen Einstellungen ?!? (versuchs mal Prescale=1, Period=65000) Gruss
:
Bearbeitet durch User
PS: Der SysTick misst wie viele Clock Cyles vom beginn duchgelaufen sind. Also so:
1 | CORE_SysTickEn(); |
2 | uint32_t t1 = CORE_GetSysTick(); |
3 | for... |
4 | ...
|
5 | ...
|
6 | uint32_t t2 = CORE_GetSysTick(); |
7 | uint32_t dt = t2 - t1; |
Moritz
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.