<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Stack Guard and MPU</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/58813/stack-guard-and-mpu</link><description>Hi, I&amp;#39;m trying to get the nrf_stack_guard and nrf_mpu libraries to catch writes past the end of the stack. My stack is 8kB in size (0x2000E000-0x20010000). This is the log output after initializing the Stack Guard module: 
 
 I&amp;#39;m having a little trouble</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Thu, 04 Jun 2020 17:12:07 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/58813/stack-guard-and-mpu" /><item><title>RE: Stack Guard and MPU</title><link>https://devzone.nordicsemi.com/thread/253373?ContentTypeID=1</link><pubDate>Thu, 04 Jun 2020 17:12:07 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e0f3f699-1116-4ca8-853c-4e9bdd542a0c</guid><dc:creator>wpaul</dc:creator><description>[quote userid="14232" url="~/f/nordic-q-a/58813/stack-guard-and-mpu/253195"]I actually had a look at the peripheral/cli example first, but I couldn&amp;#39;t see that it was including or initializing the Stack Guard / MPU at all. [/quote]
&lt;p&gt;If you look in examples/peripheral/cli/main.c, you should see this:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;static inline void stack_guard_init(void)
{
    APP_ERROR_CHECK(nrf_mpu_init());
    APP_ERROR_CHECK(nrf_stack_guard_init());
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;When I searched the whole SDK for references to that function, that&amp;#39;s what popped up.&lt;/p&gt;
&lt;p&gt;Also I realized I forgot to say that you also need to add #include &amp;quot;nrf_mpu.h&amp;quot; in addition to adding the call to nrf_mpu_init(). Sorry about that. (But you obviously must have figured that out already. :) )&lt;/p&gt;
[quote userid="14232" url="~/f/nordic-q-a/58813/stack-guard-and-mpu/253195"]I would have thought it to be the nrf_stack_guard module&amp;#39;s responsibility to make sure the MPU is enabled?[/quote]
&lt;p&gt;I would have thought so too. It&amp;#39;s not entirely unreasonable though, if you consider that the MPU can be used for various other things besides just stack protection. In that case you might want to initialize the MPU separately for some other purpose (and having nrf_stack_guard_init() potentially do it again might therefore be redundant). But that&amp;#39;s just a guess.&lt;/p&gt;
&lt;p&gt;One of the other things I like to do with the MPU is to put a guard block at address 0x0. On many Cortex-M cores, this is the start of flash, where the vector table is, and as such doing a read on it will always succeed. It turns out that a write will also succeed, in the sense that it won&amp;#39;t trigger a trap (though obviously it won&amp;#39;t have any effect since the flash is normally read-only). This means if you have a bug in your program where you&amp;#39;re using a NULL pointer by mistake, you might not notice it right away. If you define a small MPU region right at address 0 with the user/supervisor mode access rights set to NA/NA, then the CPU will throw a memory fault if you attempt any access there, which will alert you to the problem right away. (I was worried at one point that this might have some negative effects on on the CPU accessing the vector table when handling a trap, but apparently it doesn&amp;#39;t.)&lt;/p&gt;
&lt;p&gt;Note that the enable bit in the control register is the master enable for the whole MPU module. There&amp;#39;s also an enable bit for each region, but the master enable also has to be set in order for any of the region definitions to have any effect.&lt;/p&gt;
&lt;p&gt;I suppose this might be easy to overlook given that the example is not expected to force a crash, so normally you would not see a fault.&lt;/p&gt;
&lt;p&gt;Also, I just noticed that in the &amp;quot;mpu info&amp;quot; output, the word &amp;quot;available&amp;quot; is spelled wrong.&lt;/p&gt;
&lt;p&gt;Anyway I&amp;#39;m glad it works for you now.&lt;/p&gt;
&lt;p&gt;-Bill&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Stack Guard and MPU</title><link>https://devzone.nordicsemi.com/thread/253195?ContentTypeID=1</link><pubDate>Thu, 04 Jun 2020 08:27:36 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:07610470-47ca-4048-96a6-1d601e4f2b79</guid><dc:creator>dingari</dc:creator><description>&lt;p&gt;Thank you!&lt;/p&gt;
&lt;p&gt;Finally, this all makes sense. I actually had a look at the peripheral/cli example first, but I couldn&amp;#39;t see that it was including or initializing the Stack Guard / MPU at all. Maybe that&amp;#39;s been updated in the latest SDK release.&lt;/p&gt;
&lt;p&gt;But anyway, it&amp;#39;s hardfaulting now when I try to write to the bottom of the stack.&lt;/p&gt;
&lt;p&gt;I would have thought it to be the nrf_stack_guard module&amp;#39;s responsibility to make sure the MPU is enabled?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Stack Guard and MPU</title><link>https://devzone.nordicsemi.com/thread/253173?ContentTypeID=1</link><pubDate>Thu, 04 Jun 2020 07:15:12 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:16090310-596f-4a92-be48-c5972ac12d64</guid><dc:creator>Einar Thorsrud</dc:creator><description>&lt;p&gt;Hi Bill,&lt;/p&gt;
&lt;p&gt;Thank you for investigating and reporting this. I have reported the issue with the missing call to&amp;nbsp;nrf_mpu_init() in&amp;nbsp;ble_app_cli() to the SDK developers.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Stack Guard and MPU</title><link>https://devzone.nordicsemi.com/thread/253142?ContentTypeID=1</link><pubDate>Thu, 04 Jun 2020 00:44:31 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ffc962b6-67f1-483a-af54-5ca64fd3a795</guid><dc:creator>wpaul</dc:creator><description>&lt;p&gt;You made me curious enough that I actually hauled out my nRF52840 DK reference board and re-flashed it to run the SDK demos.&lt;/p&gt;
&lt;p&gt;The problem here is not that there&amp;#39;s something wrong with you, the problem is there&amp;#39;s something wrong with the universe:&lt;/p&gt;
&lt;p&gt;this example is buggy.&lt;/p&gt;
&lt;p&gt;Note that this is not the only example that uses the stack guard feature. The examples/peripheral/cli/main.c code also uses it, and that code does it right.&lt;/p&gt;
&lt;p&gt;What&amp;#39;s not immediately obvious is that being a CLI example, there&amp;#39;s actually an MPU command built into the CLI. If you run it, the problem becomes clear. Here&amp;#39;s what I get:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;uart_cli:~$ mpu info
MPU State: Disabled, 8 unified regions aviable.

Region 0: Enabled
        - Location:     0x2003E000-0x2003E07F (size: 128 bytes)
        - Access:       RO/RO
        - Type:         Normal
        - Caching:      WBWA/WBWA
        - Flags:        XN

Region 1: Enabled
        - Location:     0x20004301-0x20004400 (size: 256 bytes)
        - Access:       RO/RO
        - Type:         Normal
        - Caching:      WBWA/WBWA
        - Flags:        XN

Region 2: Disabled
Region 3: Disabled
Region 4: Disabled
Region 5: Disabled
Region 6: Disabled
Region 7: Disabled
[00:02:38.000,213] &amp;lt;info&amp;gt; app: Battery level update: 97
uart_cli:~$ mpu dump
MPU_TYPE:       0x00000800
MPU_CTRL:       0x00000000

MPU_RBAR[0]:    0x2003E000
MPU_RASR[0]:    0x1729000D

MPU_RBAR[1]:    0x20004301
MPU_RASR[1]:    0x1729000F

MPU_RBAR[2]:    0x00000002
MPU_RASR[2]:    0x00000000

MPU_RBAR[3]:    0x00000003
MPU_RASR[3]:    0x00000000

MPU_RBAR[4]:    0x00000004
MPU_RASR[4]:    0x00000000

MPU_RBAR[5]:    0x00000005
MPU_RASR[5]:    0x00000000

MPU_RBAR[6]:    0x00000006
MPU_RASR[6]:    0x00000000

MPU_RBAR[7]:    0x00000007
MPU_RASR[7]:    0x00000000
uart_cli:~$ &lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The most important part is where it says: MPU State: Disabled, 8 unified regions aviable.&lt;/p&gt;
&lt;p&gt;Yes, Disabled.&lt;/p&gt;
&lt;p&gt;If you download the book that I linked in my first reply, in the MPU section it documents the operation of the MPU control register. You must set bit 0 in that register to actually turn the MPU on. But here we can see that hasn&amp;#39;t been done:&lt;/p&gt;
&lt;p&gt;MPU_CTRL: 0x00000000&lt;/p&gt;
&lt;p&gt;You can also inspect the MPU registers from the debugger directly. They start at address 0xe000ed90. You can refer to table 4-38 in the manual above for the complete map.&lt;/p&gt;
&lt;p&gt;The reason this is happening is that it&amp;#39;s not enough to call nrf_mpu_stack_guard_init(). You *also* have to call nrf_mpu_init(). This example _DOESN&amp;#39;T_ do that, which is incredibly dumb.&lt;/p&gt;
&lt;p&gt;Go to main.c in the example and do this:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;    APP_ERROR_CHECK(nrf_mpu_init());  /* Add me! */
    APP_ERROR_CHECK(nrf_stack_guard_init());&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Now re-run your test. When I do it, I get the following endless hard fault cycle:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;[00:00:00.000,000] &amp;lt;info&amp;gt; stack_guard: Stack Guard (128 bytes): 0x2003E000-0x2003E07F (total stack size: 8192 bytes, usable stack area: 8064 bytes)
[00:00:00.000,000] &amp;lt;error&amp;gt; hardfault: HARD FAULT at 0x0003460E
[00:00:00.000,000] &amp;lt;error&amp;gt; hardfault:   R0:  0x00000000  R1:  0x0F81B159  R2:  0xBA5EBA11  R3:  0x2003E000
[00:00:00.000,000] &amp;lt;error&amp;gt; hardfault:   R12: 0x2000360C  LR:  0x00027EC9  PSR: 0x61000000
[00:00:00.000,000] &amp;lt;error&amp;gt; hardfault: Cause: The processor attempted a load or store at a location that does not permit the operation.
[00:00:00.000,000] &amp;lt;error&amp;gt; hardfault: MemManage Fault Address: 0x2003E000
[00:00:00.000,000] &amp;lt;info&amp;gt; stack_guard: Stack Guard (128 bytes): 0x2003E000-0x2003E07F (total stack size: 8192 bytes, usable stack area: 8064 bytes)
[00:00:00.000,000] &amp;lt;error&amp;gt; hardfault: HARD FAULT at 0x0003460E
[00:00:00.000,000] &amp;lt;error&amp;gt; hardfault:   R0:  0x00000000  R1:  0x0F81B159  R2:  0xBA5EBA11  R3:  0x2003E000
[00:00:00.000,000] &amp;lt;error&amp;gt; hardfault:   R12: 0x2000360C  LR:  0x00027EC9  PSR: 0x61000000
[00:00:00.000,000] &amp;lt;info&amp;gt; stack_guard: Stack Guard (128 bytes): 0x2003E000-0x2003E07F (total stack size: 8192 bytes, usable stack area: 8064 bytes)
[00:00:00.000,000] &amp;lt;error&amp;gt; hardfault: HARD FAULT at 0x0003460E
[00:00:00.000,000] &amp;lt;error&amp;gt; hardfault:   R0:  0x00000000  R1:  0x0F81B159  R2:  0xBA5EBA11  R3:  0x2003E000
[00:00:00.000,000] &amp;lt;error&amp;gt; hardfault:   R12: 0x2000360C  LR:  0x00027EC9  PSR: 0x61000000
[00:00:00.000,000] &amp;lt;error&amp;gt; hardfault: Cause: The processor attempted a load or store at a location that does not permit the operation.
[00:00:00.000,000] &amp;lt;error&amp;gt; hardfault: MemManage Fault Address: 0x2003E000
[...]&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The examples/peripheral/cli/main.c code actually does call nrf_mpu_init() before nrf_stack_guard_init(). I don&amp;#39;t know why this one doesn&amp;#39;t.&lt;/p&gt;
&lt;p&gt;-Bill&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Stack Guard and MPU</title><link>https://devzone.nordicsemi.com/thread/253125?ContentTypeID=1</link><pubDate>Wed, 03 Jun 2020 19:01:34 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a578e577-4e01-4639-89c7-a4d1c232929d</guid><dc:creator>dingari</dc:creator><description>&lt;p&gt;Hi all, thank you for your responses. I&amp;#39;m a bit dumbfounded as to why I can&amp;#39;t get the Stack Guard / MPU to work. I must me fundamentally misunderstanding something.&lt;/p&gt;
&lt;p&gt;In an attempt to isolate the problem, I&amp;#39;ve taken the ble_app_cli example (SDK 15.2.0), which seems to be the only example utilizing the stack guard) - and added a write to the base of the stack.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;static void core_init(void)
{
    APP_ERROR_CHECK(NRF_LOG_INIT(app_timer_cnt_get));

    if (CoreDebug-&amp;gt;DHCSR &amp;amp; CoreDebug_DHCSR_C_DEBUGEN_Msk)
    {
        APP_ERROR_CHECK(nrf_cli_init(&amp;amp;m_cli, NULL, true, true, NRF_LOG_SEVERITY_INFO));
    }

    nrf_drv_uart_config_t uart_config = NRF_DRV_UART_DEFAULT_CONFIG;
    uart_config.pseltxd = TX_PIN_NUMBER;
    uart_config.pselrxd = RX_PIN_NUMBER;
    uart_config.hwfc    = NRF_UART_HWFC_DISABLED;
    APP_ERROR_CHECK(nrf_cli_init(&amp;amp;m_cli_uart, &amp;amp;uart_config, true, true, NRF_LOG_SEVERITY_INFO));

    APP_ERROR_CHECK(nrf_drv_clock_init());

    nrf_drv_clock_lfclk_request(NULL);

    APP_ERROR_CHECK(app_timer_init());

    APP_ERROR_CHECK(nrf_stack_guard_init());

    *(volatile uint32_t*) STACK_BASE = 0xba5eba11;

    NRF_LOG_INFO(&amp;quot;Written to stack base (%p): %x&amp;quot;, STACK_BASE, *((uint32_t*)STACK_BASE));

    APP_ERROR_CHECK(nrf_pwr_mgmt_init());

    if (CoreDebug-&amp;gt;DHCSR &amp;amp; CoreDebug_DHCSR_C_DEBUGEN_Msk)
    {
        APP_ERROR_CHECK(nrf_cli_task_create(&amp;amp;m_cli));
    }

    APP_ERROR_CHECK(nrf_cli_task_create(&amp;amp;m_cli_uart));
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;This code runs past the &amp;quot;illegal&amp;quot; write and continues normally. From my understanding, this should trigger a HardFault.&lt;/p&gt;
&lt;p&gt;Can somebody tell me what I&amp;#39;m missing?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Stack Guard and MPU</title><link>https://devzone.nordicsemi.com/thread/239243?ContentTypeID=1</link><pubDate>Wed, 11 Mar 2020 03:13:28 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:6fbffa02-485a-40c6-b5a8-3eb6a70ed061</guid><dc:creator>wpaul</dc:creator><description>&lt;p&gt;For information on the MPU, you should consult the ARM Cortex-M4 user&amp;#39;s guide:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://infocenter.arm.com/help/topic/com.arm.doc.dui0553b/DUI0553.pdf"&gt;http://infocenter.arm.com/help/topic/com.arm.doc.dui0553b/DUI0553.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cortex-M4 core itself (and its optional components) is designed by ARM Ltd. not Nordic, so the in-depth documentation for it won&amp;#39;t be in any of the Nordic manuals.&lt;/p&gt;
&lt;p&gt;The MPU is basically a cut-down substitute for an MMU, though without the ability to do any virtual to physical mapping. The MPU provides a fixed number of region registers which can be used to define the following things:&lt;/p&gt;
&lt;p&gt;- Base address of the region&lt;/p&gt;
&lt;p&gt;- Size of the region&lt;/p&gt;
&lt;p&gt;- Region attributes&lt;/p&gt;
&lt;p&gt;The attributes and size are defined using a single register, called MPU_RASR (Region Attribute and Size Register, see section 4.4.5 in the manual).&lt;/p&gt;
&lt;p&gt;The attributes include things like access rights and cache behavior.&lt;/p&gt;
&lt;p&gt;The size part is what&amp;#39;s important here: it&amp;#39;s defined using 5 bits of the MPU_RASR register, and specifies a power of 2. Note that the actual power of 2 is the value of the size field plus 1.&lt;/p&gt;
&lt;p&gt;The minimum allowed value is 5, which represents 32 bytes (2^(4+1)), and the maximum value is 31, which represents 4GB (2^(31+1)).&lt;/p&gt;
&lt;p&gt;The debug output you included shows exactly what region is being guarded: 0x2000E000 to 0x2000E07F. This means you the stack guard has been set up with a base address of 0x2000E000 and a size of 128 bytes.&lt;/p&gt;
&lt;p&gt;What you need to do is make sure your that:&lt;/p&gt;
&lt;p&gt;a) Your test case is actually causing a load or store instruction to be executed (i.e. it&amp;#39;s not being optimized out by the compiler -- the volatile keyword can help prevent this)&lt;/p&gt;
&lt;p&gt;b) The load or store is actually targeting an address _within_ that specific region.&lt;/p&gt;
&lt;p&gt;So for example, if your code is triggering a write to address 0x2000E100, then you&amp;#39;re writing to memory on the other side of the stack guard instead of inside it, and you won&amp;#39;t see any trap. If you have a function that uses a large amount of local variables, the compiler might emit code that adjusts the stack pointer so far beyond the end of the stack that you skip right over the guard.&lt;/p&gt;
&lt;p&gt;Note that it&amp;#39;s possible to trigger a trap due to something other than an explicit load or store instruction. For example, if an exception occurs, like an interrupt, the CPU will push an exception frame onto the stack. If the stack pointer is at or near the stack guard when this happens, then this will also trigger a hard fault, because the CPU won&amp;#39;t have enough room to save everything. This may happen more easily if you&amp;#39;re using floating point math since in that case the CPU may also need to save the FPU registers as well.&lt;/p&gt;
&lt;p&gt;-Bill&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Stack Guard and MPU</title><link>https://devzone.nordicsemi.com/thread/239009?ContentTypeID=1</link><pubDate>Tue, 10 Mar 2020 08:57:47 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:fbdae5a1-14d0-4ba6-b9ff-671183706c79</guid><dc:creator>Einar Thorsrud</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I do not immediately see the issue in this case. I suspect&amp;nbsp;&lt;a href="https://devzone.nordicsemi.com/members/turboj"&gt;Turbo J&lt;/a&gt;&amp;nbsp;is onto something.&lt;/p&gt;
&lt;p&gt;I did a tiny modification to the&amp;nbsp;Command Line Interface (CLI) Example (which uses stack guard out of the box) but were not able to reproduce the behavior you see.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devzone.nordicsemi.com/cfs-file/__key/support-attachments/beef5d1b77644c448dabff31668f3a47-9dbb225b5de9473199b486297605d7e8/demo_5F00_cli_5F00_cmds.c.diff"&gt;devzone.nordicsemi.com/.../demo_5F00_cli_5F00_cmds.c.diff&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Running the example on a nRF52 DK with the above modification I get the expected hard fault after typing &amp;quot;nordic&amp;quot; in the terminal.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Stack Guard and MPU</title><link>https://devzone.nordicsemi.com/thread/238750?ContentTypeID=1</link><pubDate>Mon, 09 Mar 2020 09:50:00 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:af537fd3-48c5-4fc0-8b93-554ce3eda61b</guid><dc:creator>dingari</dc:creator><description>&lt;p&gt;Hi, thank you for the timely reply.&lt;/p&gt;
&lt;p&gt;Please see the below C++ snippet. I&amp;#39;m simulating this by allocating too big of a structure on the stack and writing to each element. If I break directly after this snippet, it leaves MSP at 0x2000d388 (beyond the stack limits).&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;std::array&amp;lt;uint8_t, 8192&amp;gt; tmp{};
NRF_LOG_INFO(&amp;quot;MSP: %p&amp;quot;, __get_MSP());
for (int i = 0; i &amp;lt; 8192; ++i)
    tmp[i] = i;

NRF_LOG_DEBUG(&amp;quot;%p %p&amp;quot;, tmp.begin(), tmp.end());
NRF_LOG_INFO(&amp;quot;MSP: %p&amp;quot;, __get_MSP());
    
illegal_write((void*) 0x2000E000);&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Then I tried directly writing to the protected stack area with the `illegal_write`, which is placed in another compilation unit. I&amp;#39;m running a debug build without any optimizations.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;void illegal_write(void* addr)
{
    auto* p = (uint32_t*) addr;
    *p = 1;
}&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Stack Guard and MPU</title><link>https://devzone.nordicsemi.com/thread/238596?ContentTypeID=1</link><pubDate>Fri, 06 Mar 2020 16:51:49 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:c31c0450-0cc4-406e-a6dc-4de458a0483a</guid><dc:creator>Turbo J</dc:creator><description>&lt;p&gt;I see two possible causes&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The C optimizer eliminated the write completely or placed it somewhere else (where it would not be executed).&lt;/li&gt;
&lt;li&gt;The write buffer delayed the fault and you were only checking with a breakpoint directly after the write instruction.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In any case we would need to see your source code...&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>