2009-07-03 5 views
7

Próbuję zmierzyć czasy cylindrów potrzebne do wykonania fragmentu kodu na TMS32064x + DSP dołączonego do OMAP ZOOM 3430 MDK. Patrzę na "Przewodnik programisty" układu DSP i mówi, że DSP obsługuje funkcję clock().Czy na moim sprzęcie jest uszkodzony zegar czasu.h()?

Co mogę zrobić, to bardzo proste, po prostu zrobić

start = clock(); 
for (i=0;i<100;i++){ 
    /* do something here */ 
} 
stop = clock(); 
total = stop - start; 

a następnie umieścić wartości "start", "stop" i "całkowite" do uprzednio przydzielonej pamięci współdzielonej z procesorem ARM. Następnie po prostu wydrukuję go na ekranie po stronie ARM.

Problem polega na tym, że w moich pierwszych wykonaniach zawsze otrzymuję taką samą "całkowitą" wartość, a następnie w następnych biegach zawsze otrzymuję 0! Wartości "start" i "stop" są zgodne z wartością "całkowitą".

Najdziwniejsze jest to, że wydają się podążać za wzorem! Włożyłem poniżej wynik:

# ./sampleapp 
Total = 63744 
Start clock() value = 0x000000f9 
Stop clock() value = 0x0000f9f9 
# ./sampleapp 
Total = 4177526784 
Start clock() value = 0x00f9f9f9 
Stop clock() value = 0xf9f9f9f9 
# ./sampleapp 
Total clock cyles = 0 
Start clock() value = 0xf9f9f9f9 
Stop clock() value = 0xf9f9f9f9 

Apparantly, zegar() nie działa dobrze, ale nie jestem pewien, czy to dlatego, że coś robię źle albo z powodu tego typu rzeczy nie jest obsługiwany ze sprzętem Mam. Jakieś pomysły, dlaczego tak się dzieje?

+0

Czy masz pewność, że zegar zwraca te wartości? Być może właśnie patrzysz na problem z dostępem do pamięci współdzielonej? – Vicky

+0

Aby to sprawdzić, po prostu zmieniam jedną z zwracanych wartości, powiedz "start", do wartości predefiniowanej lub do wartości pamięci dzielonej i otrzymuję poprawną rzecz na ekranie. –

+0

Czy TI ma jakieś przykłady? Myślę, że z niektórymi innymi przykładami CODEC również obliczali czas wykonania. Nie pamiętam, czy użyli api zegara(). Wygląda jednak na to, że działa w kodzie przykładowym dekodera lub kodera. – simon

Odpowiedz

2

Odczytując dotychczasowe pytania, powiedziałbym, że oryginalny plakat ma znacznie więcej wiedzy na ten temat niż dotychczas współpracownicy oraz że podejrzenie, że zegar() jest zepsuty (lub nie obsługiwany, i zwraca niezdefiniowany wynik) na DSP wydaje się dość prawdopodobne.

+0

Zacząłem wierzyć, że tak też jest, więc nie ma potrzeby zostawiać tego pytania bez odpowiedzi. Dziękuję wam wszystkim. –

+0

Jak skromni jesteście, Can Bal, że zaczęliście zgodzić się wierzyć, że macie znacznie więcej wiedzy niż współpracownicy i wybrani jako odpowiedź tego, który ją podaje. nice :) Zgadzam się, że clock() jest również uszkodzony na OMAP. – ustun

+0

Wygląda na to, że nie jesteś jedyną osobą mającą problem z zegarem(). Być może pomocne będą tutaj przedstawione rozwiązania. http://stackoverflow.com/questions/588307/c-obtaining-milliseconds-time-on-linux-clock-doesnt-seem-to-work-properly – Matt

0

Ciekawie, dlaczego potrzebna jest uprzednio przydzielona pamięć współdzielona. Dlaczego nie spróbujesz z normalną zmienną stosu? Czy jest coś, czego mi brakuje?

+2

Tak, brakuje ci tego, że wyświetlony kod działa na jednym procesorze, procesorze DSP, podczas gdy kod wyświetlający wyniki działa na innym, głównym procesorze ARM. – unwind

0

Może najpierw trzeba zainicjować zegar.

+0

Z tego co wiem, clock() przyjmuje punkt odniesienia jako początkowe wywołanie pliku wykonywalnego. Nie wiem jak ręcznie zainicjować/zresetować jego wartość. Jak to robisz? –

+0

Właśnie przeczytałem ponownie strony podręcznika, standard nie daje żadnego sposobu na zrobienie czegoś takiego. – swegi

0

W jaki sposób to drukujesz? może problem polega na wyświetlaniu wyniku?

na większości platform clock_t to długo. Jeśli używasz printf z% d, możesz uzyskać zmienne wyniki, które widzisz.

+0

Wydrukowałem sizeof (clock_t) i jest 4. Jest on zdefiniowany jako unsigned int. –

+0

Aby utrzymać się w tym stanie, czy kod drukowania jest sprawdzony? Czy podałeś jakieś wartości za pośrednictwem tego samego rodzaju transferu/wydruku pamięci, aby sprawdzić, czy są one poprawnie dopasowane? – DevSolar

0

Zakładając, że zmienna początkowa i końcowa są typu "clock_t", a pamięć współdzielona przyjmuje to samo na podstawie interpretacji drugiego końca przekazywanych liczb, problem nie dotyczy wywołania zegara i obsługi różnica między początkowymi czasami końca.

Wierzę, że twój problem jest we wspólnej pamięci między tymi dwoma. Czy możesz opublikować kod, aby pokazać, jak dzielisz pamięć między dwoma oddzielnymi procesorami?

+0

Po prostu używam tej samej metody TI, która jest używana przez jej próbkę dmmcopy. MPU boku próbki: http://gitorious.org/ti-dspbridge/userspace/blobs/master/source/samples/mpu/src/dmmcopy/dmmcopy.c DSP próbki: http: // gitorious. org/ti-dspbridge/userspace/trees/master/source/samples/dsp Ale nie sądzę, że problem dotyczy pamięci współdzielonej, ponieważ mogę poprawnie przekazywać zakodowane wartości z procesora DSP do procesora, a nie z punktu początkowego i zmienne całkowite. –

0

Być może możesz użyć jakiegoś wbudowanego zestawu, aby uzyskać bezpośredni dostęp do rejestrów liczników procesora.

Model TMS320C64x + ma 64-bitowy rejestr znaczników czasu w TSCL, TSCH. Licznik nie jest włączony przy resetowaniu, musisz najpierw napisać do rejestru, aby rozpocząć licznik (może to jest problem z clock?). Czytanie z rejestru nie jest dość banalne, ponieważ każda połowa musi być czytana osobną instrukcją (i można uzyskać przerwania ...).

+0

Nie wiedziałem, że to stare pytanie. To właśnie dostaję za nie zwracanie uwagi na znaczniki czasu! –

Powiązane problemy