Jak policzyc petle Wait/us/ms

Witam!

W jaki sposob obliczyc petle dla procedury Wait, Waitus i Waitms dla jezyka C? Bo chyba nie robi sie tego metoda na chybil-trafil;)

Reply to
Ania i Grześ
Loading thread data ...

To zalezne od procesora (nie napisane jaki), a i tak w C przyzwoitej procedurki nie da sie zrobic bez liczenia cykli w debugerze lub zagladania w assemblerowy kod wynikowy. Pisanie procedur wait w C radzil bym sobie odpuscic, chociaz da sie na luzie.

Najpierw tzeba dowiedziec sie ile czasu zajmuje procesorowi wykonanie danej intrukcji, po tym nalezy zbudowac procedure tak aby kazda petla trwala okreslony przez nas czas.

Wszystkie potrzebne dane mozna znalezc w dokumentacji danego procesora, i tak na przyklad dla procesora at89s8252 (8051 atmela) widzimy ze instrukcja nop trwa 1 cykl, zas jeden cykl zegarowy trwa 1/12 czestotliwosci pod jaka pracuje procesor. Wiec dla kwarcu 12Mhz wykonanie jednego cyklu (np: instrukcji nop) bedzie trwalo 1us.

12MHz = 12000000Hz 12 = dzielnik wewnetrzny 8051 (porostu cpu potrzebuje 12 'tikniec' zegara zeby wykonac instrukcje jedno cyklowa ;) ) 12000000 / 12 = 1000000 cykli na sekunde lub inaczej 1000000 instrukcji jednocyklowych w ciagu sekundy.

reasumujac musisz wiedziec:

1) ile cykli zajmuja instrukcje 2) ile czasu trwa jeden cykl

Funkcje waitus bedzie ciezko zaimplementowac bo to bardzo krotki czas, chyba ze nie musi byc bardzo dokladne np: z dokladnosci do 5-10us. Dla malych przedzialow czasowych i duzej dokladnosci zazwyczaj wstawia sie instrukcje bezposrednio w kod (a nie wykorzystuje sie funkcje delayus / o tym nizej).

// czekaj 1 us static __inline__ void us(void) { __asm__ volatile("nop"); }

i wywolanie (w C): us(); us(); us(); // 3us

kod wynikowy kompilatora bedzie wygladal tak:

nop nop nop // razem 3 cykle == 3us dla 12MHz

Wyzej napisalem wam/ci ze ciezko uzyskac taki odstep, dzieje sie tak dla tego ze samo wywolanie funkcji zajmie wiecej niz 1us (call - instrukcja 4 cyklowa) a do tego doliczyc tzeba bedzie petle, powrot z funkcji etc. No chyba ze jest to procesor wykonujacy wiecej niz jedna instrukcje na us :) dla standardowego 8051 zegar musial by miec chyba co najmniej 50 MHz.

Generalnie to liczenie powinno wygladac tak: piszemy procedurke w asmie lub w C. Jesli piszesz w C to musisz i tak spojrzec na kod wynikowy (assemblerowy)

delayms: // 4 dec reg // 2 dekramentuj licznik ms (argument funkcji) cmp reg,0 // 2 sprawdz czy nie zero jne delayms // 2 jesli nie to dalej petlimy ret // 4 wracamy

Liczysz sobie:

wywolanie: 4 cykle

1xpetla 6 cykli powrot 4 cykle

wiec: minimalnie 14cykli (4call/6petla/4ret) i w zaleznosci od wartosci w argumencie +6 cykli na petle. Dla 8051 z 12Mhz krysztalem bylo by to: 14ms minimalnie (delayms(1)) plus 6ms na petle. Czyli za pomoca takiej funkcji mozesz otrzymac delay od 14ms do 14+x*6ms.

W razie pytan walcie smialo...

btw: czasy trwania instrukcji jak i same instrukcje sa przykladowe, funkcje oczywiscie tez ;)

btw 2: na chybil trafil sie robi :) poprostu piszesz

void f(u_char ms) { for(x=ms;x!=0;x--) ; }

sprawdzasz w debugerze ile czasu to zajmuje i modyfikujesz opdowiednio ;P

btw 3: jak cos pokrecilem to sorki ;)

pozdr. LB

Reply to
drozdu
Reply to
invalid unparseable

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.