Oczywiście wiem, że przydatne jest kontrolowanie czasu opóźnienia, ale jakieś inne zastosowanie?
Z zegarem 16 MHz każda linia mojego programu zajmie 1/16000000 sekundy, prawda?
nawet bardzo bardzo duża linia zajmie tylko 1/16000000 sekundy?
Z zegarem 8 MHz każda linia zajmie dwa razy więcej czasu, prawda? Więc cała „główna pętla” również zajmie podwójny czas, prawda?
oscillator-clock
n0tis
źródło
źródło
Odpowiedzi:
Ponieważ tak działają komputery i mikrokontrolery itp.
Nie.
Nie.
Zegar określa szybkość, z jaką instrukcje kodu maszynowego są pobierane z pamięci i wykonywane. Większość instrukcji zajmuje 1 cykl zegara, ale niektóre wymagają więcej.
Jeden wiersz kodu C można skompilować w dowolną liczbę instrukcji asemblowania, które następnie przekształcić w kod maszynowy (liczby surowe). Może to być od 1 instrukcji montażu do tysięcy instrukcji montażu, w zależności od tego, co robi linia.
Każda operacja na chipie jest regulowana przez zegar. Jeśli zegar jest o połowę mniejszy, układ działa o połowę szybciej, więc każda operacja zajmie dwa razy więcej, tak.
źródło
Brak odpowiedzi w poście @ Majenko: Tak, przy zegarze 8 MHz każda linia zajmie dwa razy więcej czasu. Chyba że linia czeka na coś, co nie jest sterowane zegarem - np. Wejście zewnętrzne.
Oprócz odpowiedzi @ Majenko, procesor ma zegar, aby upewnić się, że instrukcje są kompletne, zanim rozpocznie się następny krok. Procesor składa się z wielu tranzystorów (znalazłem odniesienie wskazujące, że AtMega był w zakresie niskich milionów, dawaj lub bierz rząd wielkości).
Podczas cyklu energia elektryczna przepływa przez układ scalony, włączając / wyłączając tranzystory, czego skutkiem będzie włączanie / wyłączanie większej liczby tranzystorów i tak dalej wzdłuż linii. Podczas gdy tak się dzieje, niektóre części układu mają „niewłaściwą” wartość - możesz myśleć o tym, że jest w połowie obliczeń (dodałeś kolumnę tego i kolumnę 10s i masz zamiar zacząć od Kolumna 100s). Nie chcesz, aby wpłynęło to na świat zewnętrzny, więc (na przykład) twoje styki wyjściowe są zatrzaśnięte - trzymane niezależnie od ich wartości - aż do zakończenia instrukcji. Czas potrzebny na wykonanie instrukcji jest różny, ale producent opracowuje najwolniejszą instrukcję w najgorszych okolicznościach.
W przypadku AtMega (który jest chipem w Arduino), Atmel (który zaprojektował ten układ) zadeklarował, że jest to 1/20 000 000 sekundy - to jest 20 MHz.
Należy pamiętać, że nie wszystkie mikroprocesory wykonują wszystkie instrukcje z 1 instrukcją na cykl - niektóre instrukcje mogą zająć 1, 2 lub 10 cykli. Przetwarzanie potokowe jeszcze bardziej komplikuje sytuację - procesor może wykonać część pracy (np. Pobrać następną instrukcję) w jednym cyklu, wykonać ją w następnym - ale podczas wykonywania instrukcji 1 może również pobrać następną instrukcję. Aby to zrobić, konieczne może być odgadnięcie, która instrukcja będzie dalej (w przypadku kodu maszynowego odpowiednika „goto” - taki jest używany w przypadku pętli), a jeśli zgadnie źle, musi sobie z tym poradzić że; wyrzuć otrzymaną instrukcję i odzyskaj następną, tracąc cykl.
Strona Wikipedii dotycząca potoku instrukcji pokazuje przykład potoku RISC w 5 etapach - pobieranie instrukcji, dekodowanie instrukcji, wykonywanie, dostęp do pamięci i zapisywanie z powrotem. Możesz mieć 5 instrukcji na pewnym etapie wykonania, nakładających się na siebie. Aż do fazy „zapisu wstecznego” instrukcje nie mają rzeczywistego efektu. Możesz myśleć o tym jak o linii montażowej - zestaw widgetów zajmuje 7 minut, ale można go podzielić na 5 etapów, najdłuższy etap zajmuje 2 minuty. Raz na dwie minuty każdy częściowo ukończony widget jest przenoszony przez linię montażową na następną stację. Dostajesz jeden widżet co dwie minuty - „Zegar” może tykać tylko tak szybko, jak najwolniej. Jeśli wypchniesz widżet szybciej, w „wąskim gardle” pojawi się w kolejce coraz więcej widżetów.
źródło