44 lines
2.5 KiB
Markdown
44 lines
2.5 KiB
Markdown
# FlashStorage
|
||
|
||
Переносимый журнал двух банков Flash с подтверждёнными записями и восстановлением
|
||
после прерванной записи. Предоставляет также EEPROM-подобный образ 512 байт.
|
||
Не содержит HAL, файловой системы, адресов конкретной платы или malloc.
|
||
|
||
Приложение → `flash_storage` / `eeprom_store` → callbacks → Flash-порт платы.
|
||
|
||
| Файл | Назначение |
|
||
|---|---|
|
||
| `Inc/flash_storage.h` | Контекст, раскладка банков, read/program/erase/tick callbacks |
|
||
| `Inc/flash_storage_config.h` | Версия формата, magic, commit marker |
|
||
| `Src/flash_storage.c` | Восстановление, запись, ротация банков; только стандартный C |
|
||
| `Tests/test_flash_storage.c` | Прерывание записи, восстановление, несколько экземпляров |
|
||
|
||
Порт получает контекст, адрес и длину. `read`/`program`/`erase` возвращают
|
||
`flash_storage_status_t`; `tick_ms` возвращает uint32_t. Буферы принадлежат
|
||
экземпляру. Стирание и программирование могут блокировать процессор: API не
|
||
предназначен для ISR. Раскладку и резерв места задаёт `flash_storage_layout_t`.
|
||
|
||
```c
|
||
/* board_ops, board_context и layout определяет порт конкретной платы. */
|
||
flash_storage_t journal;
|
||
uint8_t payload[512] = {0}, restored[512];
|
||
size_t length = 0;
|
||
flash_storage_status_t result;
|
||
result = flash_storage_init(&journal, &board_ops, board_context, &layout);
|
||
if (result == FLASH_STORAGE_OK) {
|
||
result = flash_storage_write(&journal, payload, sizeof(payload));
|
||
}
|
||
if (result == FLASH_STORAGE_OK) {
|
||
result = flash_storage_read_latest(&journal, restored,
|
||
sizeof(restored), &length, 0);
|
||
}
|
||
```
|
||
|
||
Существующий потребитель — climate. Порты STM32F4 и SPI NOR остаются там.
|
||
Проверка: `python tools/test_shared_libraries.py` из корня templates.
|
||
|
||
|
||
## Shared source
|
||
|
||
Canonical source: `templates/c/flash-storage`. Used by `home/climate`; its old paths are compatibility includes. Board-specific ports remain in the application. Change this library, not the forwarding files.
|