<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.ss13.ru/index.php?action=history&amp;feed=atom&amp;title=Guide_to_MCU</id>
	<title>Guide to MCU - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ss13.ru/index.php?action=history&amp;feed=atom&amp;title=Guide_to_MCU"/>
	<link rel="alternate" type="text/html" href="https://wiki.ss13.ru/index.php?title=Guide_to_MCU&amp;action=history"/>
	<updated>2026-04-30T19:39:38Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.35.9</generator>
	<entry>
		<id>https://wiki.ss13.ru/index.php?title=Guide_to_MCU&amp;diff=38463&amp;oldid=prev</id>
		<title>Igorsaux в 20:08, 27 февраля 2026</title>
		<link rel="alternate" type="text/html" href="https://wiki.ss13.ru/index.php?title=Guide_to_MCU&amp;diff=38463&amp;oldid=prev"/>
		<updated>2026-02-27T20:08:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 20:08, 27 февраля 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l29&quot; &gt;Строка 29:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 29:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| Загрузка прошивки || JTAG-программатор || Загружает ELF-файл в память MCU (плата должна быть выключена)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| Загрузка прошивки || JTAG-программатор || Загружает ELF-файл в память MCU (плата должна быть выключена)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|-&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;| Диагностика || Debugger Probe || Выводит полный дамп регистров процессора (PC, x0-x31, f0-f31, CSR и др.)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| Настройка частоты || Мультитул || Позволяет задать рабочую частоту в допустимых пределах&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| Настройка частоты || Мультитул || Позволяет задать рабочую частоту в допустимых пределах&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| Переключение OC || Отвёртка || Включает/выключает режим разгона&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| Переключение OC || Отвёртка || Включает/выключает режим разгона&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|-&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;| Ремонт радиационных повреждений || Нанопаста || Восстанавливает повреждённую полупроводниковую структуру, снижая накопленный TID&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| Блокировка прошивки || Сварочный аппарат || '''НЕОБРАТИМО''' прожигает OTP-предохранитель, запрещая перепрограммирование&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| Блокировка прошивки || Сварочный аппарат || '''НЕОБРАТИМО''' прожигает OTP-предохранитель, запрещая перепрограммирование&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l123&quot; &gt;Строка 123:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 127:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Радиомодуль для отправки и приёма сигналов. Позволяет удалённо активировать другие устройства или получать команды.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Радиомодуль для отправки и приёма сигналов. Позволяет удалённо активировать другие устройства или получать команды.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;== Инструменты ==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;=== JTAG-программатор ===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Используется для загрузки ELF-файлов в память MCU. Плата должна быть выключена для программирования.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;=== Debugger Probe ===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Компактный аппаратный отладчик для диагностики микроконтроллеров. Позволяет читать состояние регистров работающего MCU:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* '''Статус''' — Program Counter (PC), счётчик циклов, счётчик инструкций, уровень привилегий&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* '''Общие регистры''' — x0-x31 (целочисленные регистры RISC-V)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* '''Регистры с плавающей точкой''' — f0-f31&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* '''FCSR''' — регистр состояния FPU (режим округления, флаги исключений)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* '''Таймеры''' — mtime, mtimecmp&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* '''CSR регистры''' — mscratch, mepc, mtval, mcause, mtvec&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* '''Прерывания''' — состояние MIE и MIP (software, timer, external)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* '''Идентификация''' — mvendorid, marchid, mimpid, mhartid&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Незаменим для низкоуровневой отладки и диагностики проблем с прошивкой.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Термальная система ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Термальная система ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l207&quot; &gt;Строка 207:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 232:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| Aegis-H1 || 90% || 1000&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| Aegis-H1 || 90% || 1000&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;=== Ремонт радиационных повреждений ===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Накопленный TID можно снизить с помощью '''нанопасты'''. Каждое применение восстанавливает часть повреждённой полупроводниковой структуры, &amp;quot;залечивая&amp;quot; радиационно-индуцированные дефекты в оксидных слоях.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* При отсутствии повреждений — нанопаста не требуется&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* При серьёзных повреждениях — может потребоваться несколько применений&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* При полном восстановлении — устройство возвращается к нормальной работе&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;''Нанопаста не поможет, если MCU уже вышел из строя (TID достиг 100% лимита).''&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== EMP ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== EMP ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l257&quot; &gt;Строка 257:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 292:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Для работы у суперматерии используйте '''только''' Aegis-H1&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Для работы у суперматерии используйте '''только''' Aegis-H1&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Serial Terminal незаменим для отладки&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Serial Terminal незаменим для отладки&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Debugger Probe поможет диагностировать проблемы на уровне регистров&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* В вакууме MCU перегревается почти мгновенно — обеспечьте атмосферу&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* В вакууме MCU перегревается почти мгновенно — обеспечьте атмосферу&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Линейка Flex идеальна для устройств с переменной нагрузкой&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Линейка Flex идеальна для устройств с переменной нагрузкой&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* Держите нанопасту под рукой при работе в зонах с повышенной радиацией&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Разработка прошивок ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Разработка прошивок ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l434&quot; &gt;Строка 434:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 471:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     pub inline fn send(this: *volatile Signaler) void;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     pub inline fn send(this: *volatile Signaler) void;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      &lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     // Проверка готовности (есть cooldown между отправками)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     // Проверка готовности (есть cooldown между отправками &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;и установкой частоты с кодом&lt;/ins&gt;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     pub inline fn ready(this: *volatile Signaler) bool;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     pub inline fn ready(this: *volatile Signaler) bool;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      &lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;      &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Igorsaux</name></author>
	</entry>
	<entry>
		<id>https://wiki.ss13.ru/index.php?title=Guide_to_MCU&amp;diff=38462&amp;oldid=prev</id>
		<title>Igorsaux: Новая страница: «'''MCU''' (Microcontroller Unit) — программируемые микроконтроллеры, позволяющие игрокам создавать а...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.ss13.ru/index.php?title=Guide_to_MCU&amp;diff=38462&amp;oldid=prev"/>
		<updated>2026-02-27T15:02:41Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «&amp;#039;&amp;#039;&amp;#039;MCU&amp;#039;&amp;#039;&amp;#039; (Microcontroller Unit) — программируемые микроконтроллеры, позволяющие игрокам создавать а...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;'''MCU''' (Microcontroller Unit) — программируемые микроконтроллеры, позволяющие игрокам создавать автоматизированные устройства с произвольной логикой. MCU используют полноценный интерпретатор 32-битного процессора '''RISC-V''' с расширениями &amp;lt;code&amp;gt;IMFZicsrZicntrZbbZba&amp;lt;/code&amp;gt; и уровнями привилегий M+U.&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
MCU представляют собой компактные вычислительные платы, которые можно программировать с помощью загрузки ELF-файлов через JTAG-программатор. К MCU подключаются различные модули расширения через PCI-слоты, позволяя взаимодействовать с окружающим миром: синтезировать речь, отправлять радиосигналы, выводить отладочную информацию и многое другое.&lt;br /&gt;
&lt;br /&gt;
=== Ключевые особенности ===&lt;br /&gt;
&lt;br /&gt;
* '''Реальная архитектура RISC-V''' — код компилируется стандартными тулчейнами (GCC, Clang)&lt;br /&gt;
* '''Модульная система''' — расширение функциональности через PCI-модули&lt;br /&gt;
* '''Реалистичная термодинамика''' — перегрев, троттлинг, аварийное отключение&lt;br /&gt;
* '''Разгон''' — возможность превысить штатные частоты с риском нестабильности&lt;br /&gt;
* '''Радиационная устойчивость''' — различные уровни защиты для работы вблизи суперматерии&lt;br /&gt;
&lt;br /&gt;
== Базовое использование ==&lt;br /&gt;
&lt;br /&gt;
=== Начало работы ===&lt;br /&gt;
&lt;br /&gt;
# '''Получите MCU''' — изготовьте на принтере схем или найдите готовую плату&lt;br /&gt;
# '''Установите батарею''' — используйте любую совместимую ячейку питания&lt;br /&gt;
# '''Подключите модули''' — вставьте нужные PCI-модули в плату&lt;br /&gt;
# '''Загрузите прошивку''' — используйте JTAG-программатор для загрузки ELF-файла&lt;br /&gt;
# '''Включите плату''' — используйте команду &amp;quot;Turn On&amp;quot; в контекстном меню&lt;br /&gt;
&lt;br /&gt;
=== Управление ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Действие !! Инструмент !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| Загрузка прошивки || JTAG-программатор || Загружает ELF-файл в память MCU (плата должна быть выключена)&lt;br /&gt;
|-&lt;br /&gt;
| Настройка частоты || Мультитул || Позволяет задать рабочую частоту в допустимых пределах&lt;br /&gt;
|-&lt;br /&gt;
| Переключение OC || Отвёртка || Включает/выключает режим разгона&lt;br /&gt;
|-&lt;br /&gt;
| Блокировка прошивки || Сварочный аппарат || '''НЕОБРАТИМО''' прожигает OTP-предохранитель, запрещая перепрограммирование&lt;br /&gt;
|-&lt;br /&gt;
| Установка батареи || Батарея (в руке) || Вставляет источник питания&lt;br /&gt;
|-&lt;br /&gt;
| Установка модуля || PCI-модуль (в руке) || Подключает модуль расширения&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Контекстное меню ===&lt;br /&gt;
&lt;br /&gt;
* '''Turn On''' — включить плату&lt;br /&gt;
* '''Turn Off''' — выключить плату&lt;br /&gt;
* '''Eject Battery''' — извлечь батарею&lt;br /&gt;
* '''Eject Module''' — извлечь выбранный PCI-модуль&lt;br /&gt;
&lt;br /&gt;
== Модели MCU ==&lt;br /&gt;
&lt;br /&gt;
=== Стандартная линейка (Nanotrasen Cybernetics) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Модель !! RAM !! Частота !! PCI !! Особенности&lt;br /&gt;
|-&lt;br /&gt;
| '''NCR-1000''' || 64 KB || 0.25–2 МГц || 4 || Базовая модель для повседневных задач&lt;br /&gt;
|-&lt;br /&gt;
| '''NCR-2000''' || 256 KB || 0.5–4 МГц || 8 || Удвоенная память, популярна в промышленности&lt;br /&gt;
|-&lt;br /&gt;
| '''NCR-4000 Pro''' || 1 MB || 1–8 МГц || 16 || Профессиональный уровень, лёгкая защита от радиации&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Энергоэффективная линейка (Whisper) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Модель !! RAM !! Частота !! PCI !! Особенности&lt;br /&gt;
|-&lt;br /&gt;
| '''Whisper-LP8''' || 32 KB || 0.125–1 МГц || 2 || Ультранизкое потребление, идеален для датчиков&lt;br /&gt;
|-&lt;br /&gt;
| '''Whisper-LP16''' || 64 KB || 0.1–1.5 МГц || 4 || Расширенная автономность&lt;br /&gt;
|-&lt;br /&gt;
| '''Whisper-LP32i''' || 128 KB || 0.25–2 МГц || 6 || Промышленный класс, повышенная радиационная защита&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Оверклокерская линейка (Cybersun Fury) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Модель !! RAM !! Частота !! OC предел !! PCI !! Особенности&lt;br /&gt;
|-&lt;br /&gt;
| '''Fury-S1 Starter''' || 64 KB || 0.75–3 МГц || 4.5 МГц || 4 || Начальный уровень, защита RAM при OC&lt;br /&gt;
|-&lt;br /&gt;
| '''Fury-X1''' || 256 KB || 1–4 МГц || 6 МГц || 8 || Разблокированные множители&lt;br /&gt;
|-&lt;br /&gt;
| '''Fury-X2 Extreme''' || 1 MB || 2–8 МГц || 12 МГц || 16 || Флагман линейки, требует серьёзного охлаждения&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''Линейка Fury поставляется с включённым режимом разгона и защитой RAM. Превышение штатных частот значительно увеличивает тепловыделение и может привести к нестабильности!''&lt;br /&gt;
&lt;br /&gt;
=== Гибкая линейка (Flex) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Модель !! RAM !! Частота !! PCI !! Особенности&lt;br /&gt;
|-&lt;br /&gt;
| '''Flex-V1''' || 64 KB || 0.1–4 МГц || 6 || Широкий диапазон частот&lt;br /&gt;
|-&lt;br /&gt;
| '''Flex-V2 Pro''' || 256 KB || 0.125–6 МГц || 12 || Адаптивные системы&lt;br /&gt;
|-&lt;br /&gt;
| '''Flex-V3 Max''' || 768 KB || 0.0625–8 МГц || 18 || Максимальная гибкость, защита от EMP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Специализированные модели ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Модель !! RAM !! Частота !! PCI !! Особенности&lt;br /&gt;
|-&lt;br /&gt;
| '''Aegis-H1''' || 128 KB || 0.5–2 МГц || 4 || 90% защита от радиации, работает у суперматерии&lt;br /&gt;
|-&lt;br /&gt;
| '''RetroTech Z80-NT''' || 32 KB || 0.25–0.75 МГц || 2 || Ностальгия для энтузиастов, минимальное потребление&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PCI-модули ==&lt;br /&gt;
&lt;br /&gt;
=== Text-to-Speech Module ===&lt;br /&gt;
&lt;br /&gt;
Синтезирует речь из текста. MCU может &amp;quot;говорить&amp;quot; в игровой чат.&lt;br /&gt;
&lt;br /&gt;
=== Serial Terminal Module ===&lt;br /&gt;
&lt;br /&gt;
Терминал для отладки и взаимодействия с MCU. Открывается при использовании модуля в руке (при подключении к MCU). Позволяет просматривать вывод программы и отправлять данные.&lt;br /&gt;
&lt;br /&gt;
=== Signaler Module ===&lt;br /&gt;
&lt;br /&gt;
Радиомодуль для отправки и приёма сигналов. Позволяет удалённо активировать другие устройства или получать команды.&lt;br /&gt;
&lt;br /&gt;
== Термальная система ==&lt;br /&gt;
&lt;br /&gt;
MCU генерируют тепло при работе. Система охлаждения учитывает:&lt;br /&gt;
&lt;br /&gt;
* '''Частоту работы''' — выше частота = больше тепла&lt;br /&gt;
* '''Загрузку процессора''' — активные вычисления греют сильнее&lt;br /&gt;
* '''Окружающую среду''' — в вакууме охлаждение практически отсутствует&lt;br /&gt;
* '''Разгон''' — потребление растёт квадратично относительно превышения частоты&lt;br /&gt;
&lt;br /&gt;
=== Температурные пороги ===&lt;br /&gt;
&lt;br /&gt;
Каждая модель имеет свои пороги (указаны типичные значения):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Порог !! Температура !! Эффект&lt;br /&gt;
|-&lt;br /&gt;
| Троттлинг || ~65°C || Частота снижается вдвое&lt;br /&gt;
|-&lt;br /&gt;
| Аварийное отключение || ~90°C || MCU выключается&lt;br /&gt;
|-&lt;br /&gt;
| Повреждение || ~95°C || Начинается повреждение памяти&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''При включённом режиме разгона (OC) аварийное отключение при перегреве '''отключено''' — плата продолжит работать до физического повреждения!''&lt;br /&gt;
&lt;br /&gt;
=== Индикация состояния ===&lt;br /&gt;
&lt;br /&gt;
При осмотре MCU:&lt;br /&gt;
* '''Зелёный LED''' — нормальная работа&lt;br /&gt;
* '''Оранжевый мигающий LED''' — троттлинг активен&lt;br /&gt;
* '''Красный мигающий LED''' — требуется охлаждение перед запуском&lt;br /&gt;
* '''LED выключен''' — плата не работает&lt;br /&gt;
&lt;br /&gt;
== Разгон (Overclocking) ==&lt;br /&gt;
&lt;br /&gt;
Для разгона:&lt;br /&gt;
&lt;br /&gt;
# Переключите OC-джампер отвёрткой&lt;br /&gt;
# Установите частоту выше штатного максимума (до 150% от max)&lt;br /&gt;
&lt;br /&gt;
=== Риски разгона ===&lt;br /&gt;
&lt;br /&gt;
* '''Повышенное энергопотребление''' — батарея разряжается быстрее&lt;br /&gt;
* '''Увеличенное тепловыделение''' — требуется внешнее охлаждение&lt;br /&gt;
* '''Нестабильность памяти''' — случайное повреждение данных в RAM&lt;br /&gt;
* '''Отсутствие защиты от перегрева''' — плата не выключится автоматически&lt;br /&gt;
&lt;br /&gt;
''Модели без флага &amp;lt;code&amp;gt;oc_ram_protection&amp;lt;/code&amp;gt; будут испытывать случайные ошибки памяти при разгоне!''&lt;br /&gt;
&lt;br /&gt;
== Радиация ==&lt;br /&gt;
&lt;br /&gt;
MCU подвержены воздействию ионизирующего излучения:&lt;br /&gt;
&lt;br /&gt;
=== Мгновенные эффекты (при работе) ===&lt;br /&gt;
&lt;br /&gt;
* '''SEU''' (Single Event Upset) — случайное изменение битов в памяти&lt;br /&gt;
* '''SEL''' (Single Event Latchup) — короткое замыкание с аварийным отключением и искрами&lt;br /&gt;
&lt;br /&gt;
=== Накопительный эффект (TID) ===&lt;br /&gt;
&lt;br /&gt;
Total Ionizing Dose накапливается даже при выключенной плате:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Уровень TID !! Эффект&lt;br /&gt;
|-&lt;br /&gt;
| 50% лимита || Лёгкое обесцвечивание, ×1.5 к вероятности ошибок&lt;br /&gt;
|-&lt;br /&gt;
| 75% лимита || Заметное обесцвечивание, ×2 к вероятности ошибок&lt;br /&gt;
|-&lt;br /&gt;
| 100% лимита || '''Необратимый выход из строя'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Защита от радиации ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Модель !! Защита !! TID лимит&lt;br /&gt;
|-&lt;br /&gt;
| Стандартные || 0–5% || 100&lt;br /&gt;
|-&lt;br /&gt;
| Whisper-LP32i || 50% || 250&lt;br /&gt;
|-&lt;br /&gt;
| Aegis-H1 || 90% || 1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== EMP ==&lt;br /&gt;
&lt;br /&gt;
Электромагнитные импульсы повреждают MCU в зависимости от силы импульса и уровня защиты (&amp;lt;code&amp;gt;emp_hardening&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Модель !! Защита EMP&lt;br /&gt;
|-&lt;br /&gt;
| Базовые модели || 0 (уязвимы)&lt;br /&gt;
|-&lt;br /&gt;
| NCR-4000 Pro, Whisper-LP || 1&lt;br /&gt;
|-&lt;br /&gt;
| Whisper-LP32i || 2&lt;br /&gt;
|-&lt;br /&gt;
| Aegis-H1 || 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
При превышении защиты — '''необратимый выход из строя'''.&lt;br /&gt;
&lt;br /&gt;
== Физические повреждения ==&lt;br /&gt;
&lt;br /&gt;
MCU разрушаются от:&lt;br /&gt;
* Попадания снарядов&lt;br /&gt;
* Взрывов&lt;br /&gt;
* Падения/ударов&lt;br /&gt;
* Расплавления (экстремальные температуры)&lt;br /&gt;
&lt;br /&gt;
При разрушении батарея и модули могут уцелеть (50% шанс) и разлететься в стороны.&lt;br /&gt;
&lt;br /&gt;
== Защита прошивки ==&lt;br /&gt;
&lt;br /&gt;
OTP (One-Time Programmable) предохранитель можно прожечь сварочным аппаратом:&lt;br /&gt;
&lt;br /&gt;
''Это действие '''НЕОБРАТИМО'''! После прожига MCU невозможно перепрограммировать.''&lt;br /&gt;
&lt;br /&gt;
Используется для:&lt;br /&gt;
* Защиты критических систем от саботажа&lt;br /&gt;
* Предотвращения несанкционированных модификаций&lt;br /&gt;
* Создания &amp;quot;запечатанных&amp;quot; устройств&lt;br /&gt;
&lt;br /&gt;
== Изготовление ==&lt;br /&gt;
&lt;br /&gt;
Все MCU и модули изготавливаются на '''принтере схем''' (Imprinter) и '''протолате'''. Требуемые технологии и материалы зависят от сложности устройства.&lt;br /&gt;
&lt;br /&gt;
== Советы ==&lt;br /&gt;
&lt;br /&gt;
* Начинайте с NCR-1000 или Whisper-LP8 для изучения системы&lt;br /&gt;
* Всегда тестируйте прошивку перед прожигом OTP&lt;br /&gt;
* Для работы у суперматерии используйте '''только''' Aegis-H1&lt;br /&gt;
* Serial Terminal незаменим для отладки&lt;br /&gt;
* В вакууме MCU перегревается почти мгновенно — обеспечьте атмосферу&lt;br /&gt;
* Линейка Flex идеальна для устройств с переменной нагрузкой&lt;br /&gt;
&lt;br /&gt;
== Разработка прошивок ==&lt;br /&gt;
&lt;br /&gt;
Эта секция предназначена для разработчиков, желающих создавать собственные прошивки для MCU.&lt;br /&gt;
&lt;br /&gt;
=== Архитектура ===&lt;br /&gt;
&lt;br /&gt;
MCU используют 32-битный процессор '''RISC-V''' со следующими расширениями:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Расширение !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| '''I''' || Базовый целочисленный набор инструкций&lt;br /&gt;
|-&lt;br /&gt;
| '''M''' || Умножение и деление&lt;br /&gt;
|-&lt;br /&gt;
| '''F''' || Операции с плавающей точкой одинарной точности&lt;br /&gt;
|-&lt;br /&gt;
| '''Zicsr''' || Инструкции для работы с CSR (Control and Status Registers)&lt;br /&gt;
|-&lt;br /&gt;
| '''Zicntr''' || Базовые счётчики производительности&lt;br /&gt;
|-&lt;br /&gt;
| '''Zbb''' || Базовые битовые манипуляции&lt;br /&gt;
|-&lt;br /&gt;
| '''Zba''' || Адресные битовые манипуляции&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Уровни привилегий: '''M''' (Machine) + '''U''' (User).&lt;br /&gt;
&lt;br /&gt;
=== SDK ===&lt;br /&gt;
&lt;br /&gt;
Официальный SDK написан на языке '''Zig''' и доступен на GitHub:&lt;br /&gt;
&lt;br /&gt;
https://github.com/igorsaux/mcu-sdk&lt;br /&gt;
&lt;br /&gt;
SDK содержит:&lt;br /&gt;
* Определения всех memory-mapped регистров&lt;br /&gt;
* Драйверы для всех PCI-устройств&lt;br /&gt;
* Утилиты для работы с таймерами, DMA, PRNG&lt;br /&gt;
* '''Примеры использования всех модулей'''&lt;br /&gt;
&lt;br /&gt;
=== Карта памяти ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Адрес !! Размер !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0000_1000&amp;lt;/code&amp;gt; || 16 байт || Boot Info (частота CPU, размер RAM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0000_2000&amp;lt;/code&amp;gt; || 8 байт || Сенсоры (температура, энергопотребление, флаги)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0200_0000&amp;lt;/code&amp;gt; || — || CLINT (таймер, прерывания)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0C00_2000&amp;lt;/code&amp;gt; || 1 байт || PRNG (аппаратный генератор случайных чисел)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x1000_0000&amp;lt;/code&amp;gt; || — || UART&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x1000_1000&amp;lt;/code&amp;gt; || — || DMA контроллер&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x1000_2000&amp;lt;/code&amp;gt; || — || PCI контроллер&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x2000_0000&amp;lt;/code&amp;gt; || — || Адресное пространство PCI-устройств&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x8000_0000&amp;lt;/code&amp;gt; || varies || RAM (начало)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Структуры данных ===&lt;br /&gt;
&lt;br /&gt;
==== Boot Info ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub const BootInfo = extern struct {&lt;br /&gt;
    cpu_frequency: u64,  // Частота CPU в Hz&lt;br /&gt;
    ram_size: u32,       // Размер RAM в байтах&lt;br /&gt;
    free_ram_start: u32, // Начало свободной RAM&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sensors ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub const Sensors = extern struct {&lt;br /&gt;
    pub const Flags = packed struct(u8) {&lt;br /&gt;
        overheat: bool = false,   // Температура &amp;gt;= shutdown_temp&lt;br /&gt;
        throttled: bool = false,  // Частота снижена&lt;br /&gt;
        _pad: u6 = 0,&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    temperature: i16 = 0,   // Температура в °C&lt;br /&gt;
    power_usage: u16 = 0,   // Потребление в mWh/мин&lt;br /&gt;
    flags: Flags = .{},&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PCI-устройства ===&lt;br /&gt;
&lt;br /&gt;
==== Обнаружение устройств ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub const Pci = extern struct {&lt;br /&gt;
    pub const MAX_DEVICES: usize = 18;&lt;br /&gt;
&lt;br /&gt;
    pub const DeviceType = enum(u8) {&lt;br /&gt;
        none = 0,&lt;br /&gt;
        tts = 1,&lt;br /&gt;
        serial_terminal = 2,&lt;br /&gt;
        signaler = 3,&lt;br /&gt;
        _,&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    pub const Entry = extern struct {&lt;br /&gt;
        address: u32 = 0,      // MMIO адрес устройства&lt;br /&gt;
        len: u32 = 0,          // Размер адресного пространства&lt;br /&gt;
        ty: DeviceType = .none,&lt;br /&gt;
    };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для поиска устройства по типу:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inline fn findDevice(comptime T: type, comptime pci_type: sdk.Pci.DeviceType) ?T {&lt;br /&gt;
    for (&amp;amp;sdk.pci.status().entries, 0..) |entry, slot| {&lt;br /&gt;
        if (entry.ty == pci_type) {&lt;br /&gt;
            return .{ .entry = entry, .slot = @intCast(slot) };&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Text-to-Speech (TTS) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub const Tts = extern struct {&lt;br /&gt;
    pub const BUFFER_SIZE: usize = 128;&lt;br /&gt;
    &lt;br /&gt;
    // Проверка готовности&lt;br /&gt;
    pub inline fn isReady(this: *volatile Tts) bool;&lt;br /&gt;
    &lt;br /&gt;
    // Произнести текст (предварительно записанный через DMA)&lt;br /&gt;
    pub inline fn say(this: *volatile Tts) void;&lt;br /&gt;
    &lt;br /&gt;
    // Подтвердить обработку события&lt;br /&gt;
    pub inline fn ack(this: *volatile Tts) void;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Serial Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub const SerialTerminal = extern struct {&lt;br /&gt;
    pub const INPUT_BUFFER_SIZE: usize = 1024;&lt;br /&gt;
    pub const OUTPUT_BUFFER_SIZE: usize = 1024;&lt;br /&gt;
&lt;br /&gt;
    // Количество байт во входном буфере&lt;br /&gt;
    pub inline fn len(this: *volatile SerialTerminal) u16;&lt;br /&gt;
    &lt;br /&gt;
    // Отправить выходной буфер&lt;br /&gt;
    pub inline fn flush(this: *volatile SerialTerminal) void;&lt;br /&gt;
    &lt;br /&gt;
    // Включить прерывание при получении данных&lt;br /&gt;
    // this.interrupts().on_new_data = true;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Signaler ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub const Signaler = extern struct {&lt;br /&gt;
    // Установить частоту и код&lt;br /&gt;
    pub inline fn set(this: *volatile Signaler, frequency: u16, code: u8) void;&lt;br /&gt;
    &lt;br /&gt;
    // Отправить сигнал&lt;br /&gt;
    pub inline fn send(this: *volatile Signaler) void;&lt;br /&gt;
    &lt;br /&gt;
    // Проверка готовности (есть cooldown между отправками)&lt;br /&gt;
    pub inline fn ready(this: *volatile Signaler) bool;&lt;br /&gt;
    &lt;br /&gt;
    // Включить прерывания&lt;br /&gt;
    // this.interrupts().on_pulse = true;  // При получении сигнала&lt;br /&gt;
    // this.interrupts().on_ready = true;  // Когда готов к отправке&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DMA ===&lt;br /&gt;
&lt;br /&gt;
DMA позволяет эффективно передавать данные между RAM и устройствами:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Чтение из устройства в RAM&lt;br /&gt;
sdk.dma.read(channel, device_address, destination_slice);&lt;br /&gt;
&lt;br /&gt;
// Запись из RAM в устройство&lt;br /&gt;
sdk.dma.write(channel, device_address, source_slice);&lt;br /&gt;
&lt;br /&gt;
// Заполнение паттерном&lt;br /&gt;
sdk.dma.fill(channel, device_address, pattern_slice, total_length);&lt;br /&gt;
&lt;br /&gt;
// Заполнение одним байтом (memset)&lt;br /&gt;
sdk.dma.memset(channel, device_address, byte_value, length);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CLINT (таймер) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Прочитать текущее время в тиках&lt;br /&gt;
const ticks = sdk.clint.readMtime();&lt;br /&gt;
&lt;br /&gt;
// Прочитать текущее время в наносекундах&lt;br /&gt;
const ns = sdk.clint.readMtimeNs();&lt;br /&gt;
&lt;br /&gt;
// Установить прерывание через N тиков&lt;br /&gt;
sdk.clint.interruptAfter(ticks);&lt;br /&gt;
&lt;br /&gt;
// Установить прерывание через N наносекунд&lt;br /&gt;
sdk.clint.interruptAfterNs(nanoseconds);&lt;br /&gt;
&lt;br /&gt;
// Ожидание прерывания (энергосбережение)&lt;br /&gt;
sdk.arch.wfi();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PRNG ===&lt;br /&gt;
&lt;br /&gt;
Аппаратный генератор случайных чисел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Получить один случайный байт&lt;br /&gt;
const byte = sdk.prng.status().value;&lt;br /&gt;
&lt;br /&gt;
// Использовать как std.Random интерфейс&lt;br /&gt;
const random = sdk.prng.interface();&lt;br /&gt;
const value = random.int(u32);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример: Sub-GHz передатчик ===&lt;br /&gt;
&lt;br /&gt;
Разберём пример прошивки, реализующей интерактивный терминал для управления Signaler-модулем.&lt;br /&gt;
&lt;br /&gt;
==== Структура программы ====&lt;br /&gt;
&lt;br /&gt;
'''1. Обёртки для PCI-устройств'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const SerialTerminal = struct {&lt;br /&gt;
    entry: sdk.Pci.Entry,&lt;br /&gt;
    slot: u8 = 0,&lt;br /&gt;
&lt;br /&gt;
    pub inline fn mmio(this: SerialTerminal) *volatile sdk.SerialTerminal {&lt;br /&gt;
        return @ptrFromInt(this.entry.address);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const Signaler = struct {&lt;br /&gt;
    entry: sdk.Pci.Entry,&lt;br /&gt;
    slot: u8 = 0,&lt;br /&gt;
&lt;br /&gt;
    pub inline fn mmio(this: Signaler) *volatile sdk.Signaler {&lt;br /&gt;
        return @ptrFromInt(this.entry.address);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждое устройство хранит свой PCI Entry и номер слота. Метод &amp;lt;code&amp;gt;mmio()&amp;lt;/code&amp;gt; возвращает указатель на memory-mapped регистры устройства.&lt;br /&gt;
&lt;br /&gt;
'''2. Инициализация'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub fn main() void {&lt;br /&gt;
    // Поиск необходимых устройств&lt;br /&gt;
    const terminal = findDevice(SerialTerminal, .serial_terminal) orelse return;&lt;br /&gt;
    const signaler = findDevice(Signaler, .signaler) orelse return;&lt;br /&gt;
&lt;br /&gt;
    var shell = Shell.init(terminal, signaler);&lt;br /&gt;
    shell.run();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если устройства не найдены — программа завершается.&lt;br /&gt;
&lt;br /&gt;
'''3. Главный цикл'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pub fn run(this: *Shell) void {&lt;br /&gt;
    // Включаем внешние прерывания&lt;br /&gt;
    sdk.arch.Mie.setMeie();&lt;br /&gt;
    &lt;br /&gt;
    // Подписываемся на события&lt;br /&gt;
    this.terminal.mmio().interrupts().on_new_data = true;&lt;br /&gt;
    this.signaler.mmio().interrupts().on_pulse = true;&lt;br /&gt;
&lt;br /&gt;
    this.printBanner();&lt;br /&gt;
&lt;br /&gt;
    while (true) {&lt;br /&gt;
        // Проверяем события терминала&lt;br /&gt;
        if (this.terminal.mmio().lastEvent()) |event| {&lt;br /&gt;
            this.terminal.mmio().ack();&lt;br /&gt;
            if (event.ty == .new_data) {&lt;br /&gt;
                this.handleInput();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Проверяем события сигналера&lt;br /&gt;
        if (this.signaler.mmio().lastEvent()) |event| {&lt;br /&gt;
            this.signaler.mmio().ack();&lt;br /&gt;
            if (event.ty == .pulse) {&lt;br /&gt;
                // Получен входящий сигнал!&lt;br /&gt;
                this.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
                this.printBox(&amp;quot;SIGNAL RECEIVED&amp;quot;, C.bgreen);&lt;br /&gt;
                this.printPrompt();&lt;br /&gt;
                this.flush();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Ждём следующего прерывания (экономия энергии)&lt;br /&gt;
        sdk.arch.wfi();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Вызов &amp;lt;code&amp;gt;wfi()&amp;lt;/code&amp;gt; (Wait For Interrupt) переводит CPU в режим ожидания, значительно снижая энергопотребление.''&lt;br /&gt;
&lt;br /&gt;
'''4. Обработка ввода'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fn handleInput(this: *Shell) void {&lt;br /&gt;
    const bytes = this.terminal.mmio().len();&lt;br /&gt;
    var input_buffer: [sdk.SerialTerminal.INPUT_BUFFER_SIZE]u8 = undefined;&lt;br /&gt;
    &lt;br /&gt;
    // Читаем данные через DMA&lt;br /&gt;
    sdk.dma.read(this.terminal.slot, 0, input_buffer[0..bytes]);&lt;br /&gt;
&lt;br /&gt;
    var input = input_buffer[0..bytes];&lt;br /&gt;
    &lt;br /&gt;
    // Убираем trailing newlines&lt;br /&gt;
    while (input.len &amp;gt; 0 and (input[input.len - 1] == '\n' or input[input.len - 1] == '\r')) {&lt;br /&gt;
        input = input[0 .. input.len - 1];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    this.executeCommand(input);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5. Отправка сигнала'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fn cmdSend(this: *Shell) void {&lt;br /&gt;
    if (this.cur_freq == 0) {&lt;br /&gt;
        this.print(&amp;quot;No frequency configured\n&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Проверяем cooldown&lt;br /&gt;
    if (!this.signaler.mmio().ready()) {&lt;br /&gt;
        this.print(&amp;quot;Cooldown, wait...\n&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Устанавливаем параметры и отправляем&lt;br /&gt;
    this.signaler.mmio().set(this.cur_freq, this.cur_code);&lt;br /&gt;
    this.signaler.mmio().send();&lt;br /&gt;
    this.send_count += 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''6. Entry Point'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
comptime {&lt;br /&gt;
    _ = sdk.utils.EntryPoint(.{&lt;br /&gt;
        .stack_size = std.math.pow(u32, 2, 14), // 16 KB стека&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Макрос &amp;lt;code&amp;gt;EntryPoint&amp;lt;/code&amp;gt; генерирует стартовый код, настраивает стек и вызывает &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== ANSI-цвета в терминале ====&lt;br /&gt;
&lt;br /&gt;
Serial Terminal поддерживает ANSI escape-последовательности:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const C = struct {&lt;br /&gt;
    const reset = &amp;quot;\x1b[0m&amp;quot;;&lt;br /&gt;
    const bold = &amp;quot;\x1b[1m&amp;quot;;&lt;br /&gt;
    const dim = &amp;quot;\x1b[2m&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    const orange = &amp;quot;\x1b[38;5;208m&amp;quot;;&lt;br /&gt;
    const green = &amp;quot;\x1b[32m&amp;quot;;&lt;br /&gt;
    const red = &amp;quot;\x1b[31m&amp;quot;;&lt;br /&gt;
    // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Компиляция ===&lt;br /&gt;
&lt;br /&gt;
# Установите [https://ziglang.org/download/ Zig] (версия 0.15.2)&lt;br /&gt;
# Клонируйте SDK: &amp;lt;code&amp;gt;git clone https://github.com/igorsaux/mcu-sdk&amp;lt;/code&amp;gt;&lt;br /&gt;
# Соберите пример: &amp;lt;code&amp;gt;zig build&amp;lt;/code&amp;gt;&lt;br /&gt;
# Загрузите &amp;lt;code&amp;gt;zig-out/bin/firmware.elf&amp;lt;/code&amp;gt; через JTAG-программатор&lt;br /&gt;
&lt;br /&gt;
=== Отладка ===&lt;br /&gt;
&lt;br /&gt;
* Используйте '''Serial Terminal''' для вывода отладочной информации&lt;br /&gt;
* Проверяйте '''Sensors''' для мониторинга температуры и потребления&lt;br /&gt;
* Используйте &amp;lt;code&amp;gt;sdk.boot_info&amp;lt;/code&amp;gt; для получения информации о системе&lt;br /&gt;
&lt;br /&gt;
=== Ограничения ===&lt;br /&gt;
&lt;br /&gt;
* Максимальный размер ELF-файла ограничен конфигурацией сервера&lt;br /&gt;
* Доступ к памяти вне разрешённых регионов вызывает trap&lt;br /&gt;
* Некоторые syscall'ы имеют cooldown (TTS, Signaler)&lt;br /&gt;
* RAM не сохраняется между перезагрузками&lt;br /&gt;
&lt;br /&gt;
{{GuideMenu}}&lt;/div&gt;</summary>
		<author><name>Igorsaux</name></author>
	</entry>
</feed>