Saya sedang membaca tentang arduino dan arsitektur AVR dan terjebak pada titik bahwa bagaimana pipeline atau bubbling diselesaikan oleh pengantar arsitektur Harvard di AVR. Maksud saya apa yang dilakukan Harvard hanyalah menyediakan lokasi penyimpanan yang berbeda untuk memori data dan memori program yang memungkinkan untuk memuat program tanpa operator. Tetapi bagaimana hal itu membantu menyelesaikan masalah di atas?
12
Jawaban:
Arsitektur Harvard, yang kebetulan digunakan jauh sebelum AVR ditemukan, memang memiliki ruang alamat terpisah untuk memori program dan untuk memori data. Apa yang dibawa ke pesta ini adalah kemampuan untuk merancang sirkuit sedemikian rupa sehingga bus dan sirkuit kontrol yang terpisah dapat digunakan untuk menangani aliran informasi dari memori program dan aliran informasi ke memori data. Penggunaan bus terpisah berarti bahwa program dapat mengambil dan mengeksekusi untuk melanjutkan tanpa gangguan dari transfer data sesekali ke memori data. Misalnya dalam versi paling sederhana dari arsitektur unit pengambilan program dapat sibuk mengambil instruksi berikutnya dalam urutan program secara paralel dengan operasi transfer data yang mungkin telah menjadi bagian dari instruksi program sebelumnya.
Pada tingkat paling sederhana ini arsitektur Harvard memiliki keterbatasan karena umumnya tidak mungkin memasukkan kode program ke dalam memori data dan menjalankannya dari sana.
Ada banyak variasi dan kompleksitas yang dapat ditambahkan di atas bentuk arsitektur paling sederhana yang telah saya uraikan ini. Satu tambahan umum adalah menambahkan instruksi caching ke bus informasi program yang memungkinkan unit eksekusi instruksi lebih cepat mengakses ke langkah program berikutnya tanpa harus pergi ke memori yang lebih lambat untuk mengambil langkah program setiap kali diperlukan.
sumber
Beberapa catatan selain jawaban Michaels:
1) arsitektur Harvard tidak mensyaratkan bahwa ada dua ruang terpisah untuk data dan kode, hanya saja mereka (sebagian besar) diambil alih oleh dua bus yang berbeda .
2) masalah yang dipecahkan oleh arsitektur Harvard adalah pertikaian bus: untuk sistem di mana memori kode dapat menyediakan instruksi dengan cukup cepat agar CPU tetap bekerja dengan kecepatan penuh, beban tambahan dari pengambilan data / toko akan memperlambat CPU turun. Itu masalah diselesaikan dengan arsitektur Hardvard: memori yang (sedikit) terlalu lambat untuk kecepatan CPU.
Perhatikan bahwa caching adalah cara lain untuk menyelesaikan masalah ini. Seringkali Harvard dan caching digunakan dalam kombinasi yang menarik.
Harvard menggunakan dua bus. Tidak ada alasan yang melekat untuk tetap pada dua, dalam kasus yang sangat khusus lebih dari dua digunakan, terutama dalam DSP (prosesor Sinyal Digital).
Memory Banking (dalam arti mendistribusikan akses memori ke berbagai set chip) dapat dilihat sebagai semacam Harvard di dalam sistem memori itu sendiri, tidak berdasarkan pada perbedaan data / kode, tetapi pada bit tertentu dari alamat.
sumber
Arsitektur Harvard murni umumnya akan memungkinkan komputer dengan tingkat kompleksitas tertentu untuk berjalan lebih cepat daripada arsitektur Von Neuman, asalkan tidak ada sumber daya yang perlu dibagi antara kode dan memori data. Jika batasan pinout atau faktor lain memaksa penggunaan satu bus untuk mengakses kedua ruang memori, keuntungan semacam itu cenderung dibatalkan.
Arsitektur Harvard yang "murni" akan terbatas pada menjalankan kode yang disimpan dalam memori oleh beberapa mekanisme selain prosesor yang akan menjalankan kode. Ini membatasi kegunaan arsitektur seperti itu untuk perangkat yang tujuannya tidak ditentukan oleh pabrik (atau seseorang dengan peralatan pemrograman khusus). Dua pendekatan dapat digunakan untuk mengatasi masalah ini:
Beberapa sistem memiliki area kode dan memori yang terpisah, tetapi menyediakan perangkat keras khusus yang dapat diminta untuk mengambil alih kode bus secara singkat, melakukan beberapa operasi, dan mengembalikan kontrol ke CPU setelah operasi tersebut selesai. Beberapa sistem seperti itu memerlukan protokol yang cukup rumit untuk melakukan operasi seperti itu, beberapa memiliki instruksi khusus untuk melakukan tugas seperti itu, dan beberapa bahkan menonton untuk alamat "memori data" tertentu dan memicu pengambilalihan / rilis ketika suatu upaya dilakukan untuk mengaksesnya . Aspek kunci dari sistem tersebut adalah bahwa ada area memori yang ditentukan secara eksplisit untuk "kode" dan "data"; bahkan jika mungkin bagi CPU untuk membaca dan menulis ruang "kode", itu masih diakui secara semantik berbeda dari ruang data. '
Pendekatan alternatif yang digunakan dalam beberapa sistem kelas atas, adalah memiliki pengontrol dengan dua bus memori, satu untuk kode dan satu untuk data, yang keduanya terhubung ke unit arbitrase memori. Unit itu pada gilirannya terhubung ke berbagai subsistem memori menggunakan bus memori terpisah untuk masing-masing. Akses kode ke satu subsistem memori dapat diproses secara bersamaan dengan akses data ke yang lain; hanya jika kode dan data mencoba mengakses subsistem yang sama secara bersamaan maka salah satu harus menunggu.
Pada sistem yang menggunakan pendekatan ini, bagian-bagian non-kinerja-kritis dari suatu program mungkin mengabaikan batas-batas antara subsistem memori. Jika kode dan data berada di subsistem memori yang sama, semuanya tidak akan berjalan secepat jika mereka berada di subsistem yang terpisah, tetapi untuk banyak bagian dari program biasa yang tidak masalah. Dalam sistem tipikal, akan ada bagian kecil dari kode di mana kinerja benar-benar penting, dan itu hanya akan beroperasi pada sebagian kecil dari data yang dipegang oleh sistem. Jika seseorang memiliki sistem dengan 16K RAM yang dibagi menjadi dua partisi 8K, seseorang dapat menggunakan instruksi linker untuk memastikan bahwa kode kritis kinerja terletak di dekat awal keseluruhan ruang memori, dan data kritis kinerja dekat akhir. Jika ukuran kode keseluruhan tumbuh menjadi misalnya 9K, kode dalam 1K terakhir akan berjalan lebih lambat daripada kode yang ditempatkan di tempat lain, tetapi kode itu tidak akan kritis terhadap kinerja. Demikian juga, jika kode misalnya hanya 6K, tetapi data tumbuh menjadi 9K, akses ke data 1K terendah akan lambat, tetapi jika data kritis-kinerja terletak di tempat lain, itu tidak akan menimbulkan masalah.
Perhatikan bahwa sementara kinerja akan optimal jika kode di bawah 8K dan data di bawah 8K, desain sistem memori yang disebutkan di atas tidak akan memaksakan partisi ketat antara kode dan ruang data. Jika suatu program hanya membutuhkan 1K data, kode dapat tumbuh hingga 15K. Jika hanya membutuhkan 2K kode, data dapat tumbuh hingga 14K. Jauh lebih fleksibel daripada memiliki area 8K hanya untuk kode dan area 8K hanya untuk data.
sumber
Satu aspek yang belum dibahas adalah bahwa untuk mikrokontroler kecil, biasanya dengan bus alamat 16-bit, arsitektur Harvard secara efektif menggandakan (atau tiga kali lipat) ruang alamat. Anda dapat memiliki 64K kode, 64K RAM, dan 64k memori I / O yang dipetakan (jika sistem menggunakan I / O yang dipetakan memori bukan nomor port, yang terakhir sudah memisahkan pengalamatan I / O dari kode & Ruang RAM).
Kalau tidak, Anda harus menjejalkan kode, RAM, dan alamat I / O opsional semua dalam ruang alamat 64K yang sama.
sumber