Tentu saja saya tahu ini berguna untuk mengontrol waktu penundaan, tetapi ada penggunaan lain?
Dengan jam 16Mhz, setiap baris program saya akan mengambil 1/16000000 detik, bukan?
bahkan garis yang sangat besar hanya akan mengambil 1/16000000 detik?
Dengan clock 8MHz, setiap baris akan berlipat ganda, bukan? Jadi seluruh "loop utama" akan memakan waktu ganda juga, kan?
oscillator-clock
tidak
sumber
sumber
Jawaban:
Karena itulah cara kerja komputer dan mikrokontroler, dll.
Tidak.
Tidak.
Jam menentukan pada kecepatan apa instruksi kode mesin diambil dari memori dan dieksekusi. Sebagian besar instruksi mengambil 1 siklus clock, tetapi beberapa lainnya mengambil lebih banyak.
Satu baris kode C dapat dikompilasi menjadi sejumlah instruksi perakitan, yang kemudian dapat dikonversi menjadi kode mesin (angka mentah). Itu bisa di mana saja dari 1 instruksi perakitan ke ribuan instruksi perakitan, tergantung pada apa yang dilakukan jalur.
Setiap operasi dalam chip diatur oleh jam. Jika jamnya setengah kecepatan chip bekerja setengah kecepatan, jadi setiap operasi akan memakan waktu dua kali lebih lama, ya.
sumber
Tidak dijawab pada pos @ Majenko: Ya, dengan clock 8MHz, setiap baris akan menghabiskan waktu ganda. Kecuali jika saluran menunggu sesuatu yang tidak digerakkan oleh jam - mis. Input eksternal.
Selain jawaban @ Majenko, CPU memiliki jam untuk memastikan instruksi lengkap, sebelum langkah berikutnya dimulai. CPU terbuat dari banyak transistor (saya menemukan referensi yang menunjukkan bahwa AtMega berada di kisaran jutaan yang rendah, memberi atau menerima urutan besarnya).
Selama siklus, listrik mengalir melalui chip, menghidupkan / mematikan transistor, yang hasilnya akan menghidupkan / mematikan lebih banyak transistor, dan seterusnya di telepon. Saat ini terjadi, beberapa bagian chip memiliki nilai "salah" - Anda dapat menganggap ini sebagai setengah jalan melalui perhitungan (Anda telah menambahkan kolom seseorang dan kolom 10-an, dan akan memulai pada Kolom 100-an). Anda tidak ingin ini memengaruhi dunia luar, jadi (misalnya) pin output Anda terkunci - ditahan pada nilai berapapun nilainya - hingga instruksi selesai. Berapa lama waktu yang dibutuhkan untuk menyelesaikan suatu instruksi bervariasi, tetapi pabrikan mengerjakan instruksi yang paling lambat dalam situasi terburuk.
Untuk AtMega (yang merupakan chip pada Arduino), Atmel (yang merancang chip) telah menyatakan ini 1/20.000.000 per detik - ini adalah 20MHz.
Perhatikan bahwa tidak semua mikroprosesor menjalankan semua instruksi mereka pada 1 instruksi per siklus - beberapa instruksi mungkin memerlukan 1, atau 2, atau 10 siklus. Pipelining membuat segalanya menjadi lebih rumit - prosesor mungkin melakukan beberapa pekerjaan (misalnya mengambil instruksi berikutnya) dalam satu siklus, menjalankannya di siklus berikutnya - tetapi ketika sedang menjalankan instruksi 1, itu juga dapat mengambil instruksi berikutnya. Untuk melakukan ini, mungkin perlu menebak instruksi yang akan datang berikutnya (dalam kasus kode mesin setara dengan "goto" - seperti digunakan untuk loop), dan jika tebakan salah, itu harus mengatasi bahwa; membuang instruksi yang diambil dan mengambil yang berikutnya, kehilangan siklus.
Halaman Wikipedia pada pipelining instruksi menunjukkan contoh pipelining chip RISC dalam 5 tahap - pengambilan instruksi, dekode instruksi, eksekusi, akses memori, dan penulisan kembali. Jadi, Anda dapat memiliki 5 instruksi pada tahap eksekusi, tumpang tindih. Sampai fase "writeback", instruksi tidak memiliki efek nyata. Anda dapat menganggap ini sebagai jalur perakitan - dibutuhkan 7 menit untuk menyatukan widget, tetapi dapat dibagi menjadi 5 tahap, tahap terpanjang yang memakan waktu 2 menit. Sekali setiap dua menit, masing-masing widget yang sebagian selesai dipindahkan oleh jalur perakitan ke stasiun berikutnya. Anda mengeluarkan satu widget setiap dua menit - "Jam" hanya dapat mencentang secepat langkah paling lambat. Jika Anda mendorong widget lebih cepat, "bottleneck" akan semakin banyak widget yang di-antri.
sumber