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_CR1
register di STM32746ZG. Kolom M0
dan M1
bit secara bersama-sama mengontrol panjang kata dalam USART TX / RX, nilai gabungan 2-bit 0b00
menentukan 8-bit, 0b01
menetapkan 9-bit, dll. Ini semua sangat mudah, kecuali M0
pada bit 12 dan M1
bit. 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.
Jawaban:
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_CR1
daftar keluarga STM32F1xx lama.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
M
bit 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
, denganM1
sekarang di bit 28 (sebelumnya disediakan di peta register STM32F1, seperti yang Anda lihat di atas).Gambar 2. STM32F74xxx USART_CR1 mendaftar penggunaan
Sumber gambar: manual referensi keluarga STM32F75xxx dan STM32F74xxx RM0385, bagian 31.8.1
Mereka tidak bisa memasukkan
M1
bit 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.
sumber
Anda benar
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.
sumber