December 5, 2021

Blogna Kang U-2 Man

STM32, Embedded System, Microcontroller, ARM Cortex-M, RTOS, FreeRTOS

ARM Cortex-M3: Unit Proteksi Memori

5 min read

بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيم

Unit proteksi memori (MPU, Memory Protection Unit) merupakan unit pilihan prosesor ARM Cortex-M3, tidak semua prosesor ARM Cortex-M3 akan mempunyai MPU, tergantung dari pabrikan silikon yang bersangkutan. Dengan MPU memori prosesor ARM Cortex-M3 bisa dibagi-bagi menjadi region-region yang diproteksi, sehingga hanya bisa diakses melalui level akses tertentu dengan tujuan sebagai berikut:

  1. Menjaga aplikasi user agar tidak merusak data yang dipakai oleh sistem operasi (RTOS).
  2. Memisahkan data sehingga task pemroses data tidak bisa mengakses data yang lain.
  3. Membuat beberapa region memori menjadi “hanya baca”, sehingga menjaga data vital agar tidak bisa diubah dari yang seharusnya
  4. Mendeteksi akses memori yang tidak diharapkan, misalnya memori stack rusak.

Setiap region memori yang sudah di-set oleh MPU mempunyai hak akses masing-masing. MPU bisa membuat sampai 8 region memori (area 0-7) dan region latar belakang (background region). Region latar belakang pada dasarnya sama dengan region memori yang lain, tetapi hanya bisa diakses di level privileged. MPU juga mengatur region – region tersebut mulai dari lokasi (alamat memori), ukuran, jenis akses, dan atribut memorinya. MPU mendukung:

  1. Seting untuk masing-masing region memori
  2. Region memori tumpang tindih (overlapping region)
  3. Ekspor atribut memori ke sistem

Ketika sebuah region memori mengalami overlap, maka akses ke memori akan dipengaruhi oleh nomor region yang lebih tinggi, misalnya region 7 akan mempengaruhi region memori di bawahnya yang mengalami over lap ke region 7.

REGISTER-REGISTER MPU

MPU dikendalikan melalui beberapa register:

  1. Register type (MPU_TYPER)
  2. Register kendali (MPU_CR)
  3. Register nomer region (MPU_RNR)
  4. Register Alamat dasar region (MPU_RBAR)
  5. Register ukuran dan atribut region (MPU_RASR)

Register MPU_TYPE merupakan register yang menunjukan apakah sebuah mikrokontroler ARM Cortex-M3 mempunyai unit MPU atau tidak. Register ini juga menunjukan berapa region memori yang didukung oleh prosesor tersebut. Bit-bit IREGION (bit 23:16) merupakan bit-bit yang menunjukan jumlah region instruksi yang didukung oleh MPU. Bit-bit ini akan selalu bernilai 0, karena arsitektur ARMv7-M menggunakan MPU yang terpadu antara data dan instruksi.

Register MPU_TYPE

Bit-bit DREGION (bit 15:9), merupakan bit yang menunjukan jumlah region data yang didukung oleh MPU. Bit-bit ini akan selalu bernilai 0x08 jika prosesor mempunyai MPU atau 0x00 jika prosesor tidak mempunyai MPU. Sedangkan bit SEPARATE merupakan bit yang menunjukan apakah ada pemisahan antara pemetaan memori dan instruksi, dan akan selalu bernilai 0.

Register MPU_CR merupakan register yang mengatur kerja MPU ini, register ini berfungsi untuk:

  • Mengaktifkan MPU
  • Mengaktifkan nilai awal dari region memori latar belakang
  • Mengaktifkan pemakaian MPU ketika terjadi Hard fault, NMI dan FAULTMASK.
Register MPU_CR

Bit ENABLE, sesuai dengan namanya akan mengatifkan fungsi MPU bila bit ini di-set. Bit HFNMIENA digunakan untuk mengaktifkan MPU selama terjadi Hard fault, terjadi NMI dan penanganan FAULTMASK jika bit ini di-set. Dan bit PRIVDEFENA digunakan untuk mengaktifkan akses software privileged ke peta memori awal (default) sesuai dengan pemetaan memori ARM Cortex-M3.

Register MPU_RNR (Region Number Register) merupakan register yang digunakan untuk memilih region memori mana yang akan di-set oleh register MPU_RBAR dan MPU_RASR. Software harus menentukan terlebih dahulu register RNR sebelum men-set register RBAR dan RASR.

Register RNR

Register MPU_RBAR (Region Base Address Register) merupakan register untuk menentukan alamat awal region memori di nomor region yang ditunjukan oleh register RNR. Register ini terdiri dari bit-bit alamat (ADDE[31:N]), bit VALID dan bit-bit REGION[3:0].

Register RBAR

Bit-bit ADDR[31:N] merupakan alamat awal region, di mana N tergantung ukuran region, yang ditunjukan oleh bit-bit SIZE di register RASR. N dirumuskan sebagai

N = Log2(Ukuran region dalam byte)

Jika ukuran region ditentukan 4 GB, melalui register RASR, maka tidak bit-bit ADDR tidak akan valid. Dalam hal ini region akan menempati semua alamat memori Cortex-M3 dengan alamat awal berada di 0x00000000.

Bit VALID digunakan untuk memperbaharui nomer region dan register RNR. Ketika bit ini bernilai 1, prosesor akan memperbaharui register RNR dan memperbaharui alamat awal dari region yang bersangkutan.

Register terakhir yang mengendalikan MPU adalah register RASR (Region Attribute and Size Register). Register ini digunakan untuk mengatur ukuran setiap region dan atribut setiap region memori dan juga mengaktifkan region dan sub-region. Region yang dipengaruhi adalah region yang ditunjukan oleh register RNR.

Register RSAR

Bit XN (Execute Never),bit ke-28, digunakan untuk mengatur apakah region memori yang disebut oleh register RNR bisa melakukan eksekusi instruksi atau tidak. Bit ini di-set, maka region memori tersebut bisa melakukan eksekusi instruksi.

Bit-bit AP[2:0] (bit ke-24 – ke-26) merupakan bit-bit yang mengatur ijin akses (Access Permission) terhadap region memori yang ditunjukan oleh register RNR. Bit-bit ini menentukan ijin akses terhadap sebuah region memori pada saat mode priveleged dan mode user. Dengan bit-bit ini sebuah region memori bisa diatur untuk akses penuh (baca dan tulis), hanya baca atau tidak bisa diakses.

Bit-bit TEX[2:0] (bit ke-19 – ke-21) bersama-sama dengan bit S (Shareable), C (Cacheable), dan B (Bufferable) menentukan atribut dari sebuah region memori. Bit-bit ini akan mengatur memori cache (cacheable), pemakaian bersama memori oleh beberapa bus (shareable) dan juga penggunaan buffer saat akses memori. ARM Cortex-M0/M0+, M2, M3 dan M4 tidak dirancang untuk mendukung memori cache, tetapi struktur register ini tetap mengacu ke arsitektur ARMv7-M. Jenis ARM Cortex-M7, yang baru dirilis oleh ARM Ltd, sudah mendukung memori cache.

Di arsitektur ARMv6 dan v7, sistem memori bisa mempunyai 2 level cache: cache dalam (inner cache) dan cache luar (outer cache) yang mempunyai pengaturan cache yang berbeda. Oleh karena ARM Cortex-M3 tidak mempunyai kendali cache, pengaturan cache hanya berefek kepada proses buffer  di Matriks bus internal dan mungkin di pengendali memori.

Bit-bit SRD[7:0] (Sub-Region Disable) menentukan apakah region memori mendukung sub-region atau tidak. Bit SRD[0] mengatur region 0, SRD[1] untuk region 1 dan seterusnya. Jika bit SRD bernilai 0, maka region yang bersangkutan mendukung sub-region, dan jika SRD di-set 1, region tidak mendukung sub-region. Region dengan ukuran 128 byte tidak mendukung sub-region, oleh karena itu untuk region 32 byte, 64 byte dan 128 byte bit SRD harus bernilai 1.

Bit-bit SIZE[5:0] merupakan bit-bit untuk mengatur ukuran setiap region memori, nomor region yang diatur ditunjukan oleh register RNR. Ukuran region memori dirumuskan sebagai:

Ukuran Region Memori = 2(SIZE+1)

Ukuran region terkecil yang diizinkan adalah 32 byte (SIZE bernilai 4) dan ukuran region terbesar yang memungkinkan 32 GB (SIZE berniai 30).

Bit ENABLE, sesuai dengan namanya, adalah bit yang akan mengaktifkan region memori.

PENGGUNAAN MPU

Berdasarkan pemetaan memori, ARM Cortex-M3 mempunyai beberapa memori sebagai berikut:

  1. Flash/ROM
  2. SRAM Internal
  3. SRAM Eksternal
  4. Periperal
  5. Periperal privat

Keempat memori di atas bisa mempunyai atribut memori sebagai berikut:

  • Strongly-Ordered
  • Device
  • Normal
  • Dapat dipakai bersama (shareable)

Atribut memori strongly-ordered digunakan untuk region periperal privat, seperti NVIC, timer Systick dan SCB (System Control Block). Pada dasarnya tidak diperlukan pengaturan MPU di blok memori ini. MPU akan secara otomatis mengenali alamat yang termasuk ke area periperal privat dan akan mengijinkan akses ke area ini di mode privileged. Atribut strongly-ordered tidak mengenal penulisan melalui buffer. Untuk memori yang lain bisa di-set berdasarkan tabel di bawah berdasarkan register RASR.

Ketika akan mengatur MPU, jika sebelumnya MPU sudah diprogram, region-region yang tidak dipakai harus di-non aktifkan terlebih dahulu agar seting MPU yang sudah ada tersebut tidak terpengaruh oleh seting MPU yang baru. Selain itu, semua interupsi harus dimatikan ketika memperbaharui atribut memori, untuk menjaga jangan sampai ada ISR yang mengakses MPU saat proses perubahan terjadi.

Semoga bermanfaat

Visits: 5 Visits: 98013

Leave a Reply

Your email address will not be published. Required fields are marked *

Copyright © All rights reserved. | Newsphere by AF themes.