Mengapa ada jam di Arduino saya?

9

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?

tidak
sumber
3
Anda bingung antara instruksi C dan instruksi mesin (perakitan). Tetapi bahkan jika Anda menulis secara langsung dalam perakitan, Anda dapat menggunakan itu karena programnya TIDAK linier. Maksud saya, menyela, seperti namanya, mengganggu aliran kode normal dengan pergi pada instruksi lain dan kemudian melanjutkan. Jadi mungkin antara satu baris dan yang berikutnya terpaksa mengeksekusi ISR, yang mungkin sangat panjang
frarugi87
2
Jika Anda mencatat chip Anda pada delapan milihertz, bahkan baris kode paling sederhana akan memakan waktu selamanya. Saya sarankan Anda menggunakan jam dalam rentang mega hertz (MHz).
Edgar Bonet
Jumlah siklus yang diperlukan untuk menjalankan setiap instruksi mesin dinyatakan dalam Instruction Set Manual .
Edgar Bonet
Sial aku harus tidur;), diedit terima kasih
n0tis

Jawaban:

13

Mengapa ada jam di Arduino saya?

Karena itulah cara kerja komputer dan mikrokontroler, dll.

Dengan jam 16mhz, setiap baris program saya akan memakan waktu 1/16000000 detik, bukan?

Tidak.

bahkan garis yang sangat besar hanya akan mengambil 1/16000000 detik?

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.

Dengan jam 8mhz, setiap baris akan melipatgandakan waktu, kan? Jadi seluruh "loop utama" akan memakan waktu ganda juga, kan?

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.

Majenko
sumber
juga, menyela.
njzk2
1
Nitpick kecil: Seharusnya "... di mana saja dari 0 instruksi perakitan ...", bahkan tanpa pengoptimal, tetapi bahkan lebih setelah pengoptimalan.
Peter
2
Jangan membingungkan bocah malang itu. Dia mengalami masa yang cukup sulit.
Majenko
@Majenko: kebingungan adalah suatu keharusan. Itu susah.
intelfx
@intelfx "ITU"? Ini pemrograman, bukan IT ....
BalinKingOfMoria Reinstate CMs
10

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.

AMADANON Inc.
sumber
AVR memiliki saluran pipa yang sangat dangkal: hanya mengambil dan mengeksekusi. Kemudian, lompatan bersyarat mengambil satu siklus (lompatan tidak diambil) atau dua siklus (lompatan diambil).
Edgar Bonet
Komplikasi tambahan: kesalahan cache.
Martín-Blas Pérez Pinilla
Ada banyak hal yang tidak saya sebutkan: cache (dari jenis apa pun), multi-threading, multi-core ... Saya mungkin sudah terlalu banyak kedalaman dalam posting saya.
AMADANON Inc.