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?
Wie wäre es mit einem anderen Timer? Du hast bei jedem STM32 mehrere Timer mit (Sub-)Mikrosekundenauflösung dabei.
ja, hab ich eben auch ausprobiert, funktioniert prinzipiell. Aber der SystickTimer wäre natürlich irgendwie komfortabel.
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 ;-)
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
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.