STM32_ExtendedLibs/Doc/html/trace_8h_source.html

739 lines
118 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.14.0"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>MyLibs: E:/.WORK/STM32/STM32_ExtendedLibs/MyLibsGeneral/Inc/trace.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
extensions: ["tex2jax.js"],
jax: ["input/TeX","output/HTML-CSS"],
});
</script>
<script type="text/javascript" async="async" src="https://cdn.jsdelivr.net/npm/mathjax@2/MathJax.js"></script>
<script type="text/javascript" src="darkmode_toggle.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">MyLibs<span id="projectnumber">&#160;1.0</span>
</div>
<div id="projectbrief">Расширенные библиотеки для STM32</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.14.0 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('trace_8h_source.html','',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">trace.h</div></div>
</div><!--header-->
<div class="contents">
<a href="trace_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/** </span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">**************************************************************************</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">* @file trace.h</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment">* @brief Заголочный файл для работы с трассировкой.</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">**************************************************************************</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment">* @addtogroup TRACE Trace defines</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">* @ingroup MYLIBS_DEFINES</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment">* @brief Дефайны для работы с трассировкой</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">*************************************************************************/</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="preprocessor">#ifndef __TRACE_H_</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="preprocessor">#define __TRACE_H_</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#include &quot;<a class="code" href="mylibs__defs_8h.html">mylibs_defs.h</a>&quot;</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> </div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include &lt;string.h&gt;</span><span class="comment"></span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="comment">/** </span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="comment"> * @addtogroup TRACE_SERIAL Serial trace defines</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="comment"> * @ingroup TRACE</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="comment"> * @brief Дефайны для работы с serial трассировкой (SWO, RTT)</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="comment"> * @details В зависимости от настроек определяется дефайн @ref my_printf() и @ref log_printf() для работы с трассировкой:</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="comment"> - @ref SERIAL_TRACE_ENABLE - Если трассировка отключена, то все дефайны определяются как &#39;ничего&#39; </span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="comment"> и на производительность кода не влияют</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="comment"></span> </div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="comment"> - @ref RTT_TRACE_ENABLE - для RTT это будет вызов функции SEGGER_RTT_printf(), с подключением библиотеки SEGGER_RTT.h</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="comment"> Предварительно надо подключить библиотеку SEGGER RTT и вызвать функцию SEGGER_RTT_Init()</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="comment"></span> </div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="comment"> - @ref SWO_TRACE_ENABLE для SWO это будет просто printf()</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="comment"> </span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="comment"> Но библиотеку STDOUT надо подключить самостоятельно:</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="comment"> </span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="comment"> @verbatim</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="comment"> Manage Run-Time Environment -&gt; Compiler -&gt; I/O -&gt; STDOUT </span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="comment"> @endverbatim</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="comment"> </span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="comment"> Для SWO также надо включить трассировку: </span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="comment"> </span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="comment"> @verbatim</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="comment"> Options For Target -&gt; Debug -&gt; Debugger Settings</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="comment"> @endverbatim</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="comment"> </span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="comment"> В вкладке Debug: </span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="comment"> - Port = SW</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><span class="comment"> В вкладке Trace: </span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="comment"> - Указать Core Clock</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="comment"> - Выставить Trace Port = SWO</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="comment"> - ITM - выбрать нужный порт (для Keil нулевой порт) </span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="comment"> </span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="comment"></span> </div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="comment"> * @{</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="comment"> *</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="comment"> * @def my_printf(...)</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="comment"> * @brief Универсальный макрос для вывода трассировки</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="comment"> * @details Варианты реализации:</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="comment"> * - RTT_TRACE_ENABLE `SEGGER_RTT_printf(0, ...)`</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="comment"> * - SWO_TRACE_ENABLE - `printf(...)`</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="comment"> * - NO_TRACE - пустой макрос</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span><span class="comment"> *</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span><span class="comment"> * @def log_printf(TAG, fmt, ...)</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="comment"> * @brief Макрос логирования с поддержкой уровней LOG_LEVEL</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span><span class="comment"> * @param TAG Тэг лога</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span><span class="comment"> * @param fmt, ... Форматируемая строка</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="comment"> * @details Варианты реализации:</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span><span class="comment"> * - LOG_LEVEL == 0 - логирование отключено (макрос пустой)</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span><span class="comment"> * - LOG_LEVEL == 1 - выводится время и TAG</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span><span class="comment"> * - LOG_LEVEL &gt;= 2 - выводится время, TAG, имя файла и номер строки</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span><span class="comment"> */</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span><span class="preprocessor">#ifdef SERIAL_TRACE_ENABLE</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> </div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span><span class="preprocessor"> #if defined(RTT_TRACE_ENABLE)</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span><span class="preprocessor"> #undef SWO_TRACE_ENABLE</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span><span class="preprocessor"> #include &quot;SEGGER_RTT.h&quot;</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"><a class="line" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa"> 71</a></span><span class="preprocessor"> #define my_printf(...) SEGGER_RTT_printf(0, __VA_ARGS__)</span></div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span><span class="preprocessor"> #elif defined(SWO_TRACE_ENABLE)</span></div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span><span class="preprocessor"> #undef RTT_TRACE_ENABLE</span></div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span><span class="preprocessor"> #define my_printf(...) printf(__VA_ARGS__)</span></div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span><span class="preprocessor"> #else </span><span class="comment">// NO_TRACE</span></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span><span class="preprocessor"> #define my_printf(...) </span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span><span class="preprocessor"> #warning No trace is selected. Serial debug wont work.</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span><span class="preprocessor"> #endif </span><span class="comment">// RTT_TRACE_ENABLE/SWO_TRACE_ENABLE/NO_TRACE</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span><span class="preprocessor">#else </span><span class="comment">//SERIAL_TRACE_ENABLE</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> </div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span><span class="preprocessor"> #define my_printf(...) </span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span><span class="preprocessor"> #undef RTT_TRACE_ENABLE</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span><span class="preprocessor"> #undef SWO_TRACE_ENABLE</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> </div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span><span class="preprocessor">#endif </span><span class="comment">//SERIAL_TRACE_ENABLE</span></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> </div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> </div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span><span class="preprocessor">#ifndef LOG_LEVEL</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span><span class="preprocessor">#define LOG_LEVEL 1 </span><span class="comment">///&lt; @brief Уровень логирования (по умолчанию == 1)</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> </div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span><span class="preprocessor">#if LOG_LEVEL == 0 </span><span class="comment">// лог отключен</span></div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span><span class="preprocessor"> #define \</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span><span class="preprocessor">log_printf(TAG, fmt, ...) </span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span><span class="preprocessor">#elif LOG_LEVEL == 1 </span><span class="comment">// только тэг</span></div>
<div class="foldopen" id="foldopen00096" data-start="" data-end="">
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"><a class="line" href="group___t_r_a_c_e___s_e_r_i_a_l.html#ga730fb7b8d0bbb348dca73c15bd0e0b26"> 96</a></span><span class="preprocessor"> #define log_printf(TAG, fmt, ...) \</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span><span class="preprocessor">my_printf(&quot;\n[%lu] [%s] &quot; fmt, \</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span><span class="preprocessor">(unsigned long)uwTick, TAG, ##__VA_ARGS__)</span></div>
</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span><span class="preprocessor">#elif LOG_LEVEL &gt;= 2 </span><span class="comment">// всё</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span><span class="preprocessor"> #define log_printf(TAG, fmt, ...) \</span></div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span><span class="preprocessor">my_printf(&quot;\n[%lu] [%s] (%s:%d) &quot; fmt, \</span></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span><span class="preprocessor">(unsigned long)uwTick, TAG, __FILE__, __LINE__, ##__VA_ARGS__)</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="comment"></span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span><span class="comment">/** TRACE_SERIAL</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span><span class="comment"> * @}</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span><span class="comment"> */</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span><span class="comment"></span> </div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span><span class="comment">/** </span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span><span class="comment"> * @addtogroup TRACE_GPIO GPIO trace defines</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span><span class="comment"> * @ingroup TRACE</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span><span class="comment"> * @brief Дефайны для работы с GPIO трассировкой</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span><span class="comment"> * @details Определяется дефайны для работы с GPIO трассировкой:</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span><span class="comment"> - TRACE_GPIO_RESET() - для сброса ножки GPIO (через BSRR)</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span><span class="comment"> - TRACE_GPIO_SET() - для выставления ножки GPIO (через BSRR)</span></div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span><span class="comment"> </span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span><span class="comment"> - Если трассировка @ref GPIO_TRACE_ENABLE отключена, то все дефайны определяются как &#39;ничего&#39; </span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span><span class="comment"> и на производительность кода не влияют</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span><span class="comment"> * @{ </span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span><span class="comment"> *</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span><span class="comment"> * @def TRACE_GPIO_RESET(_gpio_, _pin_)</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span><span class="comment"> * @brief Сбросить указанную ножку GPIO</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span><span class="comment"> * @param _gpio_ Указатель на структуру GPIO (напр. GPIOA)</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span><span class="comment"> * @param _pin_ Номер ножки (напр. GPIO_PIN_0)</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span><span class="comment"> * @details Варианты реализации:</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span><span class="comment"> * - GPIO_TRACE_ENABLE не определён - макрос пустой</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span><span class="comment"> * - GPIO_TRACE_ENABLE определён - устанавливает бит сброса через BSRR ((_pin_)&lt;&lt;16)</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span><span class="comment"> *</span></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span><span class="comment"> * @def TRACE_GPIO_SET(_gpio_, _pin_)</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span><span class="comment"> * @brief Установить указанную ножку GPIO</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span><span class="comment"> * @param _gpio_ Указатель на структуру GPIO (например GPIOA)</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span><span class="comment"> * @param _pin_ Номер ножки (напр. GPIO_PIN_0)</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span><span class="comment"> * @details Варианты реализации:</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span><span class="comment"> * - GPIO_TRACE_ENABLE не определён - макрос пустой</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span><span class="comment"> * - GPIO_TRACE_ENABLE определён - устанавливает бит установки через BSRR (_pin_)</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span><span class="comment"> */</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span><span class="preprocessor">#ifndef GPIO_TRACE_ENABLE</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span><span class="preprocessor"> #define TRACE_GPIO_SET(_gpio_,_pin_)</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span><span class="preprocessor"> #define TRACE_GPIO_RESET(_gpio_,_pin_)</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"><a class="line" href="group___t_r_a_c_e___g_p_i_o.html#ga02a6a7b273766121db8ad4a1371373eb"> 141</a></span><span class="preprocessor"> #define TRACE_GPIO_SET(_gpio_,_pin_) (_gpio_)-&gt;BSRR = (((_pin_)))</span></div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"><a class="line" href="group___t_r_a_c_e___g_p_i_o.html#ga69741d88c991112e99fe7a62e025108a"> 142</a></span><span class="preprocessor"> #define TRACE_GPIO_RESET(_gpio_,_pin_) (_gpio_)-&gt;BSRR = ((_pin_)&lt;&lt;16)</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span><span class="preprocessor">#endif </span><span class="comment">//GPIO_TRACE_ENABLE</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> </div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span><span class="comment"></span> </div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span><span class="comment">/** TRACE_GPIO</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span><span class="comment"> * @}</span></div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span><span class="comment"> */</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> </div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> </div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> </div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span><span class="preprocessor">#if defined(HAL_MODULE_ENABLED) &amp;&amp; defined(RTT_TRACE_ENABLE)</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span><span class="comment"></span> </div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span><span class="comment">/** </span></div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span><span class="comment"> * @addtogroup TRACE_RTT_FLASH Flash RTT Buffer</span></div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span><span class="comment"> * @ingroup TRACE</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span><span class="comment"> * @brief Макросы и функции для сохранения/чтения RTT буфера в Flash</span></div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span><span class="comment"> * @details Модуль позволяет сохранять данные RTT буфера во Flash и читать их обратно по тегам. </span></div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span><span class="comment"> * Теги работают следующим образом: </span></div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span><span class="comment"> * - Базовый тег (младший байт = 0): модуль сам выбирает первый свободный слот во Flash; </span></div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span><span class="comment"> * новые записи получают автоинкрементированный младший байт тега (от 0x00 до 0xFF). </span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span><span class="comment"> * - Конкретный тег (младший байт != 0): запись или чтение происходит строго с указанным тегом; </span></div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span><span class="comment"> * если слот с таким тегом уже занят, запись не выполняется. </span></div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span><span class="comment"> * - Автоинкремент позволяет хранить несколько последовательных записей в пределах одного базового тега, </span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span><span class="comment"> * без необходимости вручную отслеживать адреса Flash или позиции буферов. </span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span><span class="comment"> * </span></div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span><span class="comment"> * Параметры:</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span><span class="comment"> * - @ref RTT_FLASH_BUFFER_SIZE - Размер буфера RTT в Flash</span></div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span><span class="comment"> * - @ref RTT_FLASH_SECTOR - Сектор FLASH куда положится RTT буфер</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span><span class="comment"> * - @ref RTT_FLASH_SECTOR_START - Начало сектора RTT_FLASH_SECTOR</span></div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span><span class="comment"> * - @ref RTT_FLASH_SECTOR_END - Конец сектора RTT_FLASH_SECTOR</span></div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span><span class="comment"> * </span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span><span class="comment"> * @{</span></div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span><span class="comment"> */</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> </div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> <span class="comment"></span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span><span class="comment">/**</span></div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span><span class="comment"> * @brief Структура RTT, которая будет положена в Flash</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span><span class="comment"> */</span></div>
<div class="foldopen" id="foldopen00180" data-start="{" data-end="};">
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"><a class="line" href="struct_r_t_t___flash_header__t.html"> 180</a></span><span class="keyword">typedef</span> <span class="keyword">struct </span>{</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"><a class="line" href="struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57"> 181</a></span> uint32_t <a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57">tag</a>; <span class="comment">///&lt; Уникальный идентификатор буфера</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"><a class="line" href="struct_r_t_t___flash_header__t.html#afd1a5c51af6f97d170c2ccbbe3e34699"> 182</a></span> uint32_t <a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#afd1a5c51af6f97d170c2ccbbe3e34699">size</a>; <span class="comment">///&lt; Размер данных</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"><a class="line" href="struct_r_t_t___flash_header__t.html#ae7276198385c8d6f6508f433d042d52a"> 183</a></span> <span class="keywordtype">char</span> <a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#ae7276198385c8d6f6508f433d042d52a">data</a>[<a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#ga501312b24e322de4dd6755ad442f0ba3">RTT_FLASH_BUFFER_SIZE</a>]; <span class="comment">///&lt; Буфер RTT</span></div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span>} <a class="code hl_struct" href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a>;</div>
</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span><span class="comment"></span> </div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span><span class="comment">/**</span></div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span><span class="comment"> * @brief Подготовка Flash к записи</span></div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span><span class="comment"> * @details Сбрасывает ошибки Flash и ожидает готовности перед записью</span></div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span><span class="comment"> */</span></div>
<div class="foldopen" id="foldopen00190" data-start="{" data-end="}">
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"><a class="line" href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga21353cb4f5af666237739e62ce019cd6"> 190</a></span>__STATIC_FORCEINLINE <span class="keywordtype">void</span> <a class="code hl_function" href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga21353cb4f5af666237739e62ce019cd6">RTT_FlashPrepare</a>(<span class="keywordtype">void</span>)</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span>{</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> HAL_FLASH_Unlock();</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR | FLASH_FLAG_WRPERR | FLASH_FLAG_OPERR);</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> <span class="keywordflow">while</span> (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) { </div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> __NOP(); </div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> }</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span>}</div>
</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span><span class="comment"></span> </div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span><span class="comment">/**</span></div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span><span class="comment"> * @brief Сохраняет последние символы RTT-буфера в Flash по тегу</span></div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span><span class="comment"> * @param tag Базовый или конкретный идентификатор буфера.</span></div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span><span class="comment"> * @param tail_size Количество последних символов RTT для копирования</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span><span class="comment"> * @param buf_num Указатель на переменную в которую запишется номер буфера для конкретного тега</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span><span class="comment"> * @return &gt;=0 — номер буфера (тег) для записи, &lt;0 — ошибка (нет места, тег уже занят, ошибка записи в флеш)</span></div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span><span class="comment"> *</span></div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span><span class="comment"> * @details Автоматически копирует последние tail_size символов из RTT-буфера</span></div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span><span class="comment"> * и записывает их во Flash.</span></div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span><span class="comment"> * Тег может быть базовым или конкретным:</span></div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span><span class="comment"> * - Если базовый (младший байт == 0) — будет выбран первый свободный слот с автоинкрементом.</span></div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span><span class="comment"> * Автоинкремент формируется в пределах от 0x1 до 0xFF</span></div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span><span class="comment"> * - Если конкретный (младший байт != 0) — запись выполняется только с этим тегом, иначе ошибка.</span></div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span><span class="comment"> * </span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span><span class="comment"> */</span></div>
<div class="foldopen" id="foldopen00214" data-start="{" data-end="}">
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"><a class="line" href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga79f222c8ab644de4d47f07528d1edd63"> 214</a></span>__STATIC_FORCEINLINE <span class="keywordtype">int</span> <a class="code hl_function" href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga79f222c8ab644de4d47f07528d1edd63">RTT_SaveToFlash</a>(uint32_t tag, uint32_t tail_size)</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span>{</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> <span class="keywordflow">if</span> (tag == 0xFFFFFFFF)</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <span class="keywordflow">return</span> -1; <span class="comment">// Неверный тег</span></div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> </div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> SEGGER_RTT_BUFFER_UP *up = &amp;_SEGGER_RTT.aUp[0];</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="keywordtype">unsigned</span> buf_size = up-&gt;SizeOfBuffer;</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="keywordtype">unsigned</span> wr = up-&gt;WrOff;</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> </div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="comment">// Ограничиваем по размеру буфера RTT и RTT_FLASH_BUFFER_SIZE</span></div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> <span class="keywordtype">unsigned</span> n = (tail_size &gt; buf_size) ? buf_size : tail_size;</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="keywordflow">if</span> (n &gt; <a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#ga501312b24e322de4dd6755ad442f0ba3">RTT_FLASH_BUFFER_SIZE</a>)</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> n = <a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#ga501312b24e322de4dd6755ad442f0ba3">RTT_FLASH_BUFFER_SIZE</a>;</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> </div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> uint32_t addr = <a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#ga8e56f75d3ab8a89ddde1404ae23c3297">RTT_FLASH_SECTOR_START</a>;</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <a class="code hl_struct" href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a> *flash_hdr = NULL;</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> uint32_t base_tag = tag &amp; 0xFFFFFF00;</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> uint32_t next_tag = (tag &amp; 0xFF) == 0 ? tag + 1 : tag;</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> </div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> <span class="comment">// Ищем первый свободный слот, параллельно автоинкрементируем тег</span></div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> <span class="keywordflow">while</span> ((addr + <span class="keyword">sizeof</span>(<a class="code hl_struct" href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a>)) &lt;= <a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#gafeca0be3688dea07ff443f894668003d">RTT_FLASH_SECTOR_END</a>)</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> {</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> flash_hdr = (<a class="code hl_struct" href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a> *)addr;</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> </div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <span class="keywordflow">if</span> (flash_hdr-&gt;<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57">tag</a> == 0xFFFFFFFF)</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> <span class="keywordflow">break</span>; <span class="comment">// Нашли свободное место</span></div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> </div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> </div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> <span class="keywordflow">if</span>((flash_hdr-&gt;<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57">tag</a> &amp; 0xFFFFFF00) == base_tag) <span class="comment">// выбраный тег</span></div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> {</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> <span class="keywordflow">if</span> ((tag &amp; 0xFF) == 0) <span class="comment">// если он базовый - ищем последний</span></div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> next_tag = flash_hdr-&gt;<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57">tag</a> + 1; <span class="comment">// автоинкремент</span></div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> <span class="keywordflow">if</span>(flash_hdr-&gt;<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57">tag</a> == tag) <span class="comment">// если он конкретный и уже существует - то ошибка</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> <span class="keywordflow">return</span> -1; <span class="comment">// конкретный тег уже занят</span></div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> }</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> </div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> </div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> <span class="keywordflow">if</span>(next_tag - tag &gt; 0xFF)</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <span class="keywordflow">return</span> -1; <span class="comment">// автоинкремент слишком большой</span></div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> </div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> addr += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a>);</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> }</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> </div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keywordflow">if</span> ((addr + <span class="keyword">sizeof</span>(<a class="code hl_struct" href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a>)) &gt; <a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#gafeca0be3688dea07ff443f894668003d">RTT_FLASH_SECTOR_END</a>)</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> <span class="keywordflow">return</span> -1; <span class="comment">// Нет свободного места</span></div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> </div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> <span class="comment">// Копируем последние n символов из RTT</span></div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> <span class="keywordtype">char</span> temp[<a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#ga501312b24e322de4dd6755ad442f0ba3">RTT_FLASH_BUFFER_SIZE</a>];</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> <span class="keywordtype">unsigned</span> valid_count = 0;</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> </div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; n; i++)</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> {</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> <span class="keywordtype">unsigned</span> idx = (wr + buf_size - n + i) % buf_size;</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> <span class="keywordtype">char</span> c = up-&gt;pBuffer[idx];</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> <span class="keywordflow">if</span> (c != 0)</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> temp[valid_count++] = c;</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> }</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> </div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> <a class="code hl_function" href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga21353cb4f5af666237739e62ce019cd6">RTT_FlashPrepare</a>();</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> </div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> <span class="comment">// Формируем структуру в RAM</span></div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> <a class="code hl_struct" href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a> flash_data;</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> flash_data.<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57">tag</a> = next_tag;</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> flash_data.<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#afd1a5c51af6f97d170c2ccbbe3e34699">size</a> = valid_count;</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> memcpy(flash_data.<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#ae7276198385c8d6f6508f433d042d52a">data</a>, temp, valid_count);</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> </div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> <span class="comment">// Записываем структуру во Flash (по 4 байта)</span></div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> <span class="keyword">const</span> uint32_t *p = (<span class="keyword">const</span> uint32_t *)&amp;flash_data;</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; <span class="keyword">sizeof</span>(<a class="code hl_struct" href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a>) / 4; i++)</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> {</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> <span class="keywordflow">if</span>(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + i * 4, p[i]) != HAL_OK)</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> }</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> </div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> HAL_FLASH_Lock();</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> __DSB();</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> __ISB();</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> </div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> </div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> <span class="keywordflow">return</span> (<span class="keywordtype">int</span>)(next_tag&amp;0xFF);</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span>}</div>
</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> </div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span><span class="comment"></span> </div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span><span class="comment">/**</span></div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span><span class="comment"> * @brief Читает последние символы RTT-буфера из Flash по тегу</span></div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span><span class="comment"> * @param tag Базовый или конкретный идентификатор буфера.</span></div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span><span class="comment"> * @param Buffer Буфер назначения для копирования данных</span></div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span><span class="comment"> * @param tail_size Количество последних символов, которые нужно прочитать</span></div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span><span class="comment"> * @param read_size Количество считанных символов</span></div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span><span class="comment"> * @return &gt;=0 — номер буфера (тег) для записи, &lt;0 — ошибка (тег не найден или структура повреждена)</span></div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span><span class="comment"> *</span></div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span><span class="comment"> * @details Копирует последние tail_size символов из найденной записи Flash в Buffer.</span></div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span><span class="comment"> * Тег может быть базовым или конкретным:</span></div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span><span class="comment"> * - Если базовый (младший байт == 0) — будет прочитана последняя запись из группы.</span></div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span><span class="comment"> * - Если конкретный (младший байт != 0) — прочитывается именно эта запись.</span></div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span><span class="comment"> */</span></div>
<div class="foldopen" id="foldopen00311" data-start="{" data-end="}">
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"><a class="line" href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga734b2ebbf0c77699b739013878cfd146"> 311</a></span>__STATIC_FORCEINLINE <span class="keywordtype">int</span> <a class="code hl_function" href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga734b2ebbf0c77699b739013878cfd146">RTT_ReadFromFlash</a>(uint32_t tag, <span class="keywordtype">char</span> *Buffer, uint32_t tail_size, uint32_t *read_size)</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span>{</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="keywordflow">if</span> (!Buffer || tail_size == 0)</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> <span class="keywordflow">return</span> -1; <span class="comment">// Неверные параметры</span></div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> </div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> <span class="keywordflow">if</span> (tag == 0xFFFFFFFF)</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> <span class="keywordflow">return</span> -1; <span class="comment">// Недопустимый тег</span></div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> </div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> uint32_t addr = <a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#ga8e56f75d3ab8a89ddde1404ae23c3297">RTT_FLASH_SECTOR_START</a>;</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> <a class="code hl_struct" href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a> *flash_hdr = NULL;</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> <a class="code hl_struct" href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a> *target_hdr = NULL;</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> uint32_t base_tag = tag &amp; 0xFFFFFF00;</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> </div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> <span class="comment">// Поиск записи по тегу</span></div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> <span class="keywordflow">while</span> ((addr + <span class="keyword">sizeof</span>(<a class="code hl_struct" href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a>)) &lt;= <a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#gafeca0be3688dea07ff443f894668003d">RTT_FLASH_SECTOR_END</a>)</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> {</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> flash_hdr = (<a class="code hl_struct" href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a> *)addr;</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> </div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> <span class="keywordflow">if</span> (flash_hdr-&gt;<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57">tag</a> == 0xFFFFFFFF)</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> <span class="keywordflow">break</span>; <span class="comment">// Достигнут конец записанных структур</span></div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> </div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> <span class="comment">// выбраный тег</span></div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> <span class="keywordflow">if</span>((flash_hdr-&gt;<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57">tag</a> &amp; 0xFFFFFF00) == base_tag) </div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> {</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> <span class="keywordflow">if</span> ((tag &amp; 0xFF) == 0) <span class="comment">// если он базовый - ищем последний </span></div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> target_hdr = flash_hdr; <span class="comment">// сохраняем последний в группе</span></div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> <span class="keywordflow">if</span>(flash_hdr-&gt;<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57">tag</a> == tag) <span class="comment">// если он конкретный и найден - берем его</span></div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> {</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> target_hdr = flash_hdr;</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> <span class="keywordflow">break</span>; <span class="comment">// конкретный тег найден</span></div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> }</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> }</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> </div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> addr += <span class="keyword">sizeof</span>(<a class="code hl_struct" href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a>);</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> }</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> </div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> <span class="keywordflow">if</span> (!target_hdr) <span class="keywordflow">return</span> -1; <span class="comment">// Тег не найден</span></div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> </div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> <span class="comment">// Проверка корректности размера</span></div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> <span class="keywordflow">if</span> (target_hdr-&gt;<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#afd1a5c51af6f97d170c2ccbbe3e34699">size</a> &gt; <a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#ga501312b24e322de4dd6755ad442f0ba3">RTT_FLASH_BUFFER_SIZE</a>)</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> <span class="keywordflow">return</span> -1; <span class="comment">// Повреждённая запись </span></div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> </div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> <span class="comment">// Определяем количество читаемых символов</span></div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> uint32_t n = (tail_size &gt; target_hdr-&gt;<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#afd1a5c51af6f97d170c2ccbbe3e34699">size</a>) ? target_hdr-&gt;<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#afd1a5c51af6f97d170c2ccbbe3e34699">size</a> : tail_size;</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> <span class="comment">// Начальная позиция для чтения последних tail_size символов</span></div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> uint32_t start = target_hdr-&gt;<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#afd1a5c51af6f97d170c2ccbbe3e34699">size</a> - n;</div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> <span class="comment">// Копируем данные из Flash в RAM</span></div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> memcpy(Buffer, &amp;target_hdr-&gt;<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#ae7276198385c8d6f6508f433d042d52a">data</a>[start], n);</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> </div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> <span class="keywordflow">if</span>(read_size != NULL)</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> {</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> *read_size = n;</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> }</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> </div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> __DSB();</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> __ISB();</div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> </div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> <span class="keywordflow">return</span> (<span class="keywordtype">int</span>)(target_hdr-&gt;<a class="code hl_variable" href="struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57">tag</a> &amp; 0xFF);</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span>}</div>
</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span><span class="comment"></span> </div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span><span class="comment">/**</span></div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span><span class="comment"> * @brief Стирание сектора Flash с RTT-буфером</span></div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span><span class="comment"> */</span></div>
<div class="foldopen" id="foldopen00375" data-start="{" data-end="}">
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"><a class="line" href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga8d8c6850e32b42871faefce3352012d1"> 375</a></span>__STATIC_FORCEINLINE <span class="keywordtype">int</span> <a class="code hl_function" href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga8d8c6850e32b42871faefce3352012d1">RTT_EraseFlash</a>(<span class="keywordtype">void</span>)</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span>{</div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> FLASH_EraseInitTypeDef eraseInit;</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> uint32_t pageError = 0;</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> </div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> <a class="code hl_function" href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga21353cb4f5af666237739e62ce019cd6">RTT_FlashPrepare</a>();</div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> </div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> eraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> eraseInit.Sector = <a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#ga3bc1b76864e1d32cbdd174d4caae7724">RTT_FLASH_SECTOR</a>;</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> eraseInit.NbSectors = 1;</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> </div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> <span class="keywordflow">if</span> (HAL_FLASHEx_Erase(&amp;eraseInit, &amp;pageError) != HAL_OK)</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> {</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> }</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> HAL_FLASH_Lock();</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span>}</div>
</div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span><span class="comment"></span> </div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span><span class="comment">/** TRACE_RTT_FLASH</span></div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span><span class="comment"> * @}</span></div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span><span class="comment"> */</span></div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> </div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span><span class="preprocessor">#else </span><span class="comment">// HAL_MODULE_ENABLED &amp;&amp; RTT_TRACE_ENABLE</span></div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span><span class="preprocessor">#define RTT_FlashPrepare(...)</span></div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span><span class="preprocessor">#define RTT_EraseFlash(...) 0</span></div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span><span class="preprocessor">#define RTT_SaveToFlash(...) 0</span></div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span><span class="preprocessor">#define RTT_ReadFromFlash(...) 0</span></div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span><span class="preprocessor">#endif </span><span class="comment">// HAL_MODULE_ENABLED &amp;&amp; RTT_TRACE_ENABLE</span></div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> </div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> </div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> </div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span><span class="comment"></span> </div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span><span class="comment">/** </span></div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span><span class="comment"> * @addtogroup TRACE_HARDFAULT Hardfault trace defines</span></div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span><span class="comment"> * @ingroup TRACE</span></div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span><span class="comment"> * @brief Модуль трассировки HardFault с возможностью сохранения RTT буфера во Flash</span></div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span><span class="comment"> * @details</span></div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span><span class="comment"> * Этот модуль позволяет сохранять контекст процессора и последние символы RTT буфера при возникновении HardFault.</span></div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span><span class="comment"> *</span></div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span><span class="comment"> * Механизм работы:</span></div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span><span class="comment"> * - При срабатывании HardFault вызывается HF_HandleFault(), который:</span></div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span><span class="comment"> * 1. Получает указатель на стек, где произошёл HardFault (MSP или PSP).</span></div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span><span class="comment"> * 2. Выводит значения регистров R0-R3, R12, LR, PC, PSR и системных регистров SCB.</span></div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span><span class="comment"> * 3. Формирует строку с регистрами и копирует последние символы RTT буфера.</span></div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span><span class="comment"> * 4. Сохраняет данные во Flash с базовым тегом HF_RTT_TAG_BASE.</span></div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span><span class="comment"> * - Для восстановления последнего HardFault используется HF_CheckRecovered(), который:</span></div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span><span class="comment"> * 1. Читает запись во Flash по базовому тегу.</span></div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span><span class="comment"> * 2. Выводит сохранённый RTT буфер и контекст регистров.</span></div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span><span class="comment"> * 3. Опционально стирает Flash после восстановления.</span></div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span><span class="comment"> * </span></div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span><span class="comment"> * Параметры:</span></div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span><span class="comment"> * - @ref HARDFAULT_SERIAL_TRACE - Включить обработку и serial трассировку Hardfault</span></div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span><span class="comment"> * Если отключена то вставляются заглушки, никак не влияющие на параметры и остальную программу</span></div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span><span class="comment"> * - @ref HF_RTT_TAG_BASE - Базовый тег RTT Flash для HardFault </span></div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span><span class="comment"> * - @ref HF_RTT_TAIL_SIZE - Размер буфера RTT, который сохранится при Hardfault</span></div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span><span class="comment"> * - @ref HF_STACK_DUMP_WORDS - Сколько слов стека будет проанализировано во время Hardfault</span></div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span><span class="comment"> * - @ref HF_FLASH_ADDR - Адрес FLASH куда положится RTT буфер</span></div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span><span class="comment"> * - @ref HF_RAM_END - Конец RAM памяти (чтобы во время анализа стека не выйти за пределы)</span></div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span><span class="comment"> * </span></div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span><span class="comment"> @code</span></div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span><span class="comment"> void Hardfault()</span></div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span><span class="comment"> {</span></div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span><span class="comment"> HF_HandleFault();</span></div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span><span class="comment"> NVIC_SystemReset();</span></div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span><span class="comment"> }</span></div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span><span class="comment"></span> </div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span><span class="comment"> int main()</span></div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span><span class="comment"> {</span></div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span><span class="comment"> if(HF_CheckRecovered(0))</span></div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span><span class="comment"> {</span></div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span><span class="comment"> //set hardfault error</span></div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span><span class="comment"> RTT_EraseFlash(); // erase rtt flash after message readed</span></div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span><span class="comment"> }</span></div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span><span class="comment"> } </span></div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span><span class="comment"> @endcode</span></div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span><span class="comment"> * @{</span></div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span><span class="comment"> */</span></div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span><span class="preprocessor">#if defined(HAL_MODULE_ENABLED) &amp;&amp; defined(HARDFAULT_SERIAL_TRACE)</span></div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> </div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span><span class="preprocessor">#ifndef HF_RTT_TAIL_SIZE</span></div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span><span class="preprocessor">#define HF_RTT_TAIL_SIZE RTT_FLASH_BUFFER_SIZE </span><span class="comment">///&lt; Размер буфера RTT, который сохранится при Hardfault</span></div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span><span class="comment"></span> </div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span><span class="comment">/**</span></div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span><span class="comment"> * @brief Контекст стек-фрейма процессора при HardFault</span></div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span><span class="comment"> * @details Сохраняет регистры R0-R3, R12, LR, PC, PSR для последующего анализа.</span></div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span><span class="comment"> */</span></div>
<div class="foldopen" id="foldopen00463" data-start="{" data-end="};">
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"><a class="line" href="struct_h_f___stack_frame__t.html"> 463</a></span><span class="keyword">typedef</span> <span class="keyword">struct </span>{</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"><a class="line" href="struct_h_f___stack_frame__t.html#a4146ed28926b5f234132b7112119a413"> 464</a></span> uint32_t <a class="code hl_variable" href="struct_h_f___stack_frame__t.html#a4146ed28926b5f234132b7112119a413">r0</a>; <span class="comment">///&lt; Регистр R0</span></div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"><a class="line" href="struct_h_f___stack_frame__t.html#a286104d19185714940645a9df814ddea"> 465</a></span> uint32_t <a class="code hl_variable" href="struct_h_f___stack_frame__t.html#a286104d19185714940645a9df814ddea">r1</a>; <span class="comment">///&lt; Регистр R1</span></div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"><a class="line" href="struct_h_f___stack_frame__t.html#a5a52e5006dabcf68c0fa4cfb0e03335b"> 466</a></span> uint32_t <a class="code hl_variable" href="struct_h_f___stack_frame__t.html#a5a52e5006dabcf68c0fa4cfb0e03335b">r2</a>; <span class="comment">///&lt; Регистр R2</span></div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"><a class="line" href="struct_h_f___stack_frame__t.html#a453c7af42b6928a693af422e17c981d3"> 467</a></span> uint32_t <a class="code hl_variable" href="struct_h_f___stack_frame__t.html#a453c7af42b6928a693af422e17c981d3">r3</a>; <span class="comment">///&lt; Регистр R3</span></div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"><a class="line" href="struct_h_f___stack_frame__t.html#a819ee3bc518c460ece1b7c4079f8f80b"> 468</a></span> uint32_t <a class="code hl_variable" href="struct_h_f___stack_frame__t.html#a819ee3bc518c460ece1b7c4079f8f80b">r12</a>; <span class="comment">///&lt; Регистр R12</span></div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"><a class="line" href="struct_h_f___stack_frame__t.html#a6e51904297f7725e96d5b5fb291ef577"> 469</a></span> uint32_t <a class="code hl_variable" href="struct_h_f___stack_frame__t.html#a6e51904297f7725e96d5b5fb291ef577">lr</a>; <span class="comment">///&lt; Link Register</span></div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"><a class="line" href="struct_h_f___stack_frame__t.html#a16563896004751c90e41c81ae4570732"> 470</a></span> uint32_t <a class="code hl_variable" href="struct_h_f___stack_frame__t.html#a16563896004751c90e41c81ae4570732">pc</a>; <span class="comment">///&lt; Program Counter</span></div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"><a class="line" href="struct_h_f___stack_frame__t.html#ae47cb051ee3c94471bfd4fe7e49c55f9"> 471</a></span> uint32_t <a class="code hl_variable" href="struct_h_f___stack_frame__t.html#ae47cb051ee3c94471bfd4fe7e49c55f9">psr</a>; <span class="comment">///&lt; Program Status Register</span></div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span>} <a class="code hl_struct" href="struct_h_f___stack_frame__t.html">HF_StackFrame_t</a>;</div>
</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span><span class="comment"></span> </div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span><span class="comment">/**</span></div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span><span class="comment"> * @brief Проверка и вывод последнего HardFault-трейса из Flash</span></div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span><span class="comment"> * @details</span></div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span><span class="comment"> * Функция ищет последнюю запись HardFault по базовому тегу HF_RTT_TAG_BASE</span></div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span><span class="comment"> * и выводит её содержимое в консоль. После успешного вывода Flash можно опционально очистить.</span></div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span><span class="comment"> *</span></div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span><span class="comment"> * @return int</span></div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span><span class="comment"> * - 1 — данные HardFault найдены и выведены</span></div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span><span class="comment"> * - 0 — данные отсутствуют или тег не найден</span></div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span><span class="comment"> * </span></div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span><span class="comment"> * @note Вызов рекомендуется при инициализации приложения для анализа предыдущего сбоя.</span></div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span><span class="comment"> */</span></div>
<div class="foldopen" id="foldopen00486" data-start="{" data-end="}">
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"><a class="line" href="group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html#ga03f8b6f3b537ee1c8e91065c60db504f"> 486</a></span>__STATIC_FORCEINLINE <span class="keywordtype">int</span> <a class="code hl_function" href="group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html#ga03f8b6f3b537ee1c8e91065c60db504f">HF_CheckRecovered</a>(<span class="keywordtype">int</span> erase)</div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span>{</div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> <span class="keywordtype">char</span> buffer[<a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#ga501312b24e322de4dd6755ad442f0ba3">RTT_FLASH_BUFFER_SIZE</a>];</div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> uint32_t read_size = 0;</div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> <span class="keywordtype">int</span> n_hardfault = <a class="code hl_function" href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga734b2ebbf0c77699b739013878cfd146">RTT_ReadFromFlash</a>(<a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#gadc960255719c7eff4bdfaa850be9b313">HF_RTT_TAG_BASE</a>, buffer, <a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#gafcc7ea03d4df8f1909e580b519a7f3ca">HF_RTT_TAIL_SIZE</a>, &amp;read_size);</div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> <span class="keywordflow">if</span> (n_hardfault &gt; 0)</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> {</div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;\n--- Recovered HardFault RTT buffer #%u ---\n&quot;</span>, n_hardfault);</div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; read_size; i++)</div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> {</div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> <span class="keywordtype">char</span> c = buffer[i];</div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> <span class="keywordflow">if</span> (c == 0 || c == (<span class="keywordtype">char</span>)0xFF) <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;%c&quot;</span>, c);</div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> }</div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> </div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> <span class="keywordflow">if</span>(erase)</div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> <a class="code hl_function" href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga8d8c6850e32b42871faefce3352012d1">RTT_EraseFlash</a>();</div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;\n--------- HardFault Dump End ---------\n&quot;</span>);</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> <span class="keywordflow">return</span> 1;</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> }</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span>}</div>
</div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> </div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> </div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span><span class="keyword">static</span> <a class="code hl_struct" href="struct_h_f___stack_frame__t.html">HF_StackFrame_t</a> *stack_frame;</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span><span class="keyword">static</span> uint32_t stack_dump[<a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#gaa31234688b333a505aaa57b8ecdedf5b">HF_STACK_DUMP_WORDS</a>];</div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span><span class="keyword">static</span> <span class="keywordtype">void</span> *ret_adr[10] = {0};<span class="comment"></span></div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span><span class="comment">/**</span></div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span><span class="comment"> * @brief Обработчик HardFault</span></div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span><span class="comment"> * @details</span></div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span><span class="comment"> * Вызывается из прерывания HardFault или в любом месте где понятно что ошибка критическая.</span></div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span><span class="comment"> * Последовательно выполняет:</span></div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span><span class="comment"> * 1. Определяет активный стек (MSP или PSP) на момент сбоя.</span></div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span><span class="comment"> * 2. Сохраняет значения регистров R0-R3, R12, LR, PC, PSR.</span></div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span><span class="comment"> * 3. Выводит системные регистры CFSR, HFSR, DFSR, AFSR, MMFAR, BFAR.</span></div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span><span class="comment"> * 4. Формирует stack trace с 3 уровнями возврата.</span></div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span><span class="comment"> * 5. Копирует последние символы RTT буфера.</span></div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span><span class="comment"> * 6. Сохраняет все данные во Flash через RTT_SaveToFlash с базовым тегом HF_RTT_TAG_BASE.</span></div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span><span class="comment"> *</span></div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span><span class="comment"> * @note Функция защищена, так как вызывается в контексте сбоя — минимизирует использование вызовов HAL.</span></div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span><span class="comment"> */</span></div>
<div class="foldopen" id="foldopen00527" data-start="{" data-end="}">
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"><a class="line" href="group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html#gadd8e10e7ec3b0204f7f92062ecd452f7"> 527</a></span>__STATIC_FORCEINLINE <span class="keywordtype">void</span> <a class="code hl_function" href="group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html#gadd8e10e7ec3b0204f7f92062ecd452f7">HF_HandleFault</a>(<span class="keywordtype">void</span>)</div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span>{</div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> <span class="comment">// Получаем указатель на стек, где произошёл HardFault</span></div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span> __ASM <span class="keyword">volatile</span>(</div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> <span class="stringliteral">&quot;TST lr, #4 \n&quot;</span></div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> <span class="stringliteral">&quot;ITE EQ \n&quot;</span></div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span> <span class="stringliteral">&quot;MRSEQ %[ptr], MSP\n&quot;</span></div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> <span class="stringliteral">&quot;MRSNE %[ptr], PSP\n&quot;</span></div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> : [ptr] <span class="stringliteral">&quot;=r&quot;</span>(stack_frame)</div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span> );</div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> </div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;\n===== HardFault occurred! =====\n&quot;</span>);</div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;R0 = 0x%08X\n&quot;</span>, stack_frame-&gt;r0);</div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;R1 = 0x%08X\n&quot;</span>, stack_frame-&gt;r1);</div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;R2 = 0x%08X\n&quot;</span>, stack_frame-&gt;r2);</div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;R3 = 0x%08X\n&quot;</span>, stack_frame-&gt;r3);</div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;R12 = 0x%08X\n&quot;</span>, stack_frame-&gt;r12);</div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;LR = 0x%08X\n&quot;</span>, stack_frame-&gt;lr);</div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;PC = 0x%08X\n&quot;</span>, stack_frame-&gt;pc);</div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;PSR = 0x%08X\n&quot;</span>, stack_frame-&gt;psr);</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> </div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;CFSR = 0x%08X\n&quot;</span>, SCB-&gt;CFSR);</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;HFSR = 0x%08X\n&quot;</span>, SCB-&gt;HFSR);</div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;DFSR = 0x%08X\n&quot;</span>, SCB-&gt;DFSR);</div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;AFSR = 0x%08X\n&quot;</span>, SCB-&gt;AFSR);</div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;MMFAR = 0x%08X\n&quot;</span>, SCB-&gt;MMFAR);</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;BFAR = 0x%08X\n&quot;</span>, SCB-&gt;BFAR);</div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> </div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> <span class="comment">// --- Stack trace ---</span></div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot;--- Stack trace ---\n&quot;</span>);</div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> ret_adr[0] = __builtin_return_address(0);</div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> ret_adr[1] = __builtin_return_address(1);</div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span> ret_adr[2] = __builtin_return_address(2);</div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> </div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; 3; i++) <span class="comment">// развернуть n уровней</span></div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> {</div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> <span class="keywordflow">if</span>(ret_adr[i])</div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> <a class="code hl_define" href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a>(<span class="stringliteral">&quot; #%d: 0x%08lX\r\n&quot;</span>, i, ret_adr[i]); <span class="comment">// -1 для Thumb</span></div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span> }</div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> <a class="code hl_function" href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga79f222c8ab644de4d47f07528d1edd63">RTT_SaveToFlash</a>(<a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#gadc960255719c7eff4bdfaa850be9b313">HF_RTT_TAG_BASE</a>, <a class="code hl_define" href="group___t_r_a_c_e___c_o_n_f_i_g.html#gafcc7ea03d4df8f1909e580b519a7f3ca">HF_RTT_TAIL_SIZE</a>);</div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"> 567</span>}</div>
</div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span><span class="preprocessor">#else </span><span class="comment">// HAL_MODULE_ENABLED &amp;&amp; HARDFAULT_SERIAL_TRACE</span></div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span><span class="preprocessor">#define HF_CheckRecovered(...) 0</span></div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span><span class="preprocessor">#define HF_HandleFault(...)</span></div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span><span class="preprocessor">#endif </span><span class="comment">// HAL_MODULE_ENABLED &amp;&amp; HARDFAULT_SERIAL_TRACE</span><span class="comment"></span></div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span><span class="comment">/** TRACE_HARDFAULT</span></div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span><span class="comment"> * @}</span></div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span><span class="comment"> */</span><span class="preprocessor"></span></div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span> </div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> </div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> </div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span><span class="preprocessor">#endif </span><span class="comment">//__TRACE_H_</span></div>
<div class="ttc" id="agroup___t_r_a_c_e___c_o_n_f_i_g_html_ga3bc1b76864e1d32cbdd174d4caae7724"><div class="ttname"><a href="group___t_r_a_c_e___c_o_n_f_i_g.html#ga3bc1b76864e1d32cbdd174d4caae7724">RTT_FLASH_SECTOR</a></div><div class="ttdeci">#define RTT_FLASH_SECTOR</div><div class="ttdoc">Сектор FLASH куда положится RTT буфер</div><div class="ttdef"><b>Definition</b> <a href="mylibs__config_8h_source.html#l00038">mylibs_config.h:38</a></div></div>
<div class="ttc" id="agroup___t_r_a_c_e___c_o_n_f_i_g_html_ga501312b24e322de4dd6755ad442f0ba3"><div class="ttname"><a href="group___t_r_a_c_e___c_o_n_f_i_g.html#ga501312b24e322de4dd6755ad442f0ba3">RTT_FLASH_BUFFER_SIZE</a></div><div class="ttdeci">#define RTT_FLASH_BUFFER_SIZE</div><div class="ttdoc">Размер буфера RTT в Flash.</div><div class="ttdef"><b>Definition</b> <a href="mylibs__config_8h_source.html#l00037">mylibs_config.h:37</a></div></div>
<div class="ttc" id="agroup___t_r_a_c_e___c_o_n_f_i_g_html_ga8e56f75d3ab8a89ddde1404ae23c3297"><div class="ttname"><a href="group___t_r_a_c_e___c_o_n_f_i_g.html#ga8e56f75d3ab8a89ddde1404ae23c3297">RTT_FLASH_SECTOR_START</a></div><div class="ttdeci">#define RTT_FLASH_SECTOR_START</div><div class="ttdoc">Начало сектора RTT_FLASH_SECTOR.</div><div class="ttdef"><b>Definition</b> <a href="mylibs__config_8h_source.html#l00039">mylibs_config.h:39</a></div></div>
<div class="ttc" id="agroup___t_r_a_c_e___c_o_n_f_i_g_html_gaa31234688b333a505aaa57b8ecdedf5b"><div class="ttname"><a href="group___t_r_a_c_e___c_o_n_f_i_g.html#gaa31234688b333a505aaa57b8ecdedf5b">HF_STACK_DUMP_WORDS</a></div><div class="ttdeci">#define HF_STACK_DUMP_WORDS</div><div class="ttdoc">Сколько слов стека будет проанализировано во время Hardfault.</div><div class="ttdef"><b>Definition</b> <a href="mylibs__config_8h_source.html#l00046">mylibs_config.h:46</a></div></div>
<div class="ttc" id="agroup___t_r_a_c_e___c_o_n_f_i_g_html_gadc960255719c7eff4bdfaa850be9b313"><div class="ttname"><a href="group___t_r_a_c_e___c_o_n_f_i_g.html#gadc960255719c7eff4bdfaa850be9b313">HF_RTT_TAG_BASE</a></div><div class="ttdeci">#define HF_RTT_TAG_BASE</div><div class="ttdoc">базовый тег для HardFault</div><div class="ttdef"><b>Definition</b> <a href="mylibs__config_8h_source.html#l00044">mylibs_config.h:44</a></div></div>
<div class="ttc" id="agroup___t_r_a_c_e___c_o_n_f_i_g_html_gafcc7ea03d4df8f1909e580b519a7f3ca"><div class="ttname"><a href="group___t_r_a_c_e___c_o_n_f_i_g.html#gafcc7ea03d4df8f1909e580b519a7f3ca">HF_RTT_TAIL_SIZE</a></div><div class="ttdeci">#define HF_RTT_TAIL_SIZE</div><div class="ttdoc">Размер буфера RTT, который сохранится при Hardfault.</div><div class="ttdef"><b>Definition</b> <a href="mylibs__config_8h_source.html#l00045">mylibs_config.h:45</a></div></div>
<div class="ttc" id="agroup___t_r_a_c_e___c_o_n_f_i_g_html_gafeca0be3688dea07ff443f894668003d"><div class="ttname"><a href="group___t_r_a_c_e___c_o_n_f_i_g.html#gafeca0be3688dea07ff443f894668003d">RTT_FLASH_SECTOR_END</a></div><div class="ttdeci">#define RTT_FLASH_SECTOR_END</div><div class="ttdoc">Конец сектора RTT_FLASH_SECTOR.</div><div class="ttdef"><b>Definition</b> <a href="mylibs__config_8h_source.html#l00040">mylibs_config.h:40</a></div></div>
<div class="ttc" id="agroup___t_r_a_c_e___h_a_r_d_f_a_u_l_t_html_ga03f8b6f3b537ee1c8e91065c60db504f"><div class="ttname"><a href="group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html#ga03f8b6f3b537ee1c8e91065c60db504f">HF_CheckRecovered</a></div><div class="ttdeci">__STATIC_FORCEINLINE int HF_CheckRecovered(int erase)</div><div class="ttdoc">Проверка и вывод последнего HardFault-трейса из Flash.</div><div class="ttdef"><b>Definition</b> <a href="#l00486">trace.h:486</a></div></div>
<div class="ttc" id="agroup___t_r_a_c_e___h_a_r_d_f_a_u_l_t_html_gadd8e10e7ec3b0204f7f92062ecd452f7"><div class="ttname"><a href="group___t_r_a_c_e___h_a_r_d_f_a_u_l_t.html#gadd8e10e7ec3b0204f7f92062ecd452f7">HF_HandleFault</a></div><div class="ttdeci">__STATIC_FORCEINLINE void HF_HandleFault(void)</div><div class="ttdoc">Обработчик HardFault.</div><div class="ttdef"><b>Definition</b> <a href="#l00527">trace.h:527</a></div></div>
<div class="ttc" id="agroup___t_r_a_c_e___r_t_t___f_l_a_s_h_html_ga21353cb4f5af666237739e62ce019cd6"><div class="ttname"><a href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga21353cb4f5af666237739e62ce019cd6">RTT_FlashPrepare</a></div><div class="ttdeci">__STATIC_FORCEINLINE void RTT_FlashPrepare(void)</div><div class="ttdoc">Подготовка Flash к записи</div><div class="ttdef"><b>Definition</b> <a href="#l00190">trace.h:190</a></div></div>
<div class="ttc" id="agroup___t_r_a_c_e___r_t_t___f_l_a_s_h_html_ga734b2ebbf0c77699b739013878cfd146"><div class="ttname"><a href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga734b2ebbf0c77699b739013878cfd146">RTT_ReadFromFlash</a></div><div class="ttdeci">__STATIC_FORCEINLINE int RTT_ReadFromFlash(uint32_t tag, char *Buffer, uint32_t tail_size, uint32_t *read_size)</div><div class="ttdoc">Читает последние символы RTT-буфера из Flash по тегу</div><div class="ttdef"><b>Definition</b> <a href="#l00311">trace.h:311</a></div></div>
<div class="ttc" id="agroup___t_r_a_c_e___r_t_t___f_l_a_s_h_html_ga79f222c8ab644de4d47f07528d1edd63"><div class="ttname"><a href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga79f222c8ab644de4d47f07528d1edd63">RTT_SaveToFlash</a></div><div class="ttdeci">__STATIC_FORCEINLINE int RTT_SaveToFlash(uint32_t tag, uint32_t tail_size)</div><div class="ttdoc">Сохраняет последние символы RTT-буфера в Flash по тегу</div><div class="ttdef"><b>Definition</b> <a href="#l00214">trace.h:214</a></div></div>
<div class="ttc" id="agroup___t_r_a_c_e___r_t_t___f_l_a_s_h_html_ga8d8c6850e32b42871faefce3352012d1"><div class="ttname"><a href="group___t_r_a_c_e___r_t_t___f_l_a_s_h.html#ga8d8c6850e32b42871faefce3352012d1">RTT_EraseFlash</a></div><div class="ttdeci">__STATIC_FORCEINLINE int RTT_EraseFlash(void)</div><div class="ttdoc">Стирание сектора Flash с RTT-буфером</div><div class="ttdef"><b>Definition</b> <a href="#l00375">trace.h:375</a></div></div>
<div class="ttc" id="agroup___t_r_a_c_e___s_e_r_i_a_l_html_gae9b9b8a611e291a2f2aa5abf99f3ebaa"><div class="ttname"><a href="group___t_r_a_c_e___s_e_r_i_a_l.html#gae9b9b8a611e291a2f2aa5abf99f3ebaa">my_printf</a></div><div class="ttdeci">#define my_printf(...)</div><div class="ttdoc">Универсальный макрос для вывода трассировки</div><div class="ttdef"><b>Definition</b> <a href="#l00071">trace.h:71</a></div></div>
<div class="ttc" id="amylibs__defs_8h_html"><div class="ttname"><a href="mylibs__defs_8h.html">mylibs_defs.h</a></div><div class="ttdoc">Заголочный файл для дефайнов библиотеки MyLibsGeneral.</div></div>
<div class="ttc" id="astruct_h_f___stack_frame__t_html"><div class="ttname"><a href="struct_h_f___stack_frame__t.html">HF_StackFrame_t</a></div><div class="ttdoc">Контекст стек-фрейма процессора при HardFault.</div><div class="ttdef"><b>Definition</b> <a href="#l00463">trace.h:463</a></div></div>
<div class="ttc" id="astruct_h_f___stack_frame__t_html_a16563896004751c90e41c81ae4570732"><div class="ttname"><a href="struct_h_f___stack_frame__t.html#a16563896004751c90e41c81ae4570732">HF_StackFrame_t::pc</a></div><div class="ttdeci">uint32_t pc</div><div class="ttdoc">Program Counter.</div><div class="ttdef"><b>Definition</b> <a href="#l00470">trace.h:470</a></div></div>
<div class="ttc" id="astruct_h_f___stack_frame__t_html_a286104d19185714940645a9df814ddea"><div class="ttname"><a href="struct_h_f___stack_frame__t.html#a286104d19185714940645a9df814ddea">HF_StackFrame_t::r1</a></div><div class="ttdeci">uint32_t r1</div><div class="ttdoc">Регистр R1.</div><div class="ttdef"><b>Definition</b> <a href="#l00465">trace.h:465</a></div></div>
<div class="ttc" id="astruct_h_f___stack_frame__t_html_a4146ed28926b5f234132b7112119a413"><div class="ttname"><a href="struct_h_f___stack_frame__t.html#a4146ed28926b5f234132b7112119a413">HF_StackFrame_t::r0</a></div><div class="ttdeci">uint32_t r0</div><div class="ttdoc">Регистр R0.</div><div class="ttdef"><b>Definition</b> <a href="#l00464">trace.h:464</a></div></div>
<div class="ttc" id="astruct_h_f___stack_frame__t_html_a453c7af42b6928a693af422e17c981d3"><div class="ttname"><a href="struct_h_f___stack_frame__t.html#a453c7af42b6928a693af422e17c981d3">HF_StackFrame_t::r3</a></div><div class="ttdeci">uint32_t r3</div><div class="ttdoc">Регистр R3.</div><div class="ttdef"><b>Definition</b> <a href="#l00467">trace.h:467</a></div></div>
<div class="ttc" id="astruct_h_f___stack_frame__t_html_a5a52e5006dabcf68c0fa4cfb0e03335b"><div class="ttname"><a href="struct_h_f___stack_frame__t.html#a5a52e5006dabcf68c0fa4cfb0e03335b">HF_StackFrame_t::r2</a></div><div class="ttdeci">uint32_t r2</div><div class="ttdoc">Регистр R2.</div><div class="ttdef"><b>Definition</b> <a href="#l00466">trace.h:466</a></div></div>
<div class="ttc" id="astruct_h_f___stack_frame__t_html_a6e51904297f7725e96d5b5fb291ef577"><div class="ttname"><a href="struct_h_f___stack_frame__t.html#a6e51904297f7725e96d5b5fb291ef577">HF_StackFrame_t::lr</a></div><div class="ttdeci">uint32_t lr</div><div class="ttdoc">Link Register.</div><div class="ttdef"><b>Definition</b> <a href="#l00469">trace.h:469</a></div></div>
<div class="ttc" id="astruct_h_f___stack_frame__t_html_a819ee3bc518c460ece1b7c4079f8f80b"><div class="ttname"><a href="struct_h_f___stack_frame__t.html#a819ee3bc518c460ece1b7c4079f8f80b">HF_StackFrame_t::r12</a></div><div class="ttdeci">uint32_t r12</div><div class="ttdoc">Регистр R12.</div><div class="ttdef"><b>Definition</b> <a href="#l00468">trace.h:468</a></div></div>
<div class="ttc" id="astruct_h_f___stack_frame__t_html_ae47cb051ee3c94471bfd4fe7e49c55f9"><div class="ttname"><a href="struct_h_f___stack_frame__t.html#ae47cb051ee3c94471bfd4fe7e49c55f9">HF_StackFrame_t::psr</a></div><div class="ttdeci">uint32_t psr</div><div class="ttdoc">Program Status Register.</div><div class="ttdef"><b>Definition</b> <a href="#l00471">trace.h:471</a></div></div>
<div class="ttc" id="astruct_r_t_t___flash_header__t_html"><div class="ttname"><a href="struct_r_t_t___flash_header__t.html">RTT_FlashHeader_t</a></div><div class="ttdoc">Структура RTT, которая будет положена в Flash.</div><div class="ttdef"><b>Definition</b> <a href="#l00180">trace.h:180</a></div></div>
<div class="ttc" id="astruct_r_t_t___flash_header__t_html_a844ee5470a323a749856cbb7a682dc57"><div class="ttname"><a href="struct_r_t_t___flash_header__t.html#a844ee5470a323a749856cbb7a682dc57">RTT_FlashHeader_t::tag</a></div><div class="ttdeci">uint32_t tag</div><div class="ttdoc">Уникальный идентификатор буфера</div><div class="ttdef"><b>Definition</b> <a href="#l00181">trace.h:181</a></div></div>
<div class="ttc" id="astruct_r_t_t___flash_header__t_html_ae7276198385c8d6f6508f433d042d52a"><div class="ttname"><a href="struct_r_t_t___flash_header__t.html#ae7276198385c8d6f6508f433d042d52a">RTT_FlashHeader_t::data</a></div><div class="ttdeci">char data[1024]</div><div class="ttdoc">Буфер RTT.</div><div class="ttdef"><b>Definition</b> <a href="#l00183">trace.h:183</a></div></div>
<div class="ttc" id="astruct_r_t_t___flash_header__t_html_afd1a5c51af6f97d170c2ccbbe3e34699"><div class="ttname"><a href="struct_r_t_t___flash_header__t.html#afd1a5c51af6f97d170c2ccbbe3e34699">RTT_FlashHeader_t::size</a></div><div class="ttdeci">uint32_t size</div><div class="ttdoc">Размер данных</div><div class="ttdef"><b>Definition</b> <a href="#l00182">trace.h:182</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
</div><!-- container -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a href="dir_9e11e9a41112194af3eee6cc728f9515.html">MyLibsGeneral</a></li><li class="navelem"><a href="dir_eb423fea8a9c4b9b32b922020ec391e1.html">Inc</a></li><li class="navelem"><a href="trace_8h.html">trace.h</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.14.0 </li>
</ul>
</div>
</body>
</html>