Модуль универсального контроллера для интернета вещей. Тестирование FatFs

a10d19e628ece2a53ba5c69e85db3f1f.png

В этой статье я продемонстрирую проекты тестирования библиотеки FatFs портированой на модуль K66BLEZ1. Библиотека с открытым исходным кодом FatFs хорошо известна программистам микроконтроллеров и реализует поддержку файловой системы FAT32 на SD и MMC картах. Незаменимая вещь при разработке логгеров, программируемых логических контроллеров, звукозаписывающих устройств, треккеров и проч. Но иногда она может стать узким местом в системах реального времени.


Знакомство с модулем K66BLEZ1 было начато в этой статье:
Модуль универсального контроллера для интернета вещей. Вдыхаем жизнь

В статье было упомянуто о наборе программного обеспечения (SDK) для микроконтроллеров семейства K66.
В частности, в SDK можно найти пример для тестирования FatFs. Пример очень простой и поэтому я его модифицировал для большей практичности.

Чтобы исходный пример из SDK заработал на плате K66BLEZ1 в него не нужно вводить никаких изменений. Но есть одно, но! Не будет вывода в отладочный терминал. Поскольку на плате модуля нет специального разъёма для отладочного вывода с интерфейсом RS232.
Отладка модуля рассчитана на плотную работу через SWD интерфейс и использование технологии Real Time Terminal (RTT) описанной в этой статье. Однако такой подход может не понравится обладателям отладочных адаптеров несовместимых с J-Link. Поэтому я не стал в приложении исправлять код отладочного вывода, но перенаправил его в UART4. Здесь вновь чтобы избежать макетирования я использовал преимущества J-Link. У этого адаптера на разъем SWD выведены сигналы RX и TX со встроенного конвертера UART<->Virtual COM port. Их я и использовал. Таким образом на плате модуля появился первый тюнинг. Он показан на схеме ниже красным цветом.
0e238668328e7f13f2c490b162f075a5.png
(Кликнуть для увеличения)

Т.е. на плате K66BLEZ1 проводами пропаиваем соединение выделенных красным сигналов отладочного разъема с нужными сигналами, идущими от микроконтроллера.
acb481159081f57a5250f3cd5fff64e0.png
(Кликнуть для увеличения)

Ниже показана схема переходника от разъёма J-Link к отладочному разъёму платы K66BLEZ1 для понимания куда сигналы приходят на адаптере.
0b9348fd0b4b27ce8cc79aa33b7f43ee.png
(Кликнуть для увеличения)


Я сделал два проекта в среде IAR Embedded Workbench for ARM 7.40.7
Один полностью повторяет пример работы с FatFs из комплекта SDK от производителя.
Для большего удобства копирования проекта, его изучения и рефакторинга я извлёк из SDK все файлы, связанные с данным проектом и перенёс их в другую более простую структуру директорий с меньшим количеством файлов.

Затем изменил настройки для отладочного UART в файле board.h.
Для получения максимальной производительности платы в файле sdcard_FatFs.c заменил функцию BOARD_BootClockRUN на BOARD_BootClockHSRUN, т.е. частоту процессора установил на 180 МГц вместо 120 МГц.
Проект находится здесь

Второй проект выполнен на основе первого, но со значительными дополнениями.
Этот проект позволяет тестировать скорость открытия, создания, записи, чтения, закрытия и удаления файлов.
Проект находится здесь


Компилируем проект в IAR и программируем через JTAG/SWD адаптер в микроконтроллер MK66FN2M0VLQ18 на плате.
После запука программы в терминал выводится меню такого вида:
2a37e5482fc1811f8d52ec1b23974938.png
(Кликнуть для увеличения)

Меню предлагает запустить один из трех тестов и возможность поменять несколько параметров тестов.

Тест номер 1 последовательно записывает указанное количество файлов с указанным размером. Записываются случайные данные получаемые функцией rand. Каждая запись сопровождается измерением времени открытия, записи и закрытия файла.
Затем файлы последовательно читаются и сверяется их содержимое, также измеряется время открытия, чтения и закрытия файла.
Если установлен флаг Erase, то файлы затем удаляются и измеряется время удаления файлов.
Для 3-х групп операций: создания файлов, обратного чтения и удаления, подводится статистика.
Так выглядит окно тестирования записи, чтения, стирания 5-и файлов размером 8192 бата.
15ac450dc99132e90ecb742aa1891aa0.png
(Кликнуть для увеличения)

Количество файлов и их размер можно произвольно менять. Если значения будут слишком большими, то программы выдаст сообщение о недостатке памяти.

Тест номер 2 создаёт, записывает, читает, удаляет файл заданного размера и повторяет так заданное количество раз.
Имя фала каждый раз меняется. Здесь количество записей может быть очень большим. Тест позволяет тестировать карты до полного износа и при этом видеть картину деградации скорости записи и чтения.

Тест номер 3 создаёт файл и записывает в него указанное число (величина Files Cnt) раз блоки указанного размера. Потом процедура повторяется для ещё одного файла. Этот сценарий позволяет тестировать режим непрерывной записи типичной для аудио записывающих устройств со сменой томов.


На плате K66BLEZ1 библиотека FatFs показала очень хорошие результаты.

Для тестирования использовалась 8GB microSD карта GOOD RAM SDU8GDMGR (10-й класс)

Средняя скорость записи файла размером 32768 байт — 5.1 Мб/с
Максимальная скорость записи файла размером 32768 байт — 11.8 Мб/с

Средняя скорость считывания файла размером 32768 байт — 15.9 Мб/с
Максимальная скорость считывания файла размером 32768 байт — 16.2 Мб/с

Измерения делались тестом номер 1 на 100 файлах.

Было замечено, что сильное влияние на скорость чтения и записи оказывает кратность размер файла размеру кластера.
Также при большом количестве файлов на общую скорость начинает влиять время открытия файла, которое увеличивается на два порядка при изменении количества файлов с одного до ста.

Практическая ценность тестов в том, что они позволяют найти оптимальные параметры форматирования карт, оптимальные размеры для файлов, а также оптимизировать размеры блоков записываемых файлов для достижения максимальной производительности.
Эти же тесты помогут увидеть и оценить спорадические задержки при записи характерные для SD и MMC карт в связи с работой их внутреннего механизма выравнивания износа секторов памяти.

Здесь хранятся все материалы, связанные с этим проектом — https://github.com/Indemsys/K66BLEZ1

© Geektimes