Временная база: подтверждённые номинальные периоды
Проверен C:\dump\fw_128k.bin, дизассемблерный листинг Untitled-1.txt и локальный SDK FM33LG0xx из E:\FM33LG0XXbooload软件V4.4(22.07.22). Это расчёт по программной конфигурации, не измерение осциллографом и не гарантия фактического времени реакции прибора.
От тактовой частоты до планировщика
- Вход
0x104A4вызывает настройку тактирования0xCE4C. Она выбирает RCHF как источник PLL (CMU_PLLCR,0x4000240C, INSEL=0), предделитель 8 (поле REFPRSC=3), множитель 24 (поле DB=23), включает PLL и ждёт LOCKED. ЗатемCMU_SYSCLKCR(0x40002400) переключается на PLL, делители AHB/APB очищаются до /1. - Ранний
SystemInit,0xE648, настраивает заводские подстройки и служебные узлы; непосредственно прикладное переключение на PLL выполняет именно0xCE4C. Для исходного RCHF 8 МГц номинальная частота получается8 000 000 / 8 × 24 = 24 000 000 Гц. SDK задаёт__RCHF_INITIAL_CLOCK=8000000; егоFL_CMU_GetPLLClockFreqподтверждает трактовку полей. Поле выбора частоты RCHF в0xCE4Cне переписывается, поэтому расчёт предполагает нормальное начальное состояние после сброса. - В
0x104F8в переменную0x20000EF0записывается 24 000 000 (литерал0x10554). Вызов0xE04делит это значение на 1 000 000 и сохраняет 24 в0x20000F0C: это масштаб для программных задержек, а не период планировщика. 0xDBA0загружаетSysTick.LOAD=23999по0xE000E014, очищает VAL, устанавливает CTRL=7 по0xE000E010— счёт от процессорной частоты, прерывание и счётчик включены. Следовательно, номинально один SysTick:(23999+1)/24 000 000 = 1 мс.- Вектор
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 мс — характеристика старого программного расписания, а не обоснование подходящего быстродействия нового прибора.