Dauer von Funktionen - Mikrosekundentimer

Gast #4938382
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.