Forum: Mikrocontroller und Digitale Elektronik Dauer von Funktionen - Mikrosekundentimer


von STM32 (Gast)


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?

von Christopher J. (christopher_j23)


Lesenswert?

Wie wäre es mit einem anderen Timer? Du hast bei jedem STM32 mehrere 
Timer mit (Sub-)Mikrosekundenauflösung dabei.

von STM32 (Gast)


Lesenswert?

ja, hab ich eben auch ausprobiert, funktioniert prinzipiell.

Aber der SystickTimer wäre natürlich irgendwie komfortabel.

von Wolfgang (Gast)


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 ;-)

von Gerhard O. (gerhard_)


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.

: Bearbeitet durch User
von chris (Gast)


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
}

von Dunst Troll (Gast)


Lesenswert?

Bei nicht hardwarebezogenen Funktionen kann man auch den Simulator 
verwenden, der zaehlt die Anzahl Operationen.

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.