blob: 46d1dfda96b54224c3ee5416f76977bbfb0fd6ee [file] [log] [blame]
<!--
Documentation/_templates/layout.html
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. The
ASF licenses this file to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html>
<html class="writer-html5" lang="en">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ARMv7-M Run Time Stack Checking &mdash; NuttX latest documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../_static/css/theme.css" />
<link rel="stylesheet" type="text/css" href="../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css" />
<link rel="shortcut icon" href="../_static/favicon.ico"/>
<script src="../_static/jquery.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/clipboard.min.js"></script>
<script src="../_static/copybutton.js"></script>
<script src="../_static/design-tabs.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Including Files in board.h" href="include_files_board_h.html" />
<link rel="prev" title="Using Kernel Threads" href="usingkernelthreads.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home"> NuttX
</a>
<!-- this version selector is quite ugly, should be probably replaced by something
more modern -->
<div class="version-selector">
<select onchange="javascript:location.href = this.value;">
<option value="../../latest" selected="selected">latest</option>
<option value="../../10.0.0" >10.0.0</option>
<option value="../../10.0.1" >10.0.1</option>
<option value="../../10.1.0" >10.1.0</option>
<option value="../../10.2.0" >10.2.0</option>
<option value="../../10.3.0" >10.3.0</option>
<option value="../../11.0.0" >11.0.0</option>
<option value="../../12.0.0" >12.0.0</option>
<option value="../../12.1.0" >12.1.0</option>
<option value="../../12.2.0" >12.2.0</option>
<option value="../../12.2.1" >12.2.1</option>
<option value="../../12.3.0" >12.3.0</option>
<option value="../../12.4.0" >12.4.0</option>
<option value="../../12.5.0" >12.5.0</option>
<option value="../../12.5.1" >12.5.1</option>
<option value="../../12.6.0" >12.6.0</option>
<option value="../../12.7.0" >12.7.0</option>
<option value="../../12.8.0" >12.8.0</option>
<option value="../../12.9.0" >12.9.0</option>
<option value="../../12.10.0" >12.10.0</option>
<option value="../../12.11.0" >12.11.0</option>
</select>
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../introduction/index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../quickstart/index.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../contributing/index.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../introduction/inviolables.html">The Inviolable Principles of NuttX</a></li>
<li class="toctree-l1"><a class="reference internal" href="../platforms/index.html">Supported Platforms</a></li>
<li class="toctree-l1"><a class="reference internal" href="../components/index.html">OS Components</a></li>
<li class="toctree-l1"><a class="reference internal" href="../applications/index.html">Applications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../implementation/index.html">Implementation Details</a></li>
<li class="toctree-l1"><a class="reference internal" href="../reference/index.html">API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../faq/index.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../debugging/index.html">Debugging</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Guides</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="nfs.html">NFS Client How-To</a></li>
<li class="toctree-l2"><a class="reference internal" href="usbtrace.html">USB Device Trace</a></li>
<li class="toctree-l2"><a class="reference internal" href="simulator.html">Simulator</a></li>
<li class="toctree-l2"><a class="reference internal" href="rndis.html">How to use RNDIS</a></li>
<li class="toctree-l2"><a class="reference internal" href="drivers.html">Drivers</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpp_cmake.html">C++ Example using CMake</a></li>
<li class="toctree-l2"><a class="reference internal" href="pysimcoder.html">pysimCoder integration with NuttX</a></li>
<li class="toctree-l2"><a class="reference internal" href="customboards.html">Custom Boards How-To</a></li>
<li class="toctree-l2"><a class="reference internal" href="customapps.html">Custom Apps How-to</a></li>
<li class="toctree-l2"><a class="reference internal" href="citests.html">Running CI Test Locally</a></li>
<li class="toctree-l2"><a class="reference internal" href="zerolatencyinterrupts.html">High Performance: Zero Latency Interrupts, Maskable Nested Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="fortify.html">Fortify</a></li>
<li class="toctree-l2"><a class="reference internal" href="nestedinterrupts.html">Nested Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="ofloader.html">Open Flash Loader</a></li>
<li class="toctree-l2"><a class="reference internal" href="testingtcpip.html">Testing TCP/IP Network Stacks</a></li>
<li class="toctree-l2"><a class="reference internal" href="automounter.html">Auto-Mounter</a></li>
<li class="toctree-l2"><a class="reference internal" href="stm32nullpointer.html">STM32 Null Pointer Detection</a></li>
<li class="toctree-l2"><a class="reference internal" href="stm32ccm.html">STM32 CCM Allocator</a></li>
<li class="toctree-l2"><a class="reference internal" href="etcromfs.html">etc romfs</a></li>
<li class="toctree-l2"><a class="reference internal" href="thread_local_storage.html">Thread Local Storage</a></li>
<li class="toctree-l2"><a class="reference internal" href="devicetree.html">Device Tree</a></li>
<li class="toctree-l2"><a class="reference internal" href="changing_systemclockconfig.html">Changing the System Clock Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="usingkernelthreads.html">Using Kernel Threads</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">ARMv7-M Run Time Stack Checking</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#overview">Overview</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#the-stack-monitor">The Stack Monitor</a></li>
<li class="toctree-l4"><a class="reference internal" href="#per-function-call">Per function Call</a></li>
<li class="toctree-l4"><a class="reference internal" href="#details-for-support-of-per-call-stack-checking">Details for Support of Per Call Stack Checking</a></li>
<li class="toctree-l4"><a class="reference internal" href="#other-considerations">Other Considerations</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="include_files_board_h.html">Including Files in board.h</a></li>
<li class="toctree-l2"><a class="reference internal" href="specialstuff_in_nuttxheaderfiles.html">Why can’t I put my special stuff in NuttX header files?</a></li>
<li class="toctree-l2"><a class="reference internal" href="kernel_threads_with_custom_stacks.html">Kernel Threads with Custom Stacks</a></li>
<li class="toctree-l2"><a class="reference internal" href="versioning_and_task_names.html">Versioning and Task Names</a></li>
<li class="toctree-l2"><a class="reference internal" href="logging_rambuffer.html">Logging to a RAM Buffer</a></li>
<li class="toctree-l2"><a class="reference internal" href="ipv6.html">IPv6</a></li>
<li class="toctree-l2"><a class="reference internal" href="integrate_newlib.html">Integrating with Newlib</a></li>
<li class="toctree-l2"><a class="reference internal" href="protected_build.html">NuttX Protected Build</a></li>
<li class="toctree-l2"><a class="reference internal" href="platform_directories.html">Platform Directories</a></li>
<li class="toctree-l2"><a class="reference internal" href="port_drivers_to_stm32f7.html">Porting Drivers to the STM32 F7</a></li>
<li class="toctree-l2"><a class="reference internal" href="semihosting.html">Semihosting</a></li>
<li class="toctree-l2"><a class="reference internal" href="renode.html">Run NuttX on Renode</a></li>
<li class="toctree-l2"><a class="reference internal" href="signal_events_interrupt_handlers.html">Signaling Events from Interrupt Handlers</a></li>
<li class="toctree-l2"><a class="reference internal" href="signaling_sem_priority_inheritance.html">Signaling Semaphores and Priority Inheritance</a></li>
<li class="toctree-l2"><a class="reference internal" href="smaller_vector_tables.html">Smaller Vector Tables</a></li>
<li class="toctree-l2"><a class="reference internal" href="port.html">How to port</a></li>
<li class="toctree-l2"><a class="reference internal" href="updating_release_system_elf.html">Updating a Release System with ELF Programs</a></li>
<li class="toctree-l2"><a class="reference internal" href="partially_linked_elf.html">ELF Programs – With Symbol Tables</a></li>
<li class="toctree-l2"><a class="reference internal" href="fully_linked_elf.html">ELF Programs – No Symbol Tables</a></li>
<li class="toctree-l2"><a class="reference internal" href="building_nuttx_with_app_out_of_src_tree.html">Building NuttX with Applications Outside the Source Tree</a></li>
<li class="toctree-l2"><a class="reference internal" href="building_uclibcpp.html">Building uClibc++</a></li>
<li class="toctree-l2"><a class="reference internal" href="custom_app_directories.html">Custom Application Directories</a></li>
<li class="toctree-l2"><a class="reference internal" href="multiple_nsh_sessions.html">Multiple NSH Sessions</a></li>
<li class="toctree-l2"><a class="reference internal" href="nsh_network_link_management.html">NSH Network Link Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="ram_rom_disks.html">RAM Disks and ROM Disks</a></li>
<li class="toctree-l2"><a class="reference internal" href="reading_can_msgs.html">Reading CAN Messages</a></li>
<li class="toctree-l2"><a class="reference internal" href="remove_device_drivers_nsh.html">Removing Device Drivers with NSH</a></li>
<li class="toctree-l2"><a class="reference internal" href="rust.html">Rust in NuttX</a></li>
<li class="toctree-l2"><a class="reference internal" href="optee.html">Interfacing with OP-TEE</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../glossary.html">Glossary</a></li>
<li class="toctree-l1"><a class="reference internal" href="../logos/index.html">NuttX Logos</a></li>
<li class="toctree-l1"><a class="reference internal" href="../_tags/tagsindex.html">Tags</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">NuttX</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="index.html">Guides</a></li>
<li class="breadcrumb-item active">ARMv7-M Run Time Stack Checking</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/apache/nuttx/blob/master/Documentation/guides/armv7m_runtimestackcheck.rst" class="fa fa-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="armv7-m-run-time-stack-checking">
<h1>ARMv7-M Run Time Stack Checking<a class="headerlink" href="#armv7-m-run-time-stack-checking" title="Permalink to this heading"></a></h1>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Migrated from:
<a class="reference external" href="https://cwiki.apache.org/confluence/display/NUTTX/ARMv7-M+Run+Time+Stack+Checking">https://cwiki.apache.org/confluence/display/NUTTX/ARMv7-M+Run+Time+Stack+Checking</a></p>
</div>
<section id="overview">
<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this heading"></a></h2>
<p>Nuttx supports facilities to verify the dynamically allocated stacks and fixed
stacks used by the tasks and interrupt context running under Nuttx. There are 2
types of stack checking that can be used together or separately.</p>
<ol class="arabic simple">
<li><p>The Stack Monitor</p></li>
<li><p>Per function Call (ARMV7 Only)</p></li>
</ol>
<section id="the-stack-monitor">
<h3>The Stack Monitor<a class="headerlink" href="#the-stack-monitor" title="Permalink to this heading"></a></h3>
<p>The use of the Stack Monitor application requires that
<code class="docutils literal notranslate"><span class="pre">CONFIG_STACK_COLORATION</span></code> be enabled. This compile time option enables the
writing of a know pattern <code class="docutils literal notranslate"><span class="pre">STACK_COLOR</span></code> to the stack memory at creation time.
In the case of the idle task and interrupt, this is done in the code that runs
just after reset at startup. This is known as stack coloring.</p>
<p>Once the pattern has been established, the functions <code class="docutils literal notranslate"><span class="pre">up_check_stack</span></code> and
friends are used to perform the stack checking by finding the lowest word of
the pattern in the allocated stack.</p>
<p>The Stack Monitor is enabled with <code class="docutils literal notranslate"><span class="pre">CONFIG_SYSTEM_STACKMONITOR</span></code> which will
enable a daemon that will periodically run and check the stack penetration of
the tasks running on the system.</p>
<p>The stack monitor is good to help size and check the usage of tasks. However it
is not really useful to detect, certain kinds, nor the cause of a stack overrun.</p>
<p>The reason for this is because a corrupted stack may not be eaten away at. It
may have overruns where the stack pointer is set way below the stack bottom in
a function call as it allocates local variables on the stack. The code in the
function call can then corrupt the memory below the stack bottom, restores the
stack pointer and returns to the caller without actually overwriting the
coloring at the base of the stack.</p>
<p>This brings us the the next method of stack checking.</p>
</section>
<section id="per-function-call">
<h3>Per function Call<a class="headerlink" href="#per-function-call" title="Permalink to this heading"></a></h3>
<p>This method of stack checking leverages the profiler hook mechanism supported
by the compiler. Once enabled using <code class="docutils literal notranslate"><span class="pre">CONFIG_ARMV7M_STACKCHECK</span></code>, one register
is set aside (<code class="docutils literal notranslate"><span class="pre">R10</span></code> is the default) and the value of the base of stack is
saved there (<code class="docutils literal notranslate"><span class="pre">rBS</span></code>). Then every function call will have a preamble and a
postamble code added to it. The preamble (<code class="docutils literal notranslate"><span class="pre">__cyg_profile_func_enter</span></code>) checks
the current stack pointer, minus a margin of 64 bytes (with an additional 136
bytes for the <code class="docutils literal notranslate"><span class="pre">FP</span></code> registers) against the value in the reserved register
<code class="docutils literal notranslate"><span class="pre">rBS</span></code>. If the computed value lies below the value in <code class="docutils literal notranslate"><span class="pre">rBS</span></code> a hard fault is
generated. The postamble code (<code class="docutils literal notranslate"><span class="pre">__cyg_profile_func_exit</span></code>) just returns to
the caller.</p>
<p>The rationale for subtracting the margin can be viewed two ways. If the
configuration is not using a separate ISR stack, then the space reserved will
accommodate the context save of the CPU and optionally the FPU registers to
service an interrupt on the users stack. If the configuration is using a
separate ISR stack, some the 64 bytes will accommodate the transition to the
interrupt stack and the remaining 60-200 bytes are just margin. Either way
stacks should always be allocated with at least 200 bytes of margin.</p>
<p>Because of the reserved register rBS contains the current context’s stack base,
and rBS is not updated on the entry to an ISR, it is not possible to check the
stack penetration for an interrupt with Per function Call stack checking.</p>
<p>One thing to consider is the impact on code size and speed this method of stack
checking will have. Each function will have two additional call and return
instructions added to it. In the execution path of each function, there will be
an added set of instructions to perform the preamble and postamble
functionality. In a call tree that is nested several layers deep, this can add
up. In one particular use, we saw an increase of 30% to 35% additional CPU
utilization required to support per function call stack checking.</p>
<p>Is this just a debugging tool? One could imagine that in a mission critical
application, this might be part of a release build if the code size and speed
impact can be tolerated.</p>
<p>As of commit 4942867 Register R11 will contain the value that the stack pointer
would hit that caused the fault. This can be used to calculate the stack size
needed for that task that faulted. To do so, take the difference of R10-R11 and
round it up by 12 bytes (The round up is to make up for the 8 byte stack
alignment and 4 byte decrease that may happen in the stack allocation) Then add
that amount to the failing tasks stack size.</p>
</section>
<section id="details-for-support-of-per-call-stack-checking">
<h3>Details for Support of Per Call Stack Checking<a class="headerlink" href="#details-for-support-of-per-call-stack-checking" title="Permalink to this heading"></a></h3>
<p>Currently only ARMV7 derivatives support Per Call Stack Checking. Support
requires the following components:</p>
<p>The start function must establish the value in <code class="docutils literal notranslate"><span class="pre">rBS</span></code> (<code class="docutils literal notranslate"><span class="pre">R10</span></code> by default see
below). Yet to do this the start function must NOT have the preamble and
postamble code added to it. This is accomplished with the use the following
gcc attribute:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#ifdef CONFIG_ARMV7M_STACKCHECK</span>
<span class="cm">/* we need to get r10 set before we can allow instrumentation calls */</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">__start</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="w"> </span><span class="n">__attribute__</span><span class="w"> </span><span class="p">((</span><span class="n">no_instrument_function</span><span class="p">));</span>
<span class="cp">#endif</span>
</pre></div>
</div>
<p></p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">__start</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="o">*</span><span class="n">src</span><span class="p">;</span>
<span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="o">*</span><span class="n">dest</span><span class="p">;</span>
<span class="cp">#ifdef CONFIG_ARMV7M_STACKCHECK</span>
<span class="w"> </span><span class="cm">/* Set the stack limit before we attempt to call any functions */</span>
<span class="w"> </span><span class="n">__asm__</span><span class="w"> </span><span class="k">volatile</span><span class="w"> </span><span class="p">(</span><span class="s">&quot;sub r10, sp, %0&quot;</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="s">&quot;r&quot;</span><span class="w"> </span><span class="p">(</span><span class="n">CONFIG_IDLETHREAD_STACKSIZE</span><span class="w"> </span><span class="mi">-64</span><span class="p">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="p">);</span>
<span class="cp">#endif</span>
</pre></div>
</div>
<p>The minus 64 is setting the limit 64 bytes above the bottom of the stack. Note:
This may be adding another 64 bytes of margin</p>
<p>For the creation of a task’s context the following code is needed to set up
<code class="docutils literal notranslate"><span class="pre">rBS</span></code></p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">up_initial_state</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">tcb_s</span><span class="w"> </span><span class="o">*</span><span class="n">tcb</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">xcptcontext</span><span class="w"> </span><span class="o">*</span><span class="n">xcp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">tcb</span><span class="o">-&gt;</span><span class="n">xcp</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* Initialize the initial exception register context structure */</span>
<span class="w"> </span><span class="n">memset</span><span class="p">(</span><span class="n">xcp</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">xcptcontext</span><span class="p">));</span>
<span class="w"> </span><span class="cm">/* Save the initial stack pointer */</span>
<span class="w"> </span><span class="n">xcp</span><span class="o">-&gt;</span><span class="n">regs</span><span class="p">[</span><span class="n">REG_SP</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">tcb</span><span class="o">-&gt;</span><span class="n">adj_stack_ptr</span><span class="p">;</span>
<span class="cp">#ifdef CONFIG_ARMV7M_STACKCHECK</span>
<span class="w"> </span><span class="cm">/* Set the stack limit value */</span>
<span class="w"> </span><span class="n">xcp</span><span class="o">-&gt;</span><span class="n">regs</span><span class="p">[</span><span class="n">REG_R10</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">uint32_t</span><span class="p">)</span><span class="n">tcb</span><span class="o">-&gt;</span><span class="n">stack_alloc_ptr</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">64</span><span class="p">;</span>
<span class="cp">#endif</span>
</pre></div>
</div>
<p>And finally up_stackcheck.c needs to be included in the build and the compiler
flags set to reserve <code class="docutils literal notranslate"><span class="pre">R10</span></code> and enable the instrumentation.</p>
<p>This is done for a given architecture in nuttx/arch/arm/src/&lt;arch&gt;/Make.defs:</p>
<div class="highlight-makefile notranslate"><div class="highlight"><pre><span></span><span class="cp">ifeq ($(CONFIG_ARMV7M_STACKCHECK),y)</span>
<span class="nv">CMN_CSRCS</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span>up_stackcheck.c
<span class="cp">endif</span>
</pre></div>
</div>
<p>The compiler flags are added in the nuttx/arch/arm/src/armv7-m/Toolchain.defs</p>
<div class="highlight-makefile notranslate"><div class="highlight"><pre><span></span><span class="c"># enable precise stack overflow tracking</span>
<span class="cp">ifeq ($(CONFIG_ARMV7M_STACKCHECK),y)</span>
<span class="nv">INSTRUMENTATIONDEFINES</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>-finstrument-functions<span class="w"> </span>-ffixed-r10
<span class="cp">endif</span>
</pre></div>
</div>
</section>
<section id="other-considerations">
<h3>Other Considerations<a class="headerlink" href="#other-considerations" title="Permalink to this heading"></a></h3>
<p>If using the export build feature of Nuttx: For the runtime stack checking both
the Application and Nuttx need to be built with the
<code class="docutils literal notranslate"><span class="pre">CONFIG_ARMV7M_STACKCHECK</span></code> option set the same state, enabled or disabled.
Any mismatch will created either compile time or runtime issues.</p>
</section>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="usingkernelthreads.html" class="btn btn-neutral float-left" title="Using Kernel Threads" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="include_files_board_h.html" class="btn btn-neutral float-right" title="Including Files in board.h" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2023, The Apache Software Foundation.</p>
</div>
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>