Dauer von Funktionen - Mikrosekundentimer

Gast #4938382
Lesenswert?
• ▲
▼
Hallo,

ich würde gerne die genaue Operationenzahl bzw. die Dauer von Funktionen 
angezeigt bekommen können.

Wenn ich HAL_GetTick() nutze, und mir vor und nach Ablauf einer Funktion 
eine Variable setze, dann erhalte ich mit dieser Funktion nur 
Millisekundenauflösung.
Der Takt liegt aber bei 180MHz, so dass eine um bis zu 180.000 
niedrigere Teilung zu beobachten sein sollte.

Ganz soviel muss es nicht sein, aber etwas feiner aufgelöst wäre schön.
Welche Möglichkeiten habe ich dafür?
Gast #4938493
Lesenswert?
• ▲
▼
STM32 schrieb im Beitrag #4938415:
> Aber der SystickTimer wäre natürlich irgendwie komfortabel.

Dann musst du wohl für deinen Komfort etwas tun und dir um einen deinen 
Wünschen entsprechend schnell getakteten Timer eine Komfortzone 
errichten ;-)
#4938505
Lesenswert?
• ▲
▼
Man könnte ein Oszilloskop zur Messung verwenden. Gleich am Anfang der 
Funktion einen Pin auf High stellen und vor dem Return wieder auf Low 
setzen. Die Zeit wo der Pin hoch bleibt ist dann proportional der 
Verweildauer. Das ist in vielen Fällen ausreichende Genauigkeit. Die 
zusätzliche Zeit zum Pin setzen kann man meist vernachläßigen.

In meiner Praxis kam ich bisher ganz gut mit dieser Methode zurecht.

Ein ganz findiger Kopf nahm übrigens dazu mal einen DAC der für jede zu 
beobachtende Funktion eine verschiedene Spannung am DAC programmierte. 
Mit dem Oszi kann man dann sehr schön sehe wie viel Zeit wichtige 
Programmteile wo verbringen. Man sieht dann am Oszi ein Stufenbild 
presentativ der Verweilzeit. Die Idee stammt nicht von mir und ich kann 
mich auch gar nicht erinnern von wo ich das jetzt her habe.

Mfg,
Gerhard

Nachtrag: Man kann auch an der relativen Helligkeit einer LED abschätzen 
wie viel Zeit wo in einer Funktion verbracht wird. 
Helligkeitsveränderungen können Aufschluß über veränderliche Zeitdauern, 
die z.B. durch konditionelle Responses enstehen können, geben.
Gast #4938526
Lesenswert?
• ▲
▼
1
// Sys-Tick Counter - Messen der Anzahl der Befehle des Prozessors:
2
#define CORE_SysTickEn()      (*((u32*)0xE0001000)) = 0x40000001
3
#define CORE_SysTickDis()      (*((u32*)0xE0001000)) = 0x40000000
4
#define CORE_GetSysTick()      (*((u32*)0xE0001004))
5
#define CORE_ClearSysTick()      (*((u32*)0xE0001004)) = 0
6

7

8
void start_cnt()
9
{
10
  CORE_ClearSysTick();
11
  CORE_SysTickEn();
12
}
13

14
void stop_cnt()
15
{
16
  CORE_SysTickDis();
17
}
18

19
uint32_t get_cnt()
20
{
21
  uint32_t cycles;
22

23
  stop_cnt();
24
  cycles = CORE_GetSysTick();
25

26
  return cycles;
27
}
28

29

30
uint32_t duration;
31

32
int main()
33
{
34
  start_cnt();
35
  test_funktion();  // laufzeit dieser Funktion messen
36
  duration = get_cnt();
37

38
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren