231 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!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.10.0"/>
 | 
						||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
 | 
						||
<title>STM MATLAB Simulator: MATLAB STM32 EMULATOR</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>
 | 
						||
<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/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">STM MATLAB Simulator
 | 
						||
   </div>
 | 
						||
  </td>
 | 
						||
 </tr>
 | 
						||
 </tbody>
 | 
						||
</table>
 | 
						||
</div>
 | 
						||
<!-- end header part -->
 | 
						||
<!-- Generated by Doxygen 1.10.0 -->
 | 
						||
<script type="text/javascript">
 | 
						||
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
 | 
						||
var searchBox = new SearchBox("searchBox", "search/",'.html');
 | 
						||
/* @license-end */
 | 
						||
</script>
 | 
						||
<script type="text/javascript" src="menudata.js"></script>
 | 
						||
<script type="text/javascript" src="menu.js"></script>
 | 
						||
<script type="text/javascript">
 | 
						||
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
 | 
						||
$(function() {
 | 
						||
  initMenu('',true,false,'search.php','Search');
 | 
						||
  $(function() { init_search(); });
 | 
						||
});
 | 
						||
/* @license-end */
 | 
						||
</script>
 | 
						||
<div id="main-nav"></div>
 | 
						||
</div><!-- top -->
 | 
						||
<!-- 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><div class="header">
 | 
						||
  <div class="headertitle"><div class="title">MATLAB STM32 EMULATOR </div></div>
 | 
						||
</div><!--header-->
 | 
						||
<div class="contents">
 | 
						||
<div class="textblock"><p><a class="anchor" id="md__f_1_2_work_2_projects_2_m_a_t_l_a_b_2matlab__stm__emulate_2_r_e_a_d_m_e"></a> <b>СОДЕРЖАНИЕ</b></p><ul>
 | 
						||
<li><a class="el" href="#общая-структура-эмулятора">Общая структура эмулятора</a></li>
 | 
						||
<li><a class="el" href="#описание-стуктуры-эмулятора-пример-для-stm32">Описание стуктуры эмулятора (пример для STM32)</a><ul>
 | 
						||
<li><a class="el" href="#оболочка-мк">Оболочка МК</a></li>
 | 
						||
<li><a class="el" href="#эмулятор-stm-для-matlab">Эмулятор STM для MATLAB</a></li>
 | 
						||
<li><a class="el" href="#код-пользователя">Код пользователя</a></li>
 | 
						||
</ul>
 | 
						||
</li>
 | 
						||
<li><a class="el" href="#инструкция">Инструкция</a><ul>
 | 
						||
<li><a class="el" href="#портирование-кода">Портирование кода</a></li>
 | 
						||
<li><a class="el" href="#как-скомпилировать-код">Как скомпилировать код</a></li>
 | 
						||
<li><a class="el" href="#как-запустить-отладку">Как запустить отладку</a></li>
 | 
						||
<li><a class="el" href="#ошибки">Ошибки при портировании</a></li>
 | 
						||
</ul>
 | 
						||
</li>
 | 
						||
</ul>
 | 
						||
<h1><a class="anchor" id="общая-структура-эмулятора"></a>
 | 
						||
Общая структура эмулятора</h1>
 | 
						||
<p>Эмулятор состоит из блух блоков:</p><ul>
 | 
						||
<li>приложение МК</li>
 | 
						||
<li>оболочка МК для MATLAB, которая запускает приложение МК и эмулирует его периферию</li>
 | 
						||
</ul>
 | 
						||
<p>Приложение МК в свою очередь разделено еще на два блока:</p><ul>
 | 
						||
<li>исходный код пользователя (код приложения)</li>
 | 
						||
<li>исходный код библиотек и драйверов</li>
 | 
						||
</ul>
 | 
						||
<p>Для каждого блока своя папка. Всего три папки:</p><ul>
 | 
						||
<li>Code (<a class="el" href="#код-пользователя">_код пользователя_</a>)</li>
 | 
						||
<li>MCU_STM32xxx_Matlab (<a class="el" href="#эмулятор-stm-для-matlab">_эмулятор STM для MATLAB_</a>)</li>
 | 
						||
<li>MCU_Wrapper (<a class="el" href="#оболочка-мк">_оболочка МК_</a>) <em>*в скобочках ссылки на подробное описание папки</em></li>
 | 
						||
</ul>
 | 
						||
<p>Далее приведена структура эмулятора. Инструкция для портирования кода в MATLAB приведена <a class="el" href="#инструкция">ниже</a></p>
 | 
						||
<h1><a class="anchor" id="описание-стуктуры-эмулятора-пример-для-stm32"></a>
 | 
						||
Описание стуктуры эмулятора (пример для STM32)</h1>
 | 
						||
<p>Здесь содержиться описание трех блоков эмулятора:</p><ul>
 | 
						||
<li><a class="el" href="#оболочка-мк">Оболочка МК</a></li>
 | 
						||
<li><a class="el" href="#эмулятор-stm-для-matlab">Эмулятор STM для MATLAB</a></li>
 | 
						||
<li><a class="el" href="#код-пользователя">Код пользователя</a></li>
 | 
						||
</ul>
 | 
						||
<h3><a class="anchor" id="оболочка-мк"></a>
 | 
						||
Оболочка МК</h3>
 | 
						||
<p>В этой папке содержаться оболочка(англ. wrapper) для запуска и контроля эмуляции микроконтроллеров в MATLAB (любого МК, не только STM). Оболочка представляет собой S-Function - блок в Simulink, который работает по скомпилированому коду. Компиляция происходит с помощью MSVC-компилятора.</p>
 | 
						||
<p>S-Function работает особым образом: на шаге <em>n</em> она запускает скомпилированный код и ждет пока этот код выполниться. Только когда завершается выполнение кода, S-Function переходит на следующий шаг <em>n</em>+1.</p>
 | 
						||
<p>Но программа МК это бесконечный цикл, который никогда не завершается. Поэтому есть несколько особенностей в выполнении такого кода в виде S-Function:</p><ul>
 | 
						||
<li>Для эмуляции создается отдельный поток для программы МК. Этот поток запускается в начале текущего шага симуляции, выполняется какое-то время, а потом приостанавливается. Это позволяет коду S-Function завершиться и перейти на следующий шаг.</li>
 | 
						||
<li>Необходимо закрыть поток программы МК в конце симуляции. Для этого используется особый дефайн для while. Этот дефайн помимо условия while, проверяет условие окончания симуляции. И если симуляцию надо завершить, все бесконечные циклы <em><a class="el" href="group___m_c_u___w_r_a_p_p_e_r.html#ga866c2dad3e54488a018e859b3dc6feba" title="Redefine C while statement with sim_while() macro.">while()</a></em> пропускаются и поток доходит до конца функции <em><a class="el" href="mcu__wrapper_8c.html#a840291bc02cba5474a4cb46a9b9566fe" title="Главная функция приложения МК.">main()</a></em> и завершает себя.</li>
 | 
						||
</ul>
 | 
						||
<p>Всего оболочка содержит 4 файла:</p><ul>
 | 
						||
<li><a class="el" href="mcu__wrapper_8c.html" title="Исходный код оболочки МК.">mcu_wrapper.c</a>     - файл, который запускает код МК и управляет его ходом. В нем содержаться функции для запуска/остановки потока программы МК, считывании входов и запись входов S-Function в соответствии с I/O портами МК.</li>
 | 
						||
<li><a class="el" href="_m_c_u_8c.html" title="Исходный код S-Function.">MCU.c</a>          - базовый файл, который представляет собой исходный код для компиляции S-Function в MATLAB. Вызывает функции из "mcu_wrapper.c"</li>
 | 
						||
<li><a class="el" href="mcu__wrapper__conf_8h.html" title="Заголовочный файл для оболочки МК.">mcu_wrapper_conf.h</a>   - общий для <a class="el" href="mcu__wrapper_8c.html" title="Исходный код оболочки МК.">mcu_wrapper.c</a> и <a class="el" href="_m_c_u_8c.html" title="Исходный код S-Function.">MCU.c</a> заголовочный файл. Содержит настройки для блока S-Function, а также дефайны для управления ходом программы МК.</li>
 | 
						||
<li><a class="el" href="run__mex_8bat.html" title="Батник для компиляции оболочки МК.">run_mex.bat</a>       - скрипт для компиляции кода компилятором MSVC. В нем прописываются пути для заголовочных файлов ".h", указываются файлы исходного кода ".c" и прописываются дефайны для компиляции.</li>
 | 
						||
</ul>
 | 
						||
<h3><a class="anchor" id="эмулятор-stm-для-matlab"></a>
 | 
						||
Эмулятор STM для MATLAB</h3>
 | 
						||
<p>В папке "_\MCU_STM32xxx_Matlab_" есть два файла "stm32fxxx_matlab_conf.c/.h".</p>
 | 
						||
<p>В них задаётся используемая периферия и подключаются библиотеки для периферии. Также объявляются функкции для инициализации/деинициализации периферии МК и структуры для эмуляции периферии. Симулятор МК находится в папке STM32F4xx_SIMULINK.</p>
 | 
						||
<p>В папке "_\MCU_STM32xxx_Matlab\Drivers_" находяться стандартные библиотеки для STM/ARM, но переделанные под компилятор MSVC. Всего там две папки: CMSIS, STM32F4xx_HAL_Driver.</p>
 | 
						||
<h5>Папка STM32F4xx_SIMULINK</h5>
 | 
						||
<p>В этой папке содержаться файлы для эмуляции периферии STM32 в MATLAB. Структура файлов такая же, как в библиотеке HAL:</p><ul>
 | 
						||
<li>название серии МК, который эмулируется (matlab),</li>
 | 
						||
<li>идентификатор, что это для MATLAB (matlab),</li>
 | 
						||
<li>периферия, функции для эмуляции которой содержит конкретный файл (gpio, tim). Пример: "stm32f4xx_matlab_tim.c/.h"</li>
 | 
						||
</ul>
 | 
						||
<h5>Папка CMSIS</h5>
 | 
						||
<p>"Порт" библиотеки CMSIS для MSVC. Ниже приведен перечень всех файлов и краткое описание зачем они нужны:</p><ul>
 | 
						||
<li><b>arm_defines.h</b> Содержит ARM дефайны для компиляции в MSVC.</li>
 | 
						||
<li><b>core_cm4_matlab.h</b> Данный файл является копией "core_cm4.h" с некоторыми изменениями<ul>
 | 
						||
<li>удалены первые ~160 строк, которые определяют компилятор ARM.</li>
 | 
						||
<li>добавлена структура <b>имитирующая память ядра</b> *. Для того, чтобы при обращении по адресам регистров МК не было исключений при чтении по недоступному адресу.</li>
 | 
						||
</ul>
 | 
						||
</li>
 | 
						||
<li><b>stdint.h</b> Данный файл является копией "stdint.h", из библиотеки для STM32. (<em>только все дефайны uint32_t передалны как uint64_t. Т.к. в MATLAB всё компилируется в 64-битном формате, то сохранении адресов в 32-битных переменных, адреса будут усекаться и будут ошибки.</em>)</li>
 | 
						||
<li><b>stm32f407xx_matlab.h</b> Данный файл является копией "stm32f407xx.h" с некоторыми изменениями:<ul>
 | 
						||
<li>добавлен кастомный "stdint.h" (через "", вместо <>)</li>
 | 
						||
<li>добавлен "arm_defines.h" с ARM дефайнами для MSVC</li>
 | 
						||
<li>добавлен матлабовский "cmsis_armcc_matlab.h" с вместо "cmsis_armcc.h"</li>
 | 
						||
<li>добавлена структура <b>имитирующая память ядра</b> *. Для того, чтобы при обращении по адресам регистров МК не было исключений при чтении по недоступному адресу.</li>
 | 
						||
</ul>
 | 
						||
</li>
 | 
						||
<li><b>stm32f4xx.h</b> - оригинальный файл "stm32f4xx.h".</li>
 | 
						||
<li><b>system_stm32f4xx.h</b> - оригинальный файл "system_stm32f4xx.h".</li>
 | 
						||
</ul>
 | 
						||
<p><em>*память ядра не имитируется в полной мере, потому что STM32 - это 32-битный процессор, он имеет 4 Гб памяти. А MATLAB/MSVC делает ограничение на использование не больше 4Гб оперативной памяти. При этом еще есть матлабовские переменные которые тоже занимают место. Поэтому память эмулируется лишь частично. Как имено - задается в дефайнах и структуруре stm32f407xx_matlab.h.</em></p>
 | 
						||
<h5>Папка STM32F4xx_HAL_Driver</h5>
 | 
						||
<p>Данная библиотека является копией HAL, за некоторыми исключениями. В основном касаются макросов для ожидания флага. Т.к. весь МК реализован програмно, то надо самому писать код, который будет выставлять флаги по определенным условиям. Только тогда библиотека HAL будет это считывать и выполнять свои функции. Но далеко не всегда есть необходимость так делать.</p>
 | 
						||
<p>Поэтому, вместо того, чтобы пользоваться оригиальным HAL и писать эмулятор для всего 32-битного контроллера, можно переписать макросы или даже функции целиком под свои нужды.</p>
 | 
						||
<h3><a class="anchor" id="код-пользователя"></a>
 | 
						||
Код пользователя</h3>
 | 
						||
<p>Данная папка содержит исходный код приложения МК. При этом драйверы и стандартные/HAL библиотеки, которые общие для всех проектов следует помещать в <a class="el" href="#эмулятор-stm-для-matlab">папку с эмулятором МК</a>. Чтобы не редактировать исходники общих библиотек (CMSIS/HAL) в каждом проекте.</p>
 | 
						||
<h1><a class="anchor" id="инструкция"></a>
 | 
						||
Инструкция</h1>
 | 
						||
<p>Общий алгоритм портирования кода для симуляции в MATLAB приведен ниже. В инструкции есть ссылки на более подробное описание действий.</p><ol type="1">
 | 
						||
<li><a class="el" href="#портирование-кода">Портировать код для MATLAB</a> (можно начать с портирования без изменений и далее действовать от шага 2)</li>
 | 
						||
<li>Проверить <a class="el" href="#как-скомпилировать-код">компилируеться ли код</a>. А далее:<ul>
 | 
						||
<li>если есть ошибки при компиляции, <a class="el" href="#ошибки-при-компиляции">исправить их</a> и вернуться на шаг 2.</li>
 | 
						||
<li>если ошибок нет, перейти на шаг 3.</li>
 | 
						||
</ul>
 | 
						||
</li>
 | 
						||
<li>Проверить нормально ли запускается и работает симуляция с МК. А далее:<ul>
 | 
						||
<li>если симуляции вылетает, то необходимо <a class="el" href="#ошибки-при-симуляции">исправить ошибки</a> в <a class="el" href="#как-запустить-отладку">режиме отладки</a> и вернуться на шаг 3.</li>
 | 
						||
<li>если симуляция нормально запускается только один раз, и не завершается или не запускается второй раз, то необходимо <a class="el" href="#ошибки-при-симуляции">исправить ошибки</a> в <a class="el" href="#как-запустить-отладку">режиме отладки</a> и вернуться на шаг 3.</li>
 | 
						||
<li>если симуляция работает полностью корректно, перейти на шаг. 4.</li>
 | 
						||
</ul>
 | 
						||
</li>
 | 
						||
<li>Оценить результаты симуляции. А далее:<ul>
 | 
						||
<li>если симуляция сходится с реальностью - то всё работает корректно.</li>
 | 
						||
<li>если нет - необходимо исправить ошибки в драйверах и перейти на шаг 2.</li>
 | 
						||
</ul>
 | 
						||
</li>
 | 
						||
</ol>
 | 
						||
<h3><a class="anchor" id="портирование-кода"></a>
 | 
						||
Портирование кода</h3>
 | 
						||
<h5>Код программы</h5>
 | 
						||
<p>Для начала необходимо весь пользовательский код портировать в отдельную папку для удобства. Например в "_\Code_".</p>
 | 
						||
<p>Далее в "[run_bat.mex](#оболочка-мк)" надо прописать пути для заголовочных файлов (_\Includes_). Все файлы исходников "_*.c_" прописывать не обязательно. Можно прописать только папки с исходниками, как с заголовочными файлами. Далее скрипт сам сканирует и ищет все исходники.</p>
 | 
						||
<h5>Эмулятор и библиотеки</h5>
 | 
						||
<p>Эмулятор и библиотеки связаны в том плане, что необходимо выбрать через что будет реализована периферия</p><ul>
 | 
						||
<li>полноценный эмулятор, тогда функции библиотек остаются без изменений и просто работает не с реальной периферией, а с её эмулятором</li>
 | 
						||
<li>упрощенный эмулятор, тогда функции библиотек тоже надо или упростить или сделать их-dummy.</li>
 | 
						||
<li>игнорирование периферии. Если периферия не важна для симуляции, можно просто в программе МК убрать все выховы функций, связанные с ней или сделать их dummy.</li>
 | 
						||
</ul>
 | 
						||
<p>Скрипты для эмуляции периферии необходимо прописывать вручную. В случае STM32 руководствоваться следует только регистрами CMSIS, чтобы не привязываться к HAL, и была возможность симуляции кода без него. Или же пробовать делать универсальный через дефайны, которые будут определять доступ к конкретным регистрам конкретного МК.</p>
 | 
						||
<h5>Примеры эмуляции периферии</h5>
 | 
						||
<p><b>Пример 1 (полноценный эмулятор):</b> можно написать полный эмулятор для таймеров, т.к. это очень важна часть МК. Плюс она часто корректируется: разные режимы таймеров, разная частота, разные каналы. И удобно, если всё это можно менять "на ходу", а не только во время компиляциию.</p>
 | 
						||
<p><b>Пример 2 (упрощенный эмулятор):</b> В случае, если не нужна эмуляция периферии. Например для протоколов общения, типа UART/MODBUS, можно просто сделать отдельные входы в S-Function, и напрямую брать значения оттуда и записывать в переменные программы, без приёма отдельных битов, парсинга и прочего. Но тогда надо будет редактировать библиотеки и делать dummy-функции, чтобы они не ждали ответа от периферии, которая не эмулируется. Или же редактировать пользовательский код.</p>
 | 
						||
<p><b>Пример 3 (игнорирование периферии):</b> CubeMX использует функции RCC_Config, которые настраивают тактирование МК. В HAL'e в функции инициализации постоянно используются bit-banding, который реализован аппаратно. Это некоторые адресса, которые могут переключать отдельные биты через присваивание (сродни BSRR у GPIO, только для всей периферии). Плюс еще HAL дополнительно проверяет реально ли выставились эти биты в регистрах, поэтому с этим надо что-то сделать. Т.к. регистры RCC не важны для симуляции большинства программ, можно просто убрать единственный вызов этой функции в main, или сделать её dummy - в HAL-библиотеке.</p>
 | 
						||
<p>После портирования кода надо скомпилировать код МК и далее уже смотреть по <a class="el" href="#ошибки-при-компиляции">ошибкам</a>, что надо исправлять.</p>
 | 
						||
<h3><a class="anchor" id="как-скомпилировать-код"></a>
 | 
						||
Как скомпилировать код</h3>
 | 
						||
<p>Для компиляции кода необходимо открыть файл <a class="el" href="mexing_8m.html">mexing.m</a>. Это MATLAB-скрипт, который запускает скрипт "[run_bat.mex](#оболочка-мк)" для компиляции. Также этот файл задает время дискретизации для симуляции и дает возможность компиляции кода для <a class="el" href="#как-запустить-отладку">отладки</a></p>
 | 
						||
<h3><a class="anchor" id="как-запустить-отладку"></a>
 | 
						||
Как запустить отладку</h3>
 | 
						||
<p>Для отладки симуляции необходимо приписать в <a class="el" href="mexing_8m.html">mexing.m</a> в вызове "run_mex.bat" слово debug, тогда код скомпилируется для дебага. После этого необходимо открыть любой(?) редактор кода, например Visual Studio. Открыть папку проекта (там должны быть все исходники программы и эмулятора). И подключиться к MATLAB.exe.</p>
 | 
						||
<p>Теперь можно поставить точку в исходном коде эмулятора или программы МК и запустить симуляцию. Когда MATLAB дойдет до этого места, симуляция остановиться и в Visual Studio можно будет посмотреть все переменные, пройти код по строкам и в общем делать всё то, что можно делать в режиме отладки. Но отладка рабоатет только один раз. При повторном запуске симуляции остановки не произойдет. Поэтому перед каждой отладкой надо перекомпилировать код.</p>
 | 
						||
<h3><a class="anchor" id="ошибки"></a>
 | 
						||
Ошибки</h3>
 | 
						||
<h4><a class="anchor" id="ошибки-при-компиляции"></a>
 | 
						||
Ошибки при компиляции</h4>
 | 
						||
<p>Самые распространеные ошибки компилятора при портировании нового кода - это ошибки переопределения. Связаны с weak-фукнциями. В MSVC их нет как таковых. Поэтому необходимо закомментировать все weak-функции в HAL или пользовательском коде, чтобы на весь код было только одно определение функции.</p>
 | 
						||
<h4><a class="anchor" id="ошибки-при-симуляции"></a>
 | 
						||
Ошибки при симуляции</h4>
 | 
						||
<p>Обычно это исключения при чтении по недоступному адресу. Связано с разным адресным пространством МК и ПК. Поэтому надо выяснить на какой строке произошло исключение. И смотреть по какому адресу произошла попытка чтения и по какому адресу надо на самом деле считывать. И после этого скорректировать код так, чтобы адрес брался корректный.</p>
 | 
						||
<p>Из общих решений - это может быть при попытки чтения по "экзотическим" адресам (bit-banding), для которых не определено адресное пространство в симуляции. </p>
 | 
						||
</div></div><!-- PageDoc -->
 | 
						||
<a href="doxygen_crawl.html"/>
 | 
						||
</div><!-- contents -->
 | 
						||
<!-- start footer part -->
 | 
						||
<hr class="footer"/><address class="footer"><small>
 | 
						||
Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.10.0
 | 
						||
</small></address>
 | 
						||
</body>
 | 
						||
</html>
 |