🌱 MPU trong ARM Cortex-M4: Cấu Hình và Thanh Ghi

🌱 MPU trong ARM Cortex-M4: Cấu Hình và Thanh Ghi

    bài viết trước mình đã giới thiệu tổng quan về MPU là gì, và công dụng cũng như một số đặc điểm cơ bản của MPU trong các ứng dụng nhúng. Bài viết này sẽ giới thiệu cụ thể hơn về ngoại vi MPU sử dụng trong lõi Cortex M4, cùng với các thanh ghi sử dụng để cấu hình ngoại vi MPU.

ARM Cortex m4 Memory protection unit

Mục lục

👉 Đặc điểm của MPU trong Cortex M4

    Như đã giới thiệu ở bài viết trước, MPU sẽ chia memory map thành các region, với vị trí, kích thước, quyền truy cập, và các thuộc tính xác định. MPU hỗ trợ:

  • Setup các thuộc tính của từng vùng một cách độc lập.
  • Các Region có thể Overlap lên nhau.
  • Có 8 Region riêng biệt (0-7) với Cortex M4.
  • Một Background Region là Region 0.

    Đặc điểm tiếp theo của MPU là Tính ưu tiên của các Region. Khi các Region Overlap - Chồng lên nhau, thì vùng memory chung đó sẽ có thuộc tính của Region có mức ưu tiên cao hơn. Đối với Cortex M4, Region 7 là vùng có mức độ ưu tiên cao nhất, và giảm dần xuống Region 0.

    Các đặc điểm, thuộc tính, quyền truy cập của các region sẽ được mình giới thiệu ở bên dưới khi nói về các thanh ghi cấu hình MPU.

👉 Các thanh ghi cấu hình MPU

    Mình tham khảo các thanh ghi này trong tài liệu Cortex-M4 Devices Generic User Guide của ARM.

MPU Registers
Hình 1: Tổng quan các thanh ghi MPU

🔻 Thanh ghi MPU_CTRL

    Thanh ghi điều khiển các hoạt động quan trọng của MPU.

MPU_CTRL Register

  • Bit 2 - PRIVDEFENA: Cho phép truy cập vào default memory map ở chế độ Privileged. Default memory map chính là vùng nhớ mà không được cấu hình bởi MPU.

    Default Memory Map

  • Bit 1 - HFNMIENA: Cho phép MPU hoạt động trong Hardfault hay Memfault.
    1 = Enable MPU trong Fault.
    0 = Disable MPU trong Fault.
  • Bit 0 - ENABLE: Enable MPU (=1).

🔻 Thanh ghi MPU_RNR - MPU Region Number Register

MPU_RNR Register

  • Bit [7:0] - REGION: Các bit này chứa Region được tham chiếu bởi 2 thanh ghi MPU_RBAR và thanh ghi MPU_RASR. Tức là chúng ta sẽ ghi giá trị Region vào thanh ghi MPU_RNR, và từ đó có thể cấu hình Region đó bằng các thanh ghi khác.

🔻 Thanh ghi MPU_RBAR - Region Base Address Register

Thanh ghi này định nghĩa địa chỉ base của Region được chứa trong thanh ghi MPU_RNR. Ngoài ra, bản thân thanh ghi MPU_RBAR còn có thể update lại giá trị của thanh ghi MPU_RNR.

MPU_RBAR Register

  • Bit [31:N] - ADDR: Chứa Base Address của Region.
    N = Log2(Region Size in Bytes)
  • Bit 4 - VALID: Bit này để xác định thanh ghi chứa Region Number.
    0 = Xác định Region bằng thanh ghi MPU_RNR.
    1 = Update thanh ghi RNR bằng trường REGION trong thanh ghi RBAR.
  • Bit [3:0] - REGION: Trường này chứa giá trị Region Number để Update cho thanh ghi RNR nếu bit VALID = 1.

🔻 Thanh ghi MPU_RASR - Region Attribute & Size Register

Thanh ghi này define region size & memory attributes của Region chứa trong thanh ghi MPU_RNR, enable region và subregion.

MPU_RASR Register

  • Bit 28 - XN: Bit disable Instruction Access.
    0 = Instruction fetch enabled.
    1 = Instruction fetch disabled.
  • Bit [26-24] - AP: Access Permission Field, cho biết quyền truy cập vào Region.

    Access Permission

  • Bit [21:19, 17, 16] - TEX, C, B: Memory Access Attribute, chứa các thuộc tính khác của Region như Memory Type, Shareability, ...

    Memory Attributes

  • Bit 18 - S: Shareable Bit, là bit cho phép share vùng nhớ trong các ứng dụng Multicore.
  • Bit [5:1] - SIZE: Kích thước của Region, min = 0b00010 = 3.
    Region Size in Bytes = 2 ^ (SIZE + 1)
  • Bit 0 - ENABLE: Bit Enable Region.

🔻 Subregion trong MPU_RASR

    Ngoài các thuộc tính chính, thanh ghi MPU_RASR còn hỗ trợ tính năng Subregion, cho phép chia nhỏ mỗi Region thành 8 phần bằng nhau (gọi là Subregion) để quản lý chi tiết hơn. Tính năng này được điều khiển bởi các bit SRD - Subregion Disable (Bit [15:8]) trong thanh ghi MPU_RASR.

  • Bit [15:8] - SRD: Subregion Disable, mỗi bit tương ứng với một Subregion (từ 0 đến 7).
    0 = Subregion được bật (enable).
    1 = Subregion bị tắt (disable).
  • Cách hoạt động: Mỗi Region được chia thành 8 Subregion có kích thước bằng nhau, bắt đầu từ địa chỉ base (được định nghĩa trong MPU_RBAR). Kích thước mỗi Subregion là Region Size / 8. Nếu một Subregion bị disable, bất kỳ truy cập nào vào Subregion đó sẽ gây ra MemManage Fault.
  • Ví dụ: Nếu Region có kích thước 256 Bytes (SIZE = 7, vì 2^8 = 256), mỗi Subregion sẽ là 32 Bytes. Ghi SRD = 0x02 (0b00000010) sẽ disable Subregion 1 (32-63 Bytes), trong khi các Subregion khác vẫn hoạt động bình thường.
  • Ứng dụng: Subregion hữu ích khi cần bảo vệ một phần nhỏ trong Region mà không muốn cấu hình thêm Region mới, tiết kiệm số lượng Region (vì Cortex-M4 chỉ có 8 Region).

    Lưu ý: Subregion chỉ hoạt động khi Region được bật (ENABLE = 1) và kích thước Region phải đủ lớn (tối thiểu 256 Bytes, tức SIZE ≥ 7) để chia thành 8 phần hợp lệ (mỗi phần ≥ 32 Bytes).

👉 Sử dụng MPU cho Vi điều khiển

    Để tránh các lỗi không mong muốn trong quá trình cấu hình, chúng ta nên disable các ngắt trước khi update các thuộc tính của MPU.

    Đối với Vi điều khiển, ARM cung cấp một số ví dụ điển hình để các bạn có thể cấu hình MPU cho các ứng dụng của mình, đặc biệt là bộ nhớ Flash trong các ứng dụng chạy dài ngày, cần ngăn việc truy cập bộ nhớ trái phép.

MPU Example
Hình 6: Ví dụ cấu hình MPU cho vi điều khiển

    Trên đây là một ví dụ điển hình với MPU cho vi điều khiển. Cụ thể về cách setup MPU, driver cho MPU và ví dụ về các ứng dụng, mình sẽ tiếp tục giới thiệu ở các bài sau!

>>>>>> Follow ngay <<<<<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊
Chúc các bạn học tập tốt 😊

Nguyễn Văn Nghĩa

Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

Đăng nhận xét

Mới hơn Cũ hơn
//