# Временная база: подтверждённые номинальные периоды

Проверен `C:\dump\fw_128k.bin`, дизассемблерный листинг `Untitled-1.txt` и локальный SDK FM33LG0xx из `E:\FM33LG0XXbooload软件V4.4(22.07.22)`. Это расчёт по программной конфигурации, **не измерение осциллографом и не гарантия фактического времени реакции прибора**.

## От тактовой частоты до планировщика

1. Вход `0x104A4` вызывает настройку тактирования `0xCE4C`. Она выбирает RCHF как источник PLL (`CMU_PLLCR`, `0x4000240C`, INSEL=0), предделитель 8 (поле REFPRSC=3), множитель 24 (поле DB=23), включает PLL и ждёт LOCKED. Затем `CMU_SYSCLKCR` (`0x40002400`) переключается на PLL, делители AHB/APB очищаются до /1.
2. Ранний `SystemInit`, `0xE648`, настраивает заводские подстройки и служебные узлы; непосредственно прикладное переключение на PLL выполняет именно `0xCE4C`. Для исходного RCHF 8 МГц номинальная частота получается `8 000 000 / 8 × 24 = 24 000 000 Гц`. SDK задаёт `__RCHF_INITIAL_CLOCK=8000000`; его `FL_CMU_GetPLLClockFreq` подтверждает трактовку полей. Поле выбора частоты RCHF в `0xCE4C` не переписывается, поэтому расчёт предполагает нормальное начальное состояние после сброса.
3. В `0x104F8` в переменную `0x20000EF0` записывается 24 000 000 (литерал `0x10554`). Вызов `0xE04` делит это значение на 1 000 000 и сохраняет 24 в `0x20000F0C`: это масштаб для программных задержек, а не период планировщика.
4. `0xDBA0` загружает `SysTick.LOAD=23999` по `0xE000E014`, очищает VAL, устанавливает CTRL=7 по `0xE000E010` — счёт от процессорной частоты, прерывание и счётчик включены. Следовательно, номинально один SysTick: `(23999+1)/24 000 000 = 1 мс`.
5. Вектор `0x3C` ведёт через `0xF8`: сначала вызывается `0xECC`, затем управление передаётся `0xE590`. В `0xE590` счётчик `0x20000F04` доходит до 10 и обнуляется. Только тогда обслуживаются четыре задания. **Единица аргумента периода — 10 мс, не 1 мс.**

В SDK проверены `fm33lg0xx.h` (начальная частота и карта CMU), `fm33lg0xx_fl_cmu.h` (поля PLL и кодирование источников/делителей), `fm33lg0xx_fl_cmu.c` (`FL_CMU_GetRCHFClockFreq`, `FL_CMU_GetPLLClockFreq`). Заводские значения подстройки из системной области и реальная частота конкретного экземпляра здесь не считывались.

## Задания

Регистрация через `0xDAB4` в `0x1050C–0x1053C`. Периоды хранятся по `0x20002094`, обратные счётчики — `0x20002084`, адреса заданий — `0x20002074`.

| Адрес | Роль | Аргумент периода | Номинальный период готовности |
|---|---|---:|---:|
| `0x1056C` | Главная машина состояний и измерительная обработка | 10 | 100 мс |
| `0x1534` | Управление сигнализацией | 10 | 100 мс |
| `0xFFF8` | Обработка кнопок | 2 | 20 мс |
| `0xD898` | Обработчик очереди/кадров | 5 | 50 мс |

При нулевом начальном обратном счётчике готовность появляется уже на первом 10-миллисекундном шаге. После срабатывания `0xE590` перезагружает счётчик значением периода и сразу уменьшает его на один: последующие интервалы равны именно `period × 10 мс`, без дополнительного шага.

Для кооперативных заданий прерывание увеличивает байтовый счётчик готовности `0x20000EF4`; `0xDC28` исполняет обработчики последовательно и уменьшает этот счётчик. Период готовности не равен гарантированному времени начала/окончания обработчика. Долгий вызов, запрет прерываний, переполнение очереди готовности и пропущенные аппаратные тики этим расчётом не исключены.

## Газовый слот и медленные измерения

В нормальных состояниях `state >= 10` основной обработчик `0x1056C` вызывает `0xAEC4` один раз. Обработка использует индекс `0x200000F8`; путь продвижения `0xC6BC` увеличивает его с циклическим возвратом после 3. Для обычного прохода четырёх включённых каналов получаются **100 мс между соседними газовыми слотами и 400 мс между обработками одного канала** — номинально 2,5 обновления/с на канал. Это не частота всех внутренних преобразований АЦП: одна обработка может включать несколько чтений/усреднение. Отключённые каналы и особые ветви требуют отдельного анализа расписания и в эту оценку не включены.

В тех же нормальных состояниях `0x1A8C` выполняет батарейное измерение после 10 своих вызовов (номинально 1 с), а `0x11478` температурное после 20 (номинально 2 с). Применять эти цифры к зарядному, выключенному или начальному состоянию без проверки вызовов нельзя.

## Что перенести в требования

Для новой прошивки явно разделить аппаратную частоту АЦП, время газового слота, период обработанного значения и задержку сигнализации. Использовать монотонные временные метки и контроль возраста значения, диагностировать пропуски сроков/переполнение очереди. Не переносить UI-счётчики как секунды без перевода через период задания. Установленные 100/400 мс — характеристика старого программного расписания, а не обоснование подходящего быстродействия нового прибора.
