Перейти к содержимому

sd_file — файл на SD-карте

Раз в 10 секунд дописывает строку с датой и временем работы в /SD/recipes/log.txt. При старте один раз меряет скорость: пишет и читает файл 4 МБ блоками по 32 КБ.

Окно терминала
cmake --preset Release -DH723_RECIPES="sd_file"

Нужна карта microSD с FAT32 или exFAT.

sd_file: started, log /SD/recipes/log.txt every 10 s
sd_file: 4096 KB write 10240 KB/s, read 10694 KB/s
sd_file: /SD/recipes/log.txt += 2026-03-14 10:02:03 #1 uptime 3 s
sd_file: size 68 bytes
sd_file: /SD/recipes/log.txt += 2026-03-14 10:02:13 #2 uptime 13 s
sd_file: size 103 bytes

Размер 68 байт после первой строки — в файле уже была строка с прошлого запуска: файл дописывается, а не перезаписывается. Скорость зависит от карты: на разных картах запись 1,8–10 МБ/с.

  • Пути. Тома FatFs называются /SD и /RAM (RAM-диск 4 МБ в SDRAM). Эти пути понимают и стандартный C (fopen, fprintf — обёртки в libs/disks/wrappers.c), и FatFs напрямую (f_open, f_write).
  • Текст — через stdio. sdFileAppend открывает файл в режиме "a", пишет строку и сразу закрывает. fclose сбрасывает буфер и обновляет запись в каталоге; если держать файл открытым и пропадёт питание, последние данные потеряются.
  • Большие объёмы — через FatFs и крупными блоками. Драйвер SD (libs/disks/sddisk.c) передаёт до 64 секторов одной командой. Блоки по 32 КБ дают скорость в разы выше, чем запись по байту или по строке; буфер такого размера берётся из SDRAM (sdramMalloc).
  • Карта появляется не сразу. Её монтирует appTask, задача рецепта ждёт sdDiskIsMounted().
  • Время. Из RTC: его ставит NTP-клиент, когда есть интернет через Wi-Fi. У HAL есть правило: сначала HAL_RTC_GetTime, потом HAL_RTC_GetDate: чтение времени фиксирует теневые регистры до чтения даты, и при обратном порядке следующие показания будут старыми.
  • Логгер данных: sdFileAppend("/SD/data.csv", строка) из своей задачи. При записи чаще раза в секунду строки выгоднее копить (в буфере или файле на RAM-диске /RAM/...) и переносить на SD пачкой.
  • Коды ошибок FatFs (FRESULT) — в third_party/fatfs/source/ff.h.

Исходники рецепта: recipes/sd_file