Programuję w Keil Board i próbuję policzyć liczbę okresów zegara, które zostały wykonane przez blok kodu wewnątrz funkcji C.

Czy istnieje sposób na uzyskanie czasu z dokładnością do mikrosekund przed i po bloku kodu, aby uzyskać różnicę i podzielić ją przez liczbę okresów zegara na mikrosekundę, aby obliczyć okresy zegara zużyte przez blok?

Funkcja clock() w time.h podaje czas w sekundach, co da różnicę jako 0, ponieważ jest to mały blok kodu, dla którego próbuję uzyskać okresy zegara.

Jeśli nie jest to dobry sposób na rozwiązanie tego problemu, czy istnieją alternatywy?

1
rutxkl 19 luty 2012, 13:52

3 odpowiedzi

Najlepsza odpowiedź

Zapoznaj się z licznikami czasu w chipie, znajdź taki, którego używasz w systemie operacyjnym/środowisku, którego używasz, i używaj go bezpośrednio. Wymaga to pewnej praktyki, musisz użyć volatiles, aby nie pozwolić kompilatorowi na zmianę układu kodu lub ponowne odczytanie licznika czasu. I musisz wyregulować preskaler na zegarze, aby uzyskać najbardziej praktyczną rozdzielczość bez przewracania się. Więc zacznij od dużego dzielnika przedskalowania, przekonaj się, że się nie przewraca, a następnie skróć ten dzielnik przedskalowania, aż osiągniesz dzielenie przez jeden lub osiągniesz pożądaną dokładność. Jeśli dzielenie przez jeden nie daje wystarczającej wartości, musisz wielokrotnie wywoływać funkcję w pętli i czas wokół tej pętli. Pamiętaj, że za każdym razem, gdy zmienisz kod, aby dodać te pomiary, możesz i zmienisz wydajność kodu, czasami na tyle małą, aby nie zauważyć, czasami 10% - 20% lub więcej. jeśli używasz pamięci podręcznej, każdy wiersz kodu, który dodasz lub usuniesz, może zmienić wydajność o dwucyfrowe wartości procentowe i musisz dowiedzieć się więcej o synchronizowaniu kodu w tym momencie.

5
old_timer 19 luty 2012, 19:14

Najlepszym sposobem policzenia liczby cykli zegara w świecie osadzonym jest użycie oscyloskopu. Przełącz pin GPIO przed i za blokiem kodu i zmierz czas za pomocą oscyloskopu. Zmierzony czas pomnożony przez częstotliwość procesora to liczba wykorzystanych cykli zegara procesora.

3
ouah 19 luty 2012, 14:34

Pominąłeś informację, jaki procesor znajduje się na płycie (znacznie ważniejszy niż marka płyty!), jeśli procesor zawiera ETM i masz ULINK-Pro lub inny debugger obsługujący śledzenie, uVision może dyskretnie profilować wykonywany kod bezpośrednio na poziomie cyklu instrukcji.

Podobnie, jeśli uruchamiasz kod w symulatorze uVision, a nie na prawdziwym sprzęcie, możesz uzyskać dokładne profilowanie i synchronizację cyklu bez potrzeby obsługi śledzenia sprzętu.

Nawet bez możliwości śledzenia funkcja „stopera” uVision może bezpośrednio mierzyć czas między dwoma punktami przerwania. Stoper znajduje się na dole IDE na pasku stanu. Musisz ustawić częstotliwość zegara w konfiguracji śledzenia debuggera, aby uzyskać „czas rzeczywisty” ze stopera.

Prostym podejściem, które nie wymaga żadnych specjalnych możliwości debugowania ani symulatora, jest użycie dostępnego urządzenia peryferyjnego timera (lub, w przypadku urządzeń Cortex-M, sysclk) do oznaczenia czasu początku i końca wykonania sekcji kodu, lub jeśli nie masz dostępnego zasób taktowania, możesz przełączyć pin GPIO i monitorować go na oscyloskopie. Te metody mają pewien poziom narzutu oprogramowania, który nie jest obecny w śledzeniu sprzętu lub symulatora, co może sprawić, że będą nieodpowiednie dla bardzo krótkich sekcji kodu.

1
Clifford 20 luty 2012, 18:49