C++ Academy · Pelajaran

IO Dipetakan Memori dan Volatile

Berkomunikasi dengan daftar perkakasan secara selamat menggunakan volatile dan I/O dipetakan memori.

Pelajaran 2 daripada 414 langkah

IO Dipetakan Memori dan Volatile ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

I/O Dipetakan Memori

Pada pengawal mikro dan sistem terbenam, daftar perkakasan muncul sebagai alamat memori. Baca atau tulis daftar tersebut seperti memori biasa — tetapi pengkompil tidak boleh mengoptimumkan akses itu sehingga dibuang.

Mengapa volatile?

Pengekal volatile memberitahu pengkompil bahawa nilai pemboleh ubah boleh berubah di luar program (gangguan, perkakasan). Setiap akses mesti berlaku tepat seperti yang ditulis.

volatile uint32_t* GPIO = (uint32_t*)0x40020000;
*GPIO = 0x01;     // write must happen
uint32_t v = *GPIO;

Perkara yang Dihalang oleh volatile

Pengkompil tidak boleh:

  • Menaruh nilai dalam daftar merentasi pembacaan
  • Menyusun semula akses
  • Menghapuskan pembacaan atau penulisan "berlebihan"

Corak Lazim untuk Daftar

Takrifkan struktur yang sepadan dengan peta daftar perkakasan, kemudian tukarkan alamat tetap kepada penuding.

struct GpioRegs {
    volatile uint32_t MODER;
    volatile uint32_t OTYPER;
    volatile uint32_t OSPEEDR;
    volatile uint32_t IDR;
    volatile uint32_t ODR;
};

auto* GPIOA = reinterpret_cast<GpioRegs*>(0x40020000);
GPIOA->ODR = 0x01;

Peringatan Baca-Ubah-Tulis

Walaupun dengan volatile, operasi RMW bukan atom. Pada sistem berbilang teras atau dengan akses ISR serentak, anda memerlukan atomik eksplisit atau penyahdayaan gangguan.

volatile BUKAN untuk Jaluran

Ini ialah salah faham yang lazim. volatile tidak menyediakan susunan memori antara jalur. Gunakan std::atomic untuk akses selamat jalur — termasuk bagi bendera yang dikongsi.

Manipulasi Daftar Bit

Tetapkan, kosongkan atau tukar keadaan bit menggunakan operator aras bit.

GPIOA->ODR |= (1 << 5);    // set bit 5
GPIOA->ODR &= ~(1 << 5);   // clear bit 5
GPIOA->ODR ^= (1 << 5);    // toggle bit 5

Medan Bit

Untuk capaian bit bernama, takrifkan union bagi jenis uint32 dan struktur dengan medan bit. Harap maklum bahawa susunan medan bit ditakrifkan oleh pelaksanaan.

Pengadang Memori

Pada platform dengan model memori lemah (ARM), gunakan __DMB(), __DSB() atau std::atomic_thread_fence untuk menguatkuasakan susunan antara capaian.

Pertimbangan Cache

Jika MCU mempunyai cache, memori persisian biasanya mesti ditanda sebagai tidak menggunakan cache, jika tidak, anda berisiko mendapat bacaan lapuk. Konfigurasi MMU/MPU mengendalikan perkara ini.

Penimbal DMA

Penimbal yang digunakan oleh DMA mestilah dijajarkan, tidak menggunakan cache dan mempunyai operasi siram yang sesuai pada platform bercache. Sila rujuk manual CPU anda.

Menguji Kod Perkakasan

Lakukan ujian unit pada kod yang menyentuh perkakasan dengan mengabstrakkan capaian daftar melalui antara muka — gunakan olokan dalam ujian dan wujudkan pelaksanaan sebenar pada perkakasan.

Semakan Pantas

Apakah yang dijamin oleh kata kunci volatile?

Rumusan

Gunakan volatile untuk daftar perkakasan yang dipetakan kepada memori — ia menghalang penyusun daripada mengoptimumkan capaian sehingga dihapuskan. Ia bukan untuk penyegerakan utas — gunakan std::atomic untuk tujuan itu. Gabungkannya dengan pengadang memori pada CPU bermemori lemah.

Percuma untuk bermula

Pelajari C++ dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “IO Dipetakan Memori dan Volatile” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “IO Dipetakan Memori dan Volatile”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “IO Dipetakan Memori dan Volatile”?

Berkomunikasi dengan daftar perkakasan secara selamat menggunakan volatile dan I/O dipetakan memori. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “IO Dipetakan Memori dan Volatile” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Kekangan dalam Embedded: Tanpa RTTI, Tanpa Exception
  2. IO Dipetakan Memori dan Volatile
  3. Pertimbangan Masa Nyata dan Latensi
  4. Penyusunan Silang untuk Sasaran ARM
← Kembali ke C++ Academy