Arduino'mda neden bir saat var?


9

Tabii ki bir gecikme zamanını kontrol etmenin yararlı olduğunu biliyorum, ama başka herhangi bir kullanım?

16Mhz saat ile, programımın her satırı 1/16000000 saniye sürecek, değil mi?

çok büyük bir çizgi bile saniyenin 1 / 16000000'ünü alacak mı?

8MHz saat ile her hat iki katına çıkar, değil mi? Yani tüm "ana döngü" de iki kat zaman alacaktır, değil mi?


3
C talimatları ile makine (montaj) talimatları arasında kafa karıştırıyorsunuz. Ancak doğrudan derlemede yazsanız bile, program doğrusal olmadığı için bunu iyi kullanabilirsiniz. Demek istediğim, isminden de anlaşılacağı gibi, normal bir kod akışını başka bir talimatla devam edip devam ettirerek keser. Bu yüzden belki bir satır ve bir sonraki satır arasında
ISR'yi

2
Çipinizi sekiz milihertz'de saatlendirirseniz, en basit kod satırı bile sonsuza kadar sürecektir. Mega hertz aralığında (MHz) bir saat kullanmanızı öneririm .
Edgar Bonet

Her bir makine talimatını uygulamak için gereken döngü sayısı Komut Seti Kılavuzunda belirtilmiştir .
Edgar Bonet

Lanet uyumaya gitmeliyim;), düzenlenmiş teşekkürler
n0tis

Yanıtlar:


13

Arduino'mda neden bir saat var?

Çünkü bilgisayarlar ve mikrodenetleyiciler vb. Böyle çalışır.

16mhz'lik bir saatle, programımın her satırı 1/16000000 saniye sürecek, değil mi?

Hayır.

çok büyük bir çizgi bile saniyenin 1 / 16000000'ünü alacak mı?

Hayır.

Saat, makine kodu talimatlarının bellekten hangi hızda getirileceğini ve yürütüleceğini tanımlar . Çoğu talimat 1 saat döngüsüne sahiptir, ancak bazıları daha fazla zaman alır.

Bir C kodu satırı, daha sonra makine koduna (ham sayılar) dönüştürülecek herhangi bir sayıda montaj talimatına derlenebilir. Bu, hattın ne yaptığına bağlı olarak 1 montaj talimatından binlerce montaj talimatına kadar herhangi bir yerde olabilir.

8 mhz'lik bir saatle her satır iki katına çıkar, değil mi? Yani tüm "ana döngü" de iki kat zaman alacaktır, değil mi?

Yongadaki her işlem saat tarafından yönetilir. Saat, hızın yarısı ise, yonga hızın yarısında çalışır, bu nedenle her işlem iki kat daha uzun sürer, evet.


ayrıca keser.
njzk2

1
Küçük nitpick: "... 0 montaj talimatından herhangi bir yerde ..." olmalı, optimize edici olmadan bile, ancak optimizasyondan sonra daha da fazla olmalıdır.
Peter

2
Zavallı çocuğu karıştırmayın. Olduğu kadar zor zaman geçiriyor.
Majenko

@Majenko: karışıklık bir zorunluluktur. Bu zor.
intelfx

@intelfx "BT"? Bu programlama, IT değil ....
BalinKingOfMoria Reinstate CMs

10

@ Majenko'nun yazısında cevaplanmadı: Evet, 8MHz saat ile her satır iki katına çıkacaktır. Hat, saat odaklı olmayan bir şey beklemediği sürece - örn. Harici giriş.

@ Majenko'nun cevabına ek olarak, bir CPU, bir sonraki adım başlamadan önce talimatların tamamlandığından emin olmak için bir saate sahiptir. Bir CPU çok sayıda transistörden yapılır (AtMega'nın düşük milyonlarca aralığında olduğunu belirten bir referans buldum, bir büyüklük ver veya al).

Bir döngü sırasında, elektrik çipten akar ve transistörleri açar / kapatır, sonuçları daha fazla transistörü açar / kapatır ve böylece çizgiyi aşağıya doğru hareket ettirir. Bu olurken, çipin bazı kısımları "yanlış" bir değere sahiptir - bunun bir hesaplama yoluyla yarı yolda olduğunu düşünebilirsiniz (birinin sütununu ve 10'ların sütununu eklediniz ve başlamak üzeresiniz) 100'ler sütunu). Bunun dış dünyayı etkilemesini istemezsiniz, bu nedenle (örneğin) çıkış pimleriniz, talimatlar tamamlanıncaya kadar hangi değerde olursa olsun kilitlenir. Bir talimatın tamamlanması ne kadar zaman alır, ancak üretici en kötü koşullarda en yavaş talimatı verir.

AtMega için (Arduino'daki çip), Atmel (çipi tasarlayan) bunun saniyenin 1 / 20.000.000 olduğunu ilan etti - bu 20MHz.

Tüm mikroişlemcilerin tüm talimatlarını döngü başına 1 talimatta çalıştırmadığını unutmayın - bazı talimatlar 1 veya 2 veya 10 döngü sürebilir. Boru hattı işleri daha da karmaşık hale getirir - bir işlemci bir döngüde işin bir kısmını yapabilir (örneğin bir sonraki talimatı getir), bir sonraki aşamada yürütebilir - ancak 1. talimatı uygularken, bir sonraki talimatı da getirebilir. Bunu yapmak için, bir sonraki talimatın ne olacağına dair bir tahmin yapması gerekebilir ("goto" nun makine kodu eşdeğeri durumunda - böyle döngüler için kullanılır) ve yanlış tahmin ederse, o; aldığı talimatı atın ve bir sonraki döngüyü geri kazanın.

Talimat pipeline'ındaki Wikipedia sayfası, 5 aşamada bir RISC çip boru hattına bir örnek gösterir - talimat getirme, talimat kod çözme, yürütme, bellek erişimi ve geri yazma. Böylece, yürütmenin bir aşamasında üst üste binen 5 talimatınız olabilir. "Geri yazma" aşamasına kadar, talimatların gerçek bir etkisi yoktur. Bunu bir montaj hattı olarak düşünebilirsiniz - bir widget'ı bir araya getirmek 7 dakika sürer, ancak en uzun aşama 2 dakika süren 5 aşamaya ayrılabilir. Her iki dakikada bir, kısmen tamamlanan her widget, montaj hattı tarafından bir sonraki istasyona taşınır. İki saatte bir widget alırsınız - "Saat" sadece en yavaş adım kadar hızlı işaretleyebilir. Widget'ı daha hızlı bir şekilde dışarı iterseniz, "darboğaz" gittikçe daha fazla widget sıraya alınır.


AVR'nin çok sığ bir boru hattı vardır: sadece getirme ve çalıştırma. Daha sonra, koşullu sıçramalar bir döngü (atlama yapılmadı) veya iki döngü (atlama alındı) alır.
Edgar Bonet

Ek komplikasyon: önbellek özlüyor.
Martín-Blas Pérez Pinilla

Bahsetmediğim birçok şey var: önbellek (herhangi bir türden), çok iş parçacıklı, çok çekirdekli ... Muhtemelen yazımda çok fazla derinliğe girdim.
AMADANON Inc.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.