Dlaczego w moim arduino jest zegar?


9

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?


3
Mylisz się między instrukcjami C a instrukcjami maszyny (montażu). Ale nawet jeśli napisałeś bezpośrednio w asemblerze, możesz to dobrze wykorzystać, ponieważ program NIE jest liniowy. To znaczy, przerywa, jak sama nazwa wskazuje, przerywa normalny przepływ kodu, przechodząc do innej instrukcji, a następnie wznawiając. Może więc między jedną linią a następną jest zmuszony wykonać ISR, co może być bardzo długie
frarugi87

2
Jeśli ustawisz swój układ na osiem miliherców, nawet najprostszy wiersz kodu zajmie wieczność. Sugeruję użycie zegara w zakresie mega herców (MHz).
Edgar Bonet

Liczba cykli potrzebnych do wykonania każdej instrukcji maszyny jest podana w instrukcji zestawu instrukcji .
Edgar Bonet

Cholera, powinienem iść spać;), edytowane podziękowania
n0tis

Odpowiedzi:


13

Dlaczego w moim arduino jest zegar?

Ponieważ tak działają komputery i mikrokontrolery itp.

Z zegarem 16 MHz każda linia mojego programu zajmie 1/16000000 sekundy, prawda?

Nie.

nawet bardzo bardzo duża linia zajmie tylko 1/16000000 sekundy?

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.

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?

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.


także przeszkadza.
njzk2

1
Drobny nitpick: Powinien być „... w dowolnym miejscu od 0 instrukcji montażu ...”, nawet bez optymalizatora, ale jeszcze bardziej po optymalizacji.
Peter

2
Nie pomyl biednego chłopca. Trudno mu się w tej chwili znaleźć.
Majenko

@Majenko: zamieszanie jest koniecznością. To jest trudne.
intelfx

@intelfx „IT”? To jest programowanie, a nie IT ....
BalinKingOfMoria Przywróć CM

10

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.


AVR ma bardzo płytki rurociąg: tylko pobieranie i wykonywanie. Następnie skoki warunkowe wykonują jeden cykl (skok nie został wykonany) lub dwa cykle (skok wykonany).
Edgar Bonet

Dodatkowa komplikacja: brak pamięci podręcznej.
Martín-Blas Pérez Pinilla

Jest wiele rzeczy, o których nie wspomniałem: pamięć podręczna (dowolnego typu), wielowątkowość, wielordzeniowy ... Prawdopodobnie zagłębiłem się już we wpisie.
AMADANON Inc.,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.