Я работаю над встроенным проектом Linux, который соединяет ARM9 с чипом аппаратного видеокодера и записывает видео на SD-карту или USB-накопитель. Архитектура программного обеспечения включает в себя драйвер ядра, который считывает данные в пул буферов, и пользовательское приложение, которое записывает данные в файл на смонтированном съемном устройстве.
Я нахожу, что выше определенной скорости передачи данных (около 750 кбайт/сек) я начинаю видеть, что приложение для записи видеопотока в пользовательском пространстве задерживается на полсекунды примерно каждые 5 секунд. Этого достаточно, чтобы заставить драйвер ядра работать без буферов - и даже если бы я мог увеличить количество буферов, видеоданные должны быть синхронизированы (в идеале в пределах 40 мс) с другими вещами, которые происходят в реальном времени. Между этими 5-секундными "отстающими шипами" записи полностью записываются в течение 40 мс (насколько это касается приложения - я понимаю, что они буферизуются ОС)
Я думаю, что это отставание связано с тем, как Linux вымывает данные на диск - я отмечаю, что pdflush предназначен для пробуждения каждые 5 секунд, я понимаю, что это будет то, что пишет. Как только задержка окончена, пользовательское приложение может быстро обслуживать и записывать отставание буферов (это не переполнение).
Я думаю, что устройство, на которое я пишу, имеет разумную конечную пропускную способность: копирование 15 МБ файла из памяти fs и ожидание синхронизации (и индикатор USB-накопителя, чтобы перестать мигать) дали мне скорость записи около 2,7 МБ/сек.
Я ищу два типа подсказок:
-
Как остановить прерывистую запись от остановки моего приложения - возможно, приоритетов процесса, исправлений в реальном времени или настройки кода файловой системы для записи непрерывно, а не просто?
-
Как я могу сделать свое приложение (а) осведомленным о том, что происходит с файловой системой, с точки зрения записи и хранения на карте? У меня есть возможность изменять битрейт видео в аппаратном кодеке на лету, что было бы намного лучше, чем падение кадров, или наложение искусственной крышки на максимальный допустимый бит.
Дополнительная информация: это ARM9 с тактовой частотой 200 МГц, в настоящее время работающий под управлением ядра на основе Montavista 2.6.10.
Обновление:
- Установка файловой системы SYNC приводит к слишком низкой пропускной способности.
- Съемный носитель FAT/FAT32 отформатирован и должен быть в качестве цели дизайна, так это то, что носитель можно подключить к любому ПК с Windows и прочитать.
- Регулярно вызывающие sync() или fsync() говорят, что каждая секунда вызывает регулярные киоски и неприемлемо низкую пропускную способность
- Я использую write() и открываю (O_WRONLY | O_CREAT | O_TRUNC), а не fopen() и т.д.
- Я не могу сразу найти что-либо в Интернете о упомянутых "Linux файловых системах реального времени". Ссылки?
Надеюсь, это имеет смысл. Первый встроенный вопрос Linux в stackoverflow?:)