Mengapa bidang bit terkait secara logis dalam register MCU sering di lokasi yang terpisah?

9

Maafkan saya jika pertanyaan ini sudah dijawab, tetapi saya tidak dapat menemukan jawaban di halaman ini atau di Internet yang lebih luas.

Saya adalah pengembang yang berpengalaman dengan pengetahuan yang layak tentang pemrograman tingkat rendah, tetapi relatif baru untuk pengembangan yang disematkan. Saya telah belajar sendiri pengembangan sistem tertanam menggunakan papan ST-NUCLEO144, yang dilengkapi dengan MCU STM32F746ZG. Satu pertanyaan yang tampaknya tidak jelas bagi saya adalah mengapa bidang bit yang secara logis terkait dalam register mungkin berada di lokasi yang berbeda.

Salah satu contohnya adalah USART_CR1register di STM32746ZG. Kolom M0dan M1bit secara bersama-sama mengontrol panjang kata dalam USART TX / RX, nilai gabungan 2-bit 0b00menentukan 8-bit, 0b01menetapkan 9-bit, dll. Ini semua sangat mudah, kecuali M0pada bit 12 dan M1bit. 28 ... mengapa ini?

Apakah ini karena alasan desain lama, seperti fitur baru dimasukkan ke ruang yang sebelumnya dipesan? Apakah karena alasan yang terkait dengan desain chip, yang tidak saya pertimbangkan, atau apakah ada tujuan yang lebih besar untuk hal ini yang tidak saya lihat?

Jelas ini cukup sepele untuk diatasi dengan sedikit-masking, tapi saya hanya ingin tahu.

ajxs
sumber
1
Dalam kasus UART khususnya, ini adalah teknologi yang sangat tua, jadi alasannya hampir selalu kompatibel. Alasan yang sama mengapa UART mendaftar bit-bidang sering memiliki nama jelek yang memberikan tabrakan namespace di seluruh.
Lundin

Jawaban:

13

Apakah ini karena alasan desain lama, seperti fitur baru dimasukkan ke ruang yang sebelumnya dipesan?

Dalam kasus khusus ini (dan dalam kasus serupa yang pernah saya lihat) ya, ini dilakukan untuk membantu menjaga kompatibilitas dengan perangkat yang lebih lama dan meminimalkan perubahan yang diperlukan untuk kode (mungkin sudah teruji dengan baik dan berkualitas / bersertifikat) yang sudah ditulis untuk perangkat yang lebih lama . Oleh karena itu, fitur dan fungsionalitas baru (membutuhkan bit register baru untuk kontrol & konfigurasi) harus menggunakan bit yang tidak berdekatan, jika bit yang berdekatan dengan bit register asli sudah digunakan.

Sebagai contoh, berikut adalah USART_CR1daftar keluarga STM32F1xx lama.


STM32F1xx mendaftarkan USART_CR1 penggunaan bit

Gambar 1. STM32F10xxx USART_CR1 mendaftar penggunaan

Sumber gambar: STM32F10xxx manual referensi keluarga RM0008, bagian 27.6.4


USART lama (dengan hanya 2 kata panjang pilihan) hanya membutuhkan satu Mbit untuk mengkonfigurasi panjang kata USART antara dua opsi, dan itu adalah bit 12. Perhatikan bagaimana bit 11 dan 13 juga digunakan, dan oleh karena itu tidak tersedia untuk "ekspansi" selanjutnya .

Seperti yang Anda katakan, pada STM32F7 yang lebih baru (dan, misalnya, juga STM32F4), USART sekarang memiliki 3 opsi panjang kata (7, 8 dan 9 bit) dan memerlukan bit konfigurasi lain - bit 12 adalah M0, dengan M1sekarang di bit 28 (sebelumnya disediakan di peta register STM32F1, seperti yang Anda lihat di atas).


STM32F74xxx mendaftarkan USART_CR1 penggunaan bit

Gambar 2. STM32F74xxx USART_CR1 mendaftar penggunaan

Sumber gambar: manual referensi keluarga STM32F75xxx dan STM32F74xxx RM0385, bagian 31.8.1


Mereka tidak bisa memasukkan M1bit baru ke register bit 11 atau 13, tanpa memindahkan register bit yang sudah digunakan untuk fungsi lain, dan dengan demikian menghapus kompatibilitas dengan kode yang ada (misalnya untuk STM32F1) yang menggunakannya.

Jadi mereka telah mencoba untuk menjaga kompatibilitas, yang mengarah ke bit register baru yang ditambahkan di tempat-tempat yang tidak terduga.

Mempertahankan pemetaan register untuk UART mandiri, dari 8250 ke 16550, dengan register baru ditambahkan di tempat lain di peta register, adalah contoh lain.

SamGibson
sumber
1
Terima kasih banyak telah meluangkan waktu untuk menunjukkan ini. Mungkin saya harus memeriksa bahan referensi keluarga F lama sebelum saya bertanya. Saya pikir mungkin ada lebih banyak cerita.
ajxs
1
@ajxs - Sama-sama. Saya hanya bisa berbicara dari pengalaman saya (UART tua itu adalah contoh bagus lainnya). Selalu mungkin ada orang lain yang memiliki pengalaman lain yang relevan, dan mereka mungkin akan berhenti karena menghabiskan waktu menulis jawaban, jika pertanyaan itu sudah memiliki jawaban yang diterima. Jadi, Anda selalu bisa "tidak menerima" jawaban saya, tunggu (katakanlah) sehari untuk orang lain untuk menjawab dari perspektif yang berbeda, dan lihat apakah Anda merasa mereka menjawab pertanyaan lebih baik daripada saya? Jika tidak, maka Anda dapat selalu menerima kembali milik saya :-) Saya hanya tidak ingin Anda kehilangan perspektif jawaban potensial lainnya.
SamGibson
2
Tampaknya masuk akal, saya akan menerima saran Anda! Terima kasih telah bersikap sopan untuk memberikan saran. Jika tidak ada jawaban yang lebih baik besok, saya akan menerima jawaban Anda. Terima kasih lagi.
ajxs
5

Anda benar

"..untuk alasan desain warisan, seperti fitur baru dimasukkan ke ruang yang sebelumnya disediakan ..".

Sejauh yang saya tahu, posisi bit itu sendiri hampir tidak memiliki dampak desain (dalam implementasi chip yang saya maksud) dalam banyak kasus. Desainer biasanya mencoba memanfaatkan apa pun yang tersedia. Dan dalam beberapa kasus seperti ketika Anda mencoba untuk memperluas lebar dll.

Namun demikian, ada beberapa kasus di mana posisi bit sengaja dipisahkan. Khusus untuk bit yang kritis dan TIDAK untuk dimodifikasi oleh penulisan yang tidak disengaja (karena posisi / mask yang salah, atau diacak untuk keamanan) yang dapat menyebabkan sistem berakhir dalam keadaan yang tidak diinginkan.

rs747
sumber