CooCox IDE debugging STM32F4Discovery

Gast #3495754
Lesenswert?
• ▲
▼
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
#3495826
Lesenswert?
• ▲
▼
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
}
Gast #3505932
Lesenswert?
• ▲
▼
...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...
Gast #3506231
Lesenswert?
• ▲
▼
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
Gast #3506238
Lesenswert?
• ▲
▼
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.