Отчёт по обратному анализу прошивки газоанализатора
Дата: 13 сентября 2026
Объект: сохранённый образ прошивки fw_128k.bin для FM33LG025
Статус: обратный анализ основных алгоритмов и сценариев завершён; данные конкретного прибора ещё не считаны.
Главное
Мы восстановили, как старая прошивка обрабатывает измерения, калибровку, температурную коррекцию, тревоги, журнал, запуск и сервисное меню. Результаты нужны как источник требований и проверочных сценариев для новой прошивки, а не как образец для прямого копирования: в старом коде найдены решения, которые для нового прибора следует улучшить.
Проверено 235 целевых сценариев на исходных ARM-инструкциях в изолированной программной модели: 102 сценария измерительного тракта, 108 сценариев тревог и журнала, 20 сценариев интерфейса и запуска, 5 сценариев питания. Все сценарии выполнились успешно. Это подтверждает поведение исследованных фрагментов, но не является проверкой физического прибора, его времени реакции или метрологических характеристик.
Что восстановлено
Измерительный тракт
- Старая прошивка использует шесть каналов ADC; для газовых каналов подтверждены аппаратное усреднение, обработка серии из десяти отсчётов с исключением минимума и максимума, скользящее среднее и рекурсивное сглаживание.
- После фильтрации выполняются пересчёт по калибровке, температурная обработка, отдельные преобразования нуля/диапазона и только затем проверка тревог.
- Для калибровки восстановлены возрастающие, убывающие, кусочно-линейные и нелинейные ветви; поддерживается до четырёх опорных точек.
- Температура измеряется отдельным аналоговым входом. Для H₂S и CO её обработка имеет собственные ветви, а не сводится к одной общей формуле.
- При номинальной программной конфигурации старого устройства основной цикл готов к работе раз в 100 мс, а один из четырёх газовых слотов обновляется примерно раз в 400 мс. Это расчёт кода, а не измеренное время на плате.
Исходная конфигурация каналов
Во встроенных стартовых данных найдены четыре исходных слота: EX, O₂, H₂S и CO. Для них восстановлены следующие исходные пороги:
| Слот | Газ | Верхний / нижний порог во внутреннем масштабе |
| 0 | EX | 50 / 20 |
| 1 | O₂ | 235 / 195 (один десятичный знак: 23,5 / 19,5) |
| 2 | H₂S | 20 / 10 |
| 3 | CO | 200 / 50 |
CO₂ присутствует среди поддерживаемых текстовых типов, но не в этой исходной конфигурации. Надпись EX не позволяет установить модель или тип физически установленного сенсора.
Тревоги и сигнализация
- Для обычных каналов работают две верхние ступени: предупреждение при достижении нижнего порога и высокая тревога при достижении верхнего.
- Для O₂ используется допустимый интервал: тревога возникает как при недостатке, так и при избытке кислорода.
- При входе в тревожную ступень создаётся запись в журнале; повторное измерение в той же ступени новую запись не создаёт. Возврат в норму в исследованной ветке не записывается.
- Высокая тревога имеет приоритет над предупреждением. Есть отдельное управление несколькими выходами оповещения, но соответствие конкретным линиям «звук / вибрация / свет» требует проверки платы.
Память, настройки и журнал
- Подтверждена отдельная внешняя I²C-память: адрес
0x50, используемый объём 32 КиБ, страницы по 64 байта. По организации она совместима с 24C256, но маркировку микросхемы необходимо подтвердить на плате. - Во внешней памяти находятся рабочие и заводские калибровочные данные, настройки каналов и журнал тревог. Flash-образ содержит алгоритмы и стартовые значения, но не заменяет содержимое этой памяти.
- Журнал состоит из 14-байтных записей и рассчитан на 2000 событий. В старом коде обнаружены проблемы на границе заполнения и при ошибке записи.
- Восстановлены отдельные операции сохранения текущих данных как заводских и восстановления заводских данных. Это не простое обнуление коэффициентов.
Запуск и меню
Подтверждён маршрут запуска: отображение приветствия и ожидания, загрузка параметров каналов, проверка светового/вибрационного/звукового оповещения, затем рабочий экран. В меню есть настройка нуля, калибровка, пороги, журнал, дата/время, язык и заводские операции.
Проверка оповещателей в старом коде — это команда на включение/выключение выходов. Обратная связь, подтверждающая фактическую работу света, вибрации или звука, в исследованном участке не найдена.
Что не следует переносить в новую прошивку без пересмотра
- В старом коде есть участки, где диапазон показаний принудительно заменяется фиксированным числом. В частности, в одной ветви O₂ значения 20,4–21,6 отображаются как 20,9; результат участвует и в тревогах. Новая версия должна явно разделять измеренное значение, значение для тревог и форматирование экрана.
- В исследованной части нет самостоятельного гистерезиса тревог; устойчивость частично обеспечивается фильтрами. Нужны явные правила входа, снятия и задержки тревоги.
- После 2000-й записи старый журнал обнуляет счётчик, а ошибка записи не предотвращает его изменение. Новый журнал должен иметь контроль целостности, атомарную запись, понятную кольцевую политику и восстановление после отключения питания.
- Предупреждение о низком заряде в одном состоянии интерфейса блокирует обычную обработку газов. В новой архитектуре измерения и опасные тревоги должны работать независимо от экранов и меню.
- Фиксированная задержка запуска не является проверкой готовности сенсора. Нужны статусы прогрева, свежести данных, насыщения ADC, отказа датчика и невалидной калибровки.
Ограничения результата
Работа выполнена только с сохранённым образом fw_128k.bin размером 128 КиБ (SHA-256: fa0ff6bb9fdd148ac1449d6a12b491c04434ec47ca6283439f0b6e6875a62560). Подключения к прибору, J-Link/USB, чтения внешней памяти и записи в устройство не было.
Поэтому пока нельзя утверждать:
- какие коэффициенты, пороги, настройки и события находятся в конкретном аппарате;
- какая модель сенсоров и внешней памяти установлена на его плате;
- фактические частоты ADC, задержку обнаружения тревоги и электрическое соответствие линий оповещения;
- метрологическую точность старого или будущего прибора.
Рекомендуемые следующие шаги
- Согласовать контракт измерительного ядра: исходный отсчёт, единицы, время, качество и независимое состояние каждого канала.
- Реализовать и проверить собственную калибровку, фильтрацию, температурные профили и автомат тревог; использовать восстановленные алгоритмы как референс, но не переносить старые коэффициенты и пограничные решения без проверки.
- Спроектировать формат хранения настроек, калибровок и журнала с версией, контрольной суммой, двумя копиями и восстановлением после прерванной записи.
- Отделить измерения и тревоги от UI, меню, зарядки и сервисных действий; задать для всех режимов допустимые переходы и реакцию на ошибки.
- После подтверждения типа памяти и безопасного способа подключения выполнить отдельное read-only считывание внешней NVM конкретного прибора. Это позволит сопоставить встроенные стартовые данные с его реальными настройками и историей.
- Подтвердить плату и сенсоры: распиновку ADC, опору/усиление, внешнюю память, линии оповещения и фактические временные характеристики.