Память и контроллер
Секции линкера
RTOS / Стеки
Куча / Аллокатор
Лог / Flash износ
Результаты RAM
| .data + .bss, КБ | – |
| RTOS стеки, КБ | – |
| TCB/оверр., КБ | – |
| ISR стек, КБ | – |
| DMA/пулы, КБ | – |
| Куча с оверхедом, КБ | – |
| Итого занято, КБ | – |
| Свободно, КБ | – |
| Загрузка, % | – |
Результаты Flash
| .text + .rodata, КБ | – |
| .data копия, КБ | – |
| Выравн./сервис, КБ | – |
| Bootloader + OTA, КБ | – |
| Итого занято, КБ | – |
| Свободно, КБ | – |
| Загрузка, % | – |
Износ Flash
| Записей/сутки, байт | – |
| Эффективные циклы | – |
| Срок до предела, лет | – |
| Износ за срок, % | – |
Программа помогает быстро и точно оценить фактическую загрузку оперативной памяти (SRAM) проектом (глобальные данные, стеки задач, TCB, ISR, куча, DMA); использование Flash (код, rodata, копии инициализированных данных, bootloader/OTA, выравнивание) и примерную степень износа флеш-памяти при заданной схеме логирования/записей. Инструмент будет полезен разработчикам прошивок, архитекторам IoT-устройств, тестировщикам кода — всякому, кто должен понять, «влезет» ли прошивка в плату, сколько памяти оставить под буферы и логи, и какой ожидаемый срок её службы при существующей схеме записи.
Что задаётся на входе
1. Аппаратные пресеты
Выбор пресета подставляет типичные значения RAM/Flash для популярных MCU. Пресет только облегчает ввод — все значения можно
изменить вручную.
2. Общие параметры MCU
- RAM всего, КБ — общий объём оперативной памяти, доступной приложению.
- Flash всего, КБ — объём встроенной (или внешней) флеш-памяти, используемой для прошивки и хранилищ.
- Страница Flash, байт — размер программируемого блока (страницы/сектора) флеша; важен для расчёта выравнивания и износа.
- Загрузчик (Bootloader), КБ — занимает постоянный участок Flash и вычитается из доступного пространства.
- OTA/резерв, КБ — резерв под OTA-образ/файловую область (если используется двойная прошивка и т.п.).
3. Секции линкера
Задаются размеры базовых секций сборки прошивки (в килобайтах):
- .text — машинный код, функции (отображается как «Code» в Flash).
- .rodata — константы, таблицы, строковые литералы (RO Data).
- .data — инициализированные глобальные: записываются в Flash и при старте копируются в RAM.
- .bss — неинициализированные глобальные: занимают место только в RAM.
- Выравнивание, КБ — дополнительный резерв/паддинг, на который округляются сегменты при размещении (имитирует linker padding и alignment).
4. RTOS и стеки
Параметры, влияющие на суммарную нагрузку SRAM:
- Число задач — количество RTOS-тасков (каждая обычно имеет свой стек и TCB).
- Стек/задачу, байт — размер стека, выделяемый каждой задаче (если неизвестен, напишите разумную оценку; можно использовать анализ call-depth для оценки).
- TCB/оверр., байт — служебная структура (Task Control Block) на задачу.
- ISR стек, байт и Макс. вложенность ISR — учитываем сохранение контекста при прерываниях.
- DMA/пулы, КБ — статические большие буферы, размещаемые в SRAM.
5. Куча / Аллокатор
Параметры, нужные для оценки пикового потребления heap и фрагментации:
- Куча, КБ — размер, выделенный в линкер-скрипте для malloc/new.
- Оверхед/фрагм., % — предполагаемая доля потерь из-за оверхеда аллокатора и фрагментации (эвристика).
- Аллокатор — влияет на фрагментацию: простые malloc/free обычно дают большую фрагментацию, TLSF — минимальную.
- Мин. выравн., байт — выравнивание аллокаций, важное для расчёта потерь на выравнивании (например 8 или 32 байта).
6. Лог / Flash износ
Параметры для оценки срока службы Flash при логировании:
- Срок, лет — желаемый эксплуатационный период (для оценки % износа за этот срок).
- Надёжность, циклы/стр. — endurance одной страницы/строки флеша (обычно 10⁴–10⁶; см. datasheet).
- Байт/запись — сколько байт записывается за одну лог-операцию (можно учитывать буферизацию и запись пачками).
- Записей/час — сколько таких операций в среднем в час.
- Выравн. износа × — предполагаемый фактор wear-leveling (1 = нет, >1 — распределение записей по N страницам).
- Выделено под лог, КБ — размер области флеша, на которую пишутся логи (чем больше область — тем дольше служит до исчерпания циклов).
Как считаются величины
Все входы принимаются в килобайтах (КБ) или байтах в зависимости от поля; расчёты приводятся в КБ и процентах. Для точных выравниваний используется размер страницы Flash в байтах.
Flash: суммарно занято и свободно
Код и константы: flCode = .text + .rodata
Копии инициализированных данных: flDataCopy = .data
Сумма до выравнивания: flPreAlign = flCode + flDataCopy + alignOver
Выравнивание под страницу: flUsedNoBoot = ceil((flPreAlign*1024)/page) * page / 1024 (результат в КБ)
Итого занято: flUsed = flUsedNoBoot + bootloader + otaReserve
Свободно: flFree = flashTotal — flUsed
Загрузка: flPct = 100 * flUsed / flashTotal.
RAM: составные части и суммарная загрузка
Глобальные: globalsKB = .data + .bss (в КБ).
Стек задач: stacksKB = tasks * stackPerTask / 1024.
TCB: tcbKB = tasks * tcbOver / 1024.
ISR стек: isrKB = isrStack * isrDepth / 1024.
DMA: просто сумма (dmaPoolKB).
Куча с оверхедом: heapRealKB = heapKB + heapKB * (heapOvPct / 100) + alignment_loss — где alignment_loss оценивается исходя из min-alignment.
Итог: ramUsed = globalsKB + stacksKB + tcbKB + isrKB + dmaKB + heapRealKB.
Свободно: ramFree = ramTotal — ramUsed. Загрузка: ramPct = 100 * ramUsed / ramTotal.
Модель износа Flash
Модель в данном калькуляторе — упрощённая, но практичная: считаем, сколько байт записывается в день в область логов и оцениваем, через сколько лет будет исчерпано количество циклов для выделенного количества страниц.
Записей в день (байт): dayWrites = bytesPerWrite * writesPerHour * 24.
Число страниц, на которые пишут логи: pagesLog = floor(logAreaKB*1024 / page) (минимум 1).
Эффективные циклы на страницу: effCycles = endurance * wearLevel (wearLevel моделирует распределение/дублирование, >1 — лучше распределение).
Общий «ёмкость записей» в байтах до истощения: bytesTotal = pagesLog * page * effCycles.
Лет до исчерпания: yearsToWear = bytesTotal / dayWrites / 365 (если dayWrites=0 — срок бесконечный).
Процент износа за желаемый срок: wearPct = 100 * desiredYears / yearsToWear.
Оценка фрагментации кучи
Реальная фрагментация — сложная вещь; в калькуляторе даётся простая оценка:
чем «хуже» аллокатор (malloc) и чем больше мелких и средних аллокаций, тем выше предполагаемый оверхед (heapOvPct).
Для TLSF фрагментация понижается (в реальности — значительно), для static_pool — близка к нулю при правильной настройке.
Интерпретация результатов
Основные контрольные точки:
- RAM загрузка > 90% — критично: возможны краши, corruption стеков, OOM. Нужно уменьшать стеки, сокращать глобалы, переносить буферы в внешнюю память или компрессировать данные.
- Flash загрузка > 90% — мало места для обновлений/OTA и сервисных областей; рекомендуется уменьшить код/rodata, включить оптимизации линковщика (garbage collection sections), удалить неиспользуемые фичи.
- Износ Flash > 90% за желаемый срок — вероятность исчерпания циклов высока: требуется увеличить область логов, уменьшить частоту записей, использовать wear-leveling, использовать внешнюю NOR/NAND/FRAM или энергонезависимое хранилище с лучшей endurance.
Практические рекомендации
Для снижения риска и продления срока службы устройства:
- Минимизируйте глобалы — используйте локальные переменные и старайтесь уменьшать статический буферный объём.
- Оценивайте стек с учётом прерываний и контекстов — добавляйте safety margin 10–20% для критичных задач.
- Для динамических структур используйте TLSF или статические пулы под известные паттерны аллокаций, чтобы уменьшить фрагментацию.
- Сгруппируйте/агрегируйте записи в логи, используйте буферизацию в RAM и запись пачками.
- Используйте файловую систему с wear-leveling (LittleFS, F2FS, spiffs с вниманием к wear-leveling) либо аппаратный контроллер внешней памяти.
- Отслеживайте реальные паттерны нагрузки на устройстве (telemetry) и корректируйте параметры (частоту записи, размер области лога) по факту.
Ограничения модели
Инструмент даёт быструю инженерную оценку, но не заменяет:
- Профилирования памяти в реальном устройстве (runtime heap/stack usage, stack watermarking).
- Точного моделирования фрагментации для конкретного allocator’а и паттернов работы (для этого нужны симуляторы/тесты под нагрузкой).
- Учёта всех аппаратных нюансов (кэш, периферийные DMA, memory-mapped devices, shared RAM с CPU/GPU и т.д.).
Пример пошагового расчёта
Входные данные:
RAM total = 128 KB
Flash total = 512 KB, page = 2048 B
.text = 180 KB; .rodata = 24 KB; .data = 8 KB; .bss = 20 KB; align = 2 KB
tasks = 8, stackPerTask = 2048 B, tcbOver = 256 B
isrStack = 2048 B, isrDepth = 2
heap = 32 KB, heapOv = 12%
DMA pools = 16 KB
logArea = 64 KB, bytesPerWrite = 128 B, writesPerHour = 60, endurance = 10000 cycles, wearLevel = 4, desired life = 5 years
Ключевые шаги расчёта и результаты (кратко):
- globals = data + bss = 8 + 20 = 28 KB
- stacks = 8 * 2048 B = 16384 B ≈ 16 KB
- TCB = 8 * 256 B = 2048 B ≈ 2 KB
- ISR = 2 * 2048 = 4096 B ≈ 4 KB
- heapReal ≈ 32 KB + 12% = 35.84 KB
- ramUsed итого ≈ 28 + 16 + 2 + 4 + 16 + 35.84 ≈ 101.84 KB; ramFree ≈ 26.16 KB; ramPct ≈ 80%
- Flash: flCode = 180 + 24 = 204 KB; flDataCopy = 8 KB; preAlign ≈ 204 + 8 + 2 = 214 KB;
alignToPage(214 KB) с page=2KB даёт flUsedNoBoot ≈ 214 KB (в данном случае уже кратно); flUsed = 214 + boot(16) + ota(0) = 230 KB; flPct ≈ 44.9% - Wear: dayWrites = 128 B * 60 * 24 = 184320 B/день ≈ 180 KB/день; pagesLog = 64KB / 2KB = 32 страниц;
effCycles = 10000 * 4 = 40000; bytesTotal = 40000 * 2KB * 32 ≈ 2.56e9 B;
yearsToWear ≈ bytesTotal / dayWrites / 365 ≈ ~38 лет; wearPct за 5 лет ≈ 13%.
Если RAM > 90% — начинайте с уменьшения стеков и удаления неиспользуемых глобалов; профилируйте runtime для поиска пиков. Если Flash > 90% — включите уровень оптимизации линковщика (remove unused sections), уменьшите таблицы/константы, выносите large assets (таблицы) во внешнюю flash или в компрессированный вид. Если wear высокий — уменьшите частоту записей или увеличьте область логов / примените wear-leveling.
Измерения и верификация
Рекомендуется после проектирования выполнить:
- Сбор размеров секций из map-файла компоновщика и вставка в калькулятор;
- Запуск тестовой прошивки с включёнными сценариями нагрузки; снятие watermark стека и мониторинг peak heap;
- Логирование реальной частоты операций записи и корректировка модели износа под реальные данные.
Итого, этот калькулятор — помощник на этапе проектирования и теста; он ускоряет принятие решений и помогает видеть узкие места, но не отменяет тестирование на «железе» и инструментальное профилирование при подготовке производства.







