SoC
  • Home
  • Arm
  • Arm Cortex M0/M0+
  • Arm Cortex M4
  • Arm Cortex M3
  • Contact
Reading: Write buffer with enabled MPU on ARM Cortex-M4
SUBSCRIBE
SoCSoC
Font ResizerAa
  • Home
  • Arm
  • Arm Cortex M0/M0+
  • Arm Cortex M4
Search
  • Home
  • Arm
  • Arm Cortex M0/M0+
  • Arm Cortex M4
Have an existing account? Sign In
Follow US
  • Looking for Something?
  • Privacy Policy
  • About Us
  • Sitemap
  • Contact Us
© S-O-C.ORG, All Rights Reserved.
Arm

Write buffer with enabled MPU on ARM Cortex-M4

Holly Lindsey
Last updated: October 5, 2023 9:56 am
Holly Lindsey 8 Min Read
Share
SHARE

The ARM Cortex-M4 processor includes features like the Memory Protection Unit (MPU) and write buffer which can improve performance and reliability of embedded systems. However, care must be taken when using the write buffer with MPU enabled to avoid issues. This article provides an overview of the write buffer, MPU, and considerations when using them together on Cortex-M4 processors.

Contents
Overview of Write BufferOverview of MPUUsing Write Buffer with MPUDisabling Write Buffer for MPU ChangesUsing CleanAllBuffersMPU Limitations with Write BufferGuidelines for MPU and Write BufferExample Software ConfigurationConclusion

Overview of Write Buffer

The write buffer is a small amount of fast memory inside the Cortex-M4 processor that buffers writes to main memory. When the processor needs to write data, it first writes to the buffer instead of directly to main memory. This allows the processor to continue executing instructions without waiting for the write to complete.

The buffer improves performance by accumulating multiple writes and performing burst writes to main memory. This reduces the number of individual write transactions on the memory bus, improving efficiency. The write buffer also allows reads to bypass pending writes, enabling further performance gains.

However, the write buffer introduces a lag between when the processor writes to the buffer and when the data is visible in main memory. Care must be taken to ensure memory consistency, especially when accessing the same locations from multiple bus masters.

Overview of MPU

The Memory Protection Unit (MPU) provides memory access control on Cortex-M4 devices. It allows configuring up to 8 protected memory regions with individual permission settings. The MPU checks each memory access to ensure it meets the configured permissions.

If an access violates the permissions, the MPU generates a fault exception. This allows isolating trusted code and data from untrusted components. The MPU is useful for creating a robust, secure system architecture in complex embedded applications.

MPU permissions include no access, read-only, and read-write. Additional settings control privilege levels and enable sharing between bus masters. Fine-grained control over memory regions is possible.

Using Write Buffer with MPU

When using the write buffer and MPU together, the lag introduced by the write buffer can cause issues. A write to the buffer will complete from the processor’s perspective before the data is actually written to main memory.

If the MPU configuration changes between the buffered write and actual memory update, an MPU fault can occur unintentionally. The processor expects the write to succeed but the MPU rejects the access when it eventually reaches main memory.

To avoid this, the MPU configuration must not be changed while writes are pending in the write buffer. The processor provides a CleanAllBuffers operation that flushes the buffer out to main memory and completes all pending transfers.

When making MPU configuration changes at runtime, CleanAllBuffers should be called first. This ensures the buffer is flushed before updating the MPU settings. The safest approach is to disable the write buffer entirely when making MPU changes.

Disabling Write Buffer for MPU Changes

The write buffer is enabled and disabled by setting bits in the Auxiliary Control Register. To disable the write buffer temporarily for MPU reconfiguration:

  1. Save current Auxiliary Control Register value to a variable
  2. Clear the write buffer enable bits using a read-modify-write operation
  3. Perform MPU reconfiguration as needed
  4. Restore original Auxiliary Control Register value

This disables the buffer, changes MPU settings safely, then re-enables the buffer. The processor ensures all buffered writes complete before the change takes effect.

Using CleanAllBuffers

Alternatively, CleanAllBuffers can be used if leaving the write buffer enabled is preferred:

  1. Call CleanAllBuffers
  2. Perform MPU reconfiguration

CleanAllBuffers flushes the buffer out to memory. The processor waits for all writes to finish before returning from CleanAllBuffers. MPU changes are then safe because no writes remain buffered.

However, calling CleanAllBuffers too frequently can reduce performance. It stalls the processor each time and eliminates the benefits of buffering writes.

MPU Limitations with Write Buffer

The asynchronous nature of the write buffer creates some limitations when using the MPU:

  • MPU faults can occur on buffered writes to redions that were permissible when buffered but restricted before the actual memory update.
  • The processor cannot accurately determine the memory location that caused an MPU fault since the failing address is buffered.
  • Enabling overlapped MPU regions requires careful analysis to ensure no ambiguous fault conditions occur.

These factors should be considered when designing the MPU configuration. More conservative permissions may be required to prevent unwanted faults.

Guidelines for MPU and Write Buffer

Here are some guidelines for using the Cortex-M4 MPU and write buffer together safely and efficiently:

  • Minimize MPU region changes at runtime if possible. Make changes during initialization instead.
  • When changing MPU settings dynamically, disable write buffer temporarily or call CleanAllBuffers first.
  • Design MPU permissions conservatively to avoid ambiguities with buffered writes.
  • Use bitbanding or other atomic writes when modifying MPU registers to prevent corruption.
  • Enable MPU early in boot process to protect initialization code.
  • Plan MPU regions considering write buffer size and typical write patterns.

Properly configuring and using the Cortex-M4 MPU and write buffer together takes care and planning. Following Arm recommendations and the guidelines above can help build a robust system that benefits from both features.

Example Software Configuration

Here is an example code snippet for temporarily disabling the write buffer to change MPU settings safely: // Cache current write buffer enable setting uint32_t auxCtrlReg = **Read Aux Control Register**; // Disable write buffer **Clear enable bits in Aux Control Register** // Ensure write buffer is empty **Call CleanAllBuffers** // Make MPU changes **Reconfigure MPU as needed** // Restore write buffer enable setting **Write auxCtrlReg back to Aux Control Register**

This shows the basic approach of saving the aux control register, disabling the write buffer, calling CleanAllBuffers, updating the MPU, then restoring the aux control register value to re-enable the buffer.

Conclusion

The Cortex-M4 write buffer and MPU provide valuable performance and memory protection capabilities. However, care must be taken when using them together due to the asynchronous nature of the write buffer.

Following the guidelines provided and utilizing CleanAllBuffers or temporarily disabling the write buffer during MPU changes can ensure reliable operation. Architecting the MPU configuration conservatively also helps avoid issues with buffered writes.

With proper usage, developers can take full advantage of both the write buffer performance benefits and the memory protection of the MPU in Cortex-M4 embedded systems.

Newsletter Form (#3)

More ARM insights right in your inbox

 


Share This Article
Facebook Twitter Email Copy Link Print
Previous Article What is an example of a watchdog timer?
Next Article Why ARM Cortex M processors are important in embedded systems?
Leave a comment Leave a comment

Leave a Reply Cancel reply

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

2k Followers Like
3k Followers Follow
10.1k Followers Pin
- Sponsored-
Ad image

You Might Also Like

How much power does the ARM M0 consume?

The ARM Cortex-M0 is an ultra low power 32-bit RISC…

7 Min Read

Does cortex M0 have floating point?

The simple answer is no, Cortex-M0 does not have hardware…

9 Min Read

What is the difference between link register and stack?

The link register and stack are two important concepts in…

8 Min Read

Parallel interfacing for LCD displays with Cortex M0+

Interfacing an LCD display in parallel mode with a Cortex…

9 Min Read
SoCSoC
  • Looking for Something?
  • Privacy Policy
  • About Us
  • Sitemap
  • Contact Us
Welcome Back!

Sign in to your account