Elektroda.pl
Elektroda.pl
X
Relpol
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] Funkcja sin(x) - ile taktów zegara?

coolrob 18 Cze 2008 11:50 6554 31
  • #1 18 Cze 2008 11:50
    coolrob
    Poziom 14  

    Witam,
    potrzebuje zrealizować interpolację kołową na uC, zależy mi na szybkim liczeniu sinusów, cosinusów itd. Do tej pory korzystałem z '51 (ADuC814) i w tym przypadku zaimplementowana funkcja float sin(float x) wykonuje się w zależności od argumentu w ok. 1500 - 3500 taktów zegara. Próbowałem szeregu Taylora, ale już przy piątej potędze czas operacji jest zbliżony a wynik rozjeżdża się przy najbardziej nieliniowym zakresie funkcji. Potrzebuje czegoś szybszego i nie wiem czy AVR czy ARM. Gdyby ktoś mógł sprawdzić ile zajmuje wykonanie takiej operacji..? (bez jakichś szczególnie aktywnych przerwań, z zaznaczeniem czy float czy double) Z góry dzięki.

    W dziale AVR zamieściłem analogiczne pytanie.

    0 29
  • Relpol
  • #2 18 Cze 2008 12:27
    Ch.M.
    Poziom 27  

    A mogłeś zamieścić tylko jeden wątek w dziale ogólnym...

    Jeśli zależy Ci na szybkości to polecam tablice, oczywiście jej wielkość będzie zależna od dokładności, jaką potrzebujesz. Nic szybszego nie wymyślono :)
    Pozdrawiam

    0
  • #3 18 Cze 2008 12:54
    Dr_DEAD
    Poziom 28  

    Trój potęgowa aproksymacja sinusa dająca dokładność +/-0.5% dla MSP430 zajmuje 880cykli zegarowych.

    Dodano po 4 [minuty]:

    Zapomiałem dodać że to dla FLOATA. Dla DOUBLE zajmuje 1150 cykli zegarowych.

    0
  • #4 18 Cze 2008 15:15
    coolrob
    Poziom 14  

    Faktycznie, nie zauważyłem działu ogólnego, przepraszam.

    Dzięki Dr_DEAD, jest to jakiś punkt odniesienia.

    Muszę mieć około 125000 wartości sinusa na przedziale (0, 2pi), cosinus da się przesunąć o pi/2, ale potrzebny jeszcze arcus sinus, więc tablica floatów musiałaby być rzędu 2MB, dla double 2x większa... Oczywiście to rozwiązanie oprócz szybkości ma również ten plus, że zawsze wykonuje się w takim samym czasie.
    Myślałem bardziej o procesorach ARM, np. LPC2XXX, AT91XXXX itd.

    0
  • #5 18 Cze 2008 15:45
    Freddie Chopin
    Specjalista - Mikrokontrolery

    ciekawe po co ci te 125k wartosci, skoro wartosci od 0 do pi/2 powtarzaja sie od pi do 3/2*pi tyle ze z minusem. do tego zakres pi/2 do pi to jest zakres 0 do pi/2 tyle ze odwrotnie.

    tym prostym sposobem z 125k zostalo 31.5k wartosci. taka tablica floatow zajmuje 126kB, dwie takie (skoro jeszcze ma byc arcsin) zajma 256kB, czyli wejda w kazdego wiekszego ARMa.

    4\/3!!

    0
  • #6 18 Cze 2008 16:13
    coolrob
    Poziom 14  

    Sądzę, że jeśli przyjąłbym rozwiązanie z tablicą, to nie byłby ARM.

    0
  • #7 18 Cze 2008 19:02
    Freddie Chopin
    Specjalista - Mikrokontrolery

    tak samo masz duze AVRy i duze PICe. pozatym mozna uzyc dodatkowego szeregowego (albo i nawet rownoleglego) flasha.

    4\/3!!

    0
  • Relpol
  • #8 18 Cze 2008 19:04
    Ch.M.
    Poziom 27  

    coolrob napisał:
    Sądzę, że jeśli przyjąłbym rozwiązanie z tablicą, to nie były ARM.

    Rozumiem , że miało być:
    Cytat:
    Sądzę, że jeśli przyjąłbym rozwiązanie z tablicą, to nie byłby ARM.

    Większe ATMegi też mają 256kB Flash.
    Równie dobrze możesz połączyć jakaś zewnętrzną pamięć flash.

    0
  • #9 18 Cze 2008 19:15
    coolrob
    Poziom 14  

    Hmm no ogólnie znam rozwiązanie z tablicowaniem wartości i jestem w stanie sobie policzyć szybkość takich operacji, dlatego właśnie w poście pytałem o co innego... Bo bez sensu żebym montował nowego procka, zaczytywał się w dokumentację tylko po to, żeby to zmierzyć. To cenne doświadczenie, ale cel mam wyznaczony i dlatego pytam tych, którzy już mają taki sprzęcik na biurku :)

    0
  • #10 18 Cze 2008 21:10
    Dr_DEAD
    Poziom 28  

    A można wiedzieć do czego potrzebujesz takiego sinusa??? Co cały algortym ma robić??

    0
  • #11 18 Cze 2008 21:17
    mreq
    Poziom 21  

    Patrzyłem teraz do tablic matematyczno-fizycznych taka tablica jest od 0° do 90° składa się z 90 x 10 kolumn ( co 6' ) każdą wartość zmieścisz w wordzie co daje 1800 bajtów + do tego tablica korekt (dokładność 1') 3 * 90 bajtów to nieco ponad 2kB a szybkość "liczenia" ogromna :)

    0
  • #12 19 Cze 2008 07:14
    shg
    Specjalista techniki cyfrowej

    avrlibc 1.5.1.20071030
    Na policzenie sin (1.2345) trzeba 1647 cykli w wypadku użycia rdzenia ze sprzętowym mnożeniem, dane z dokumentacji, o ile dobrze pamiętam to dotyczy to samego ciała funkcji sin(), bez ładowania argumentów i przepisywania wyniku.

    Oprócz szeregów Taylora można jeszcze skorzystać z algorytmu CORDIC.
    Jeżeli potrzebne są Ci kolejne wartości przesunięte zawsze o stały kąt, to można jednocześnie wartość sinusa i cosinusa otrzymać przez prostą operację obrotu punktu wokół środka układu współrzędnych (4 mnożenia dodawanie i odejmowanie). Niektóre implementacje FFT tego używają.
    Wadą tej metody jest to, że następuje tu akumulacja błędu wraz z kolejnymi iteracjami, więc co jakiś czas trzeba by aktualne wartości "odświeżyć". Można też połączyć tą metodę z tablicami, podobnie w wypadku szeregów i to nie tylko Taylora.

    0
  • #13 21 Cze 2008 13:47
    coolrob
    Poziom 14  

    Algorytm ma sterować tokarką CNC o dwóch osiach. Największa moc obliczeniowa potrzebna jest do sterowania ruchem po łuku: dany jest punkt początkowy, końcowy, środek okręgu oraz kierunek obrotu. Dokładność - działka elementarna - ma wynosić 0,01mm. Oprócz obliczenia kolejnego punktu położenia trzeba również obliczać aktualny punkt styczności materiału z nożem, który jest na końcu zaokrąglony np. promień 0,8mm.

    Jeśli łuk, po którym ma się poruszać nóż ma np. 20cm to obliczenia wymagają dokładności rzędu 0,003 stopnia, dla 50cm 0,001 stopnia. W radianach (najczęściej funkcje biblioteczne działają na nich) potrzeba jest dokładność do ok. 5-6 miejsca po przecinku, czyli na ganicy float oraz double (przy okazji - Keil dla '51 w ogóle nie wspiera double). Poza tym w dalszych planach ma być też możliwość gwintowania, a z tego co wiem to gwint chyba jest zaokrąglony na końcu. Te liczby raczej przekreślają rozwiązanie z tablicami. Przykład takiej obróbki:


    Link


    - a konkretniej 2.10 - 2.30 tego filmiku.



    Dzięki shg za info o AVR. Zastanawiam się nad własnościami podanymi w algorytmie CORDIC:

    [C] Funkcja sin(x) - ile taktów zegara?

    X2 = cos (f)*[X1 -/+ Y1 * tg(f)] '-' gdy kąt przesunięcia jest dodatni

    Y2 = cos (f)*[Y1 +/- X1 * tg(f)] '+' gdy kąt przesunięcia jest dodatni

    gdzie:

    f (fi) - kąt, o jaki przesuwamy wektor

    Dokładniej tutaj:

    http://wwwzpt.tele.pw.edu.pl/~ptomasze/ucyf/2005l/3/right.htm

    Można na początku wyliczyć stałą wartość cos(f) oraz tg(f), bo w moim przypadku kąt będzie się zmieniał właśnie o stałą wartość. Nie wiem jak by to wyszło dla obliczania punktu styku noża, ale mniejsza z tym. Poza tym ten algorytm kumuluje cały czas błąd niedokładności obliczenia początkowych wartości cos(f) i tg(f). Jeśli po drodze zrobimy korektę, to zaskutkuje to skokiem narzędzia. W sumie ważne jest, żeby dojechać do punktu końcowego, więc ten kumulowany błąd może nie byłby taki ważny, ale trzeba precyzyjnie znaleźć koniec drogi.


    Zaczynam coraz bardziej skłaniać się do ARM7, konkretniej LPC214x - są tanie, jest książka "LPC2000 - Mikrokontrolery z rdzeniem ARM7" - rozszerzenie kursu z EP autorstwa pana Lucjana Bryndza. Są 32-bitowe, więc domyślam się, że policzą to trochę szybciej niż 16-bitowy MSP430, a poza tym można włożyć kwarc np. 50MHz.

    Jeśli ktoś mógłby sprawdzić, ile zajmuje liczenie funkcji trygonometrycznych na ARM7 - byłoby super :D Dzięki za zainteresowanie tematem :D

    0
  • #14 21 Cze 2008 16:57
    Freddie Chopin
    Specjalista - Mikrokontrolery

    coolrob napisał:
    a poza tym można włożyć kwarc np. 50MHz

    po pierwsze to takiego kwarcu wlozyc nie mozna, a po drugie to procki te maja PLLa, ktory zrobi ci te 60MHz z dowolnego kwarcu w zasadzie.

    zainteresuj sie lepiej LPC23xx - sa tansze od serii LPC21xx i dzialaja na 72MHz. wada jest ... TQFP-100 <:

    4\/3!!

    0
  • #15 21 Cze 2008 17:23
    coolrob
    Poziom 14  

    Fakt, max. kwarc to chyba 25MHz a PLL robi 60MHz itd. Ale oczywiście chodzi o częstotliwość pracy CPU. Poczytam coś o LPC23xx. Zastanawiam się... może mógłbym sam sprawdzić szybkość wykonywania funkcji trygonometrycznych przez ARM na jakimś symulatorze? Do tej pory nigdy nie wierzyłem w symulatory :P

    0
  • #16 21 Cze 2008 17:51
    shg
    Specjalista techniki cyfrowej

    Z ARMami jest ten problem, że często Flash nie nadąża za rdzeniem i rdzeń musi czekać (waitstates). Symulator symuluje zazwyczaj flash bez opóźnień, stą wynik symulacji może się nie zgadzać z rzeczywistością. Rozwiązanie tego problemu jest proste jako sama idea, ale z wykonaniem może być gorzej. Funkcję obliczającą trzeba by przerzucić do pamięci RAM (ARM może wykonywać kod z RAMu). O ile nie jest to problem w wypadku własnych funkcji, to w wypadku funkcji z bibliotek może się już okazać niewykonalne. Dlatego konieczne może okazać się wklejenie do programu własnej funkcji sinus, czy innej. Żeby się nie męczyć, można ją skopiować z kodu źródłowego biblioteki math.

    Jeżeli zależy Ci na szybkości obliczeń, a AVR, czy '51 są za wolne, albo ma mocy obliczeniowej starczać "na styk", to chyba lepiej będzie od razu zacząć od ARM, zostawiając sobie potem jakieś pole do manewru.

    http://www.nabble.com/Whetstone-Benchmark-td14987664.html
    Stąd wynika, że ARM7 jest jakieś 4.5 razy szybszy od AVR, ale jak dokładnie wyglądały warunki testu, tego nie wiadomo.
    Ale... Z nową biblioteką math AVR jest dużo szybszy (w linku wyniki trochę niżej), prawie tak szybki jak ARM, a to przez to, że kod w bibliotekach dla ARM napisany jest w C, a w nowych bibliotekach dla AVR jest w asemblerze.

    0
  • #17 21 Cze 2008 18:51
    coolrob
    Poziom 14  

    Ooooo super! Tego właśnie szukałem, dzięki shg :)

    W tym teście ARM7 wykonywał instrukcje Thumb, czyli 16-bitowe. Zajmują one połowę mniej kodu, ale są wolniejsze dla operacji na liczbach 32-bit. Zastanawiam się, jak to jest w przypadku double? W sumie double zajmuje 64 bity. Nie wiem jak gcc to sobie organizuje.

    Odn. szybkości Flash w ARM - w prockach LPC2xxx Flash jest sprytnie zorganizowany 128-bitowo, przez co w jednym cyklu odczytu pamięci ładowane są 4 rozkazy ARM lub 8 rozkazów Thumb. Dodatkowo dostępny jest tzw. kontroler MAM (Memory Acceleration Module), który buforuje rozkazy. W sumie umożliwia to pracę z max. częstotliwością rdzenia bez cykli oczekiwania.

    0
  • #18 23 Cze 2008 20:18
    michalko12
    Specjalista - Mikrokontrolery

    coolrob napisał:
    Odn. szybkości Flash w ARM - w prockach LPC2xxx Flash jest sprytnie zorganizowany 128-bitowo, przez co w jednym cyklu odczytu pamięci ładowane są 4 rozkazy ARM lub 8 rozkazów Thumb. Dodatkowo dostępny jest tzw. kontroler MAM (Memory Acceleration Module), który buforuje rozkazy. W sumie umożliwia to pracę z max. częstotliwością rdzenia bez cykli oczekiwania.


    Tak jest jesli nie ma rozgałęzień w programie.

    0
  • #19 23 Cze 2008 22:09
    Freddie Chopin
    Specjalista - Mikrokontrolery

    tak czy siak jest to 3x szybsze niz Atmel. MAM ma przewidziany bufor na ostatni skok, wiec jesli w programie aktualnie jest jedna petla typu

    label:
    [instrukcje]
    b label

    to ona rowniez nie zwolni w MAMie. dopiero NOWY skok go zatrzyma na kilka taktow.

    4\/3!!

    0
  • #20 24 Cze 2008 00:22
    bobbyAIR
    Poziom 20  

    Jeśli już mowa o liczneniu w szybki sposób liczb ze zmiennym przecinkiem to może leprzy będzie kontroler który robi to sprzętowo. Np. 555 freescale'a

    0
  • #21 24 Cze 2008 23:18
    michalko12
    Specjalista - Mikrokontrolery

    Freddie Chopin napisał:
    tak czy siak jest to 3x szybsze niz Atmel. MAM ma przewidziany bufor na ostatni skok, wiec jesli w programie aktualnie jest jedna petla typu

    label:
    [instrukcje]
    b label

    to ona rowniez nie zwolni w MAMie. dopiero NOWY skok go zatrzyma na kilka taktow.


    I tu tez jest warunek, cały taki blok musi znajdowac się w granicy jednego bufora MAM. Może być poza buforem pod warunkiem że jest to skok do przodu w granice drugiego bufora 128b.

    0
  • #22 25 Cze 2008 01:26
    Freddie Chopin
    Specjalista - Mikrokontrolery

    hę?

    jest jeden bufor MAM, ktory przechowuje 4 instrukcje kolejne, oraz jeden, ktory przechowuje 4 instrukcje z poczatku ostatniego skoku. i nie wiem o jakich granicach tutaj mowisz.

    jesli jest to petla (skok ciagle w to samo miejsce) to MAM nie zwolni.

    4\/3!!

    0
  • #23 25 Cze 2008 08:05
    michalko12
    Specjalista - Mikrokontrolery

    Freddie Chopin napisał:
    hę?

    jest jeden bufor MAM, ktory przechowuje 4 instrukcje kolejne, oraz jeden, ktory przechowuje 4 instrukcje z poczatku ostatniego skoku. i nie wiem o jakich granicach tutaj mowisz.

    jesli jest to petla (skok ciagle w to samo miejsce) to MAM nie zwolni.



    Poczytaj jeszcze raz sobie o MAM i o zasadzie działania buforów!

    Cytat:
    Branches and other program flow changes cause a break in the sequential flow of instruction fetches described above. When a
    backward branch occurs, there is a distinct possibility that a loop is being executed. In this case the Branch Trail Buffers may
    already contain the target instruction. If so, execution continues without the need for a Flash read cycle. For a forward branch,
    there is also a chance that the new address is already contained in one of the Prefetch Buffers. If it is, the branch is again taken
    with no delay.

    0
  • #24 25 Cze 2008 09:50
    Freddie Chopin
    Specjalista - Mikrokontrolery

    raczej chyba ty powinienes to przeczytac, bo wyraznie pisze tam o DWOCH buforach MAM, z ktorych jeden (branch Trail Buffer) przechowuje poczatek ostatniego skoku .... blablabla... nie chce mi sie tego pisac po raz trzeci. przeczytaj moje poprzednie posty - wszystko co tam masz jest poparte tekstem, ktory przytoczyles, ergo - jest prawda.

    4\/3!!

    0
  • #25 25 Cze 2008 11:53
    michalko12
    Specjalista - Mikrokontrolery

    Freddie Chopin napisał:
    raczej chyba ty powinienes to przeczytac, bo wyraznie pisze tam o DWOCH buforach MAM, z ktorych jeden (branch Trail Buffer) przechowuje poczatek ostatniego skoku .... blablabla... nie chce mi sie tego pisac po raz trzeci. przeczytaj moje poprzednie posty - wszystko co tam masz jest poparte tekstem, ktory przytoczyles, ergo - jest prawda.


    Początek ostatniego skoku? Wiesz co piszesz? Pomyśl trochę na jakiej zasadzie działają te bufory. Nie ma żadnego przechowywania ostatniego skoku. Jest bufor (Branch Trail Buffer) z którego aktualnie pobierane sa instrukcje do wykonania, a w tym czasie do drugiego bufora (Prefetch Buffer) są ładowane dane z pamięci flash. Jesli tylko wyczerpie sie zasób instrukcji w Branch Trail Buffer to nowe instrukcje kopiowane są z Prefetch Buffer do Branch Trail Buffer a Prefetch Buffer pobiera kolejne z pamieci. To że jest możliwość pobrania naraz 128b z flasha to tylko dlatego że jest on w organizacji 128b i do bufora pobierane są instrukcje z wyrównaniem do 128b.
    Więc jeśli tylko taka pętla składająca się z dwóch instrukcji znajduje się na pograniczu 128b MAM musi cały czas przeładowywać bufory co skutkuje całkowitym spowolnieniem do prędkości akceptowalnej przez flash.

    A to co ty piszesz nie jest dla mnie żadnym odniesieniem.

    0
  • #26 25 Cze 2008 12:19
    Freddie Chopin
    Specjalista - Mikrokontrolery

    LOL <:

    Cytat:

    Początek ostatniego skoku? Wiesz co piszesz? Pomyśl trochę na jakiej zasadzie działają te bufory. Nie ma żadnego przechowywania ostatniego skoku.


    Cytat:

    The Branch Trail buffer captures the line to which
    such a non-sequential break occurs. If the same branch is taken again, the next
    instruction is taken from the Branch Trail buffer.
    When a branch outside the contents of the
    prefetch and Branch Trail buffer is taken, a stall of several clocks is needed to load the
    Branch Trail buffer. Subsequently, there will typically be no further instruction fetch delays
    until a new and different branch occurs

    [LPC23xx User Manual, s.76]


    Cytat:

    Jest bufor (Branch Trail Buffer) z którego aktualnie pobierane sa instrukcje do wykonania, a w tym czasie do drugiego bufora (Prefetch Buffer) są ładowane dane z pamięci flash. Jesli tylko wyczerpie sie zasób instrukcji w Branch Trail Buffer to nowe instrukcje kopiowane są z Prefetch Buffer do Branch Trail Buffer a Prefetch Buffer pobiera kolejne z pamieci.


    Cytat:

    When an Instruction Fetch is not satisfied by either
    the Prefetch or Branch Trail buffer, nor has a prefetch been initiated for that line, the ARM
    is stalled while a fetch is initiated for the 128 bit line.
    [LPC23xx User Manual, s.76]


    dodam tez, ze w calym rozdziale nie pisze nic o mechanizmie ktory przedstawiles (flash -> branch trail -> prefetch -> execution). czyzbys wiedzial lepiej od NXP jak dziala ich MAM?

    Cytat:

    A to co ty piszesz nie jest dla mnie żadnym odniesieniem.


    ocen swoje pisarstwo sam, bo ja niestety jestem zbyt glupi, zeby ci mowic, ze sie mylisz.

    sorry, boss. wiecej sie nie powtorzy.

    4\/3!!

    BTW: Branch Trail - Ślad Skoku... nieeee to przypadek, bufor ten sluzy do ladowania z flasha i nie ma nic wspolnego z jakimis skokami.

    0
  • #27 25 Cze 2008 13:05
    michalko12
    Specjalista - Mikrokontrolery

    Freddie Chopin napisał:


    dodam tez, ze w calym rozdziale nie pisze nic o mechanizmie ktory przedstawiles (flash -> branch trail -> prefetch -> execution). czyzbys wiedzial lepiej od NXP jak dziala ich MAM?


    Czytaj ze zrozumieniem, bo ja czegos takiego nie napisałem.

    Instrukcje są ładowane z flash bezpośrednio do branch trail lub prefetch jeśli w danej chwili w branch trail są aktualne instrukcje.



    Cytat:

    BTW: Branch Trail - Ślad Skoku... nieeee to przypadek, bufor ten sluzy do ladowania z flasha i nie ma nic wspolnego z jakimis skokami.


    W buforze Branch Trail są 4 lub 8 instrukcji i tylko w obrębie tych instrukcji może odbywać się skok niepowodujący przeładowania bufora.

    Jeśli myślisz inaczej to twoja sprawa, dla mnie OT.

    0
  • #28 25 Cze 2008 14:09
    Fyszo
    Spec od GSM

    Spokojnie. Sam chętnie dowiem się jak to działa. Rozumiem że do bufora pobierane jest 16B ale najważniejsze jest czy pobiera spod adresu wielokrotnego 16x czy z dowolnego np. czy zawsze MAM ładuje adresy 16,32, 48,64(dec) itd. czy może zacząć z dowolnego adresu np. 14 i załadować 16B czyli zakres 14-30(dec)? Rozumiem że nie ma mowy tu operować na pojedyńczych bajtach ale chodzi o zasadę pobierania.

    0
  • #29 25 Cze 2008 14:21
    Freddie Chopin
    Specjalista - Mikrokontrolery

    CZLOWIEKU! czy ty umiesz czytac?

    zacytuje raz jeszcze:

    Cytat:

    The Branch Trail buffer captures the line to which
    such a non-sequential break occurs. If the same branch is taken again, the next
    instruction is taken from the Branch Trail buffer. When a branch outside the contents of the
    prefetch and Branch Trail buffer is taken, a stall of several clocks is needed to load the
    Branch Trail buffer. Subsequently, there will typically be no further instruction fetch delays
    until a new and different branch occurs


    ANI SLOWA o jakichs granicach o ktorych mowisz.

    Cytat:

    When an Instruction Fetch is not satisfied by either
    the Prefetch or Branch Trail buffer, nor has a prefetch been initiated for that line, the ARM
    is stalled while a fetch is initiated for the 128 bit line.


    PONOWNIE ani slowa o jakich granicach. cel tego skoku moze rownie dobrze znajdowac sie na drugim koncu pamieci flash, a i tak NIC TO NIE ZMIENIA

    Cytat:

    Czytaj ze zrozumieniem, bo ja czegos takiego nie napisałem.


    sorry, jak moglem sie tak pomylic i zinterpretowac to co napisales doslownie... alez ja jestem glupi.

    przypomne wiec moze, czego NIE NAPISALES:

    Cytat:

    Jesli tylko wyczerpie sie zasób instrukcji w Branch Trail Buffer to nowe instrukcje kopiowane są z Prefetch Buffer do Branch Trail Buffer a Prefetch Buffer pobiera kolejne z pamieci.


    zapomnialem, zeby interpretowac twoje posty odwrotnie, albo czytac je od tylu. od dzis obiecuje o tym pamietac.

    poniewaz wydajesz sie odporny na to co pisze w datasheecie, to moze ulatwie ci sprawe i opowiem o co chodzi.

    z flasha odczytywane sa 4 slowa i laduja one w PREFETCH BUFFER. w trakcie jak ARM sobie je wykonuje, to MAM przygotowywuje sie, zeby pobrac kolejne 4 slowa, co nastepuje przy dojsciu wykonywania programu poza 4te z poprzednio zaladowanych slow. i tak sobie wspaniale leci az napotka skok. jesli napotyka skok, to sprawdza, czy przypadkiem adres do ktorego ma skoczyc nie znajduje sie w prefetch buffer lub w branch trail buffer. (zalozmy ze nie). poniewaz byl to skok, 4 instrukcje z tego adresu (odpowiednio wyrownane oczywiscie) ladowane sa do BRANCH TRAIL BUFFER. ARM sobie je grzecznie wykonuje, a jak wykona 4ta, to MAM laduje 4 kolejne do PREFETCH BUFFER. BRANCH TRAIL BUFFER pozostaje nieruszony. [zalozmy ze to petla] program dochodzi ponownie do skoku i MAM ponownie sprawdza, czy adres skoku znajduje sie w ktoryms z buforow. hurra! znajduje sie w BRANCH TRAIL BUFFER i wykonanie instrukcji nastepuje natychmiastowo, BEZ OCZEKIWANIA na flash. i tym oto pieknym sposobem LPC lataja na 60/72MIPSy z FLASHa, a ATMELe nie. dziekuje za uwage.

    dodam moze od razu, ze instrukcje wykonywane warunkowo nie zwalniaja wykonania programu w zadnym ARMie, tyle ze zwalniaja sam kod, bo niewykonana instrukcja to tak czy siak zmarnowany jeden cykl.

    EDIT:

    @Fyszo:
    zgodnie z tym co pisze w manualu, FLASH w tych procesorach jest 128bitowy, dlatego tez pobierana jest na raz cala LINIA (128bitow). oczywiscie jesli zadany adres znajduje sie na koncu takiej linii (4te slowo), to ... pech <: niemniej jednak takie samo prawdopodobienstwo jest, ze znajduje sie na jej poczatku lub srodku. w zasadzie jedynie dwie ostatnie pozycje sa zle, rozpoczecie dzialania od pozycji 2 IMHO nie wprowadzi opoznienia.

    4\/3!!

    0
  • #30 25 Cze 2008 15:47
    michalko12
    Specjalista - Mikrokontrolery

    Freddie Chopin napisał:
    CZLOWIEKU! czy ty umiesz czytac?



    Moze kiedys dojdziesz do tego że kod do wykonania jest pobierany tylko z
    BRANCH TRAIL BUFFER.
    Druga sprawa to ciekawe co robi MAM w czasie "przygotowywania się" do pobrania kolejnej linii 128b?

    0