BlackOps 0 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба Привет всем, Такая вот проблема... использую PIC32 и стандартные Микрочиповские библиотеки для работы с файловой системой FAT. Записываю данные размером 24 байта каждую 1 миллисекунду, длится эта запись меньше 100 микросекунд, и так далее... Но... вот проблема: каждые примерно 21-25 миллисекунд процесс записи данных длится около 5-6 миллисекунд, а не 100 микросекунд как обычно. т.е. каждые примерно 21-25 миллисекунд команда: FSfwrite(&data, 1, 24, pointer); занимаыет около 5-6миллисекунд, в то время как каждую 1 миллисекунду она занимает около 100 микросекунд. У кого есть опыт работы с системой FAT, кто может поделится или подсказать в чем дело? как это исправить? (пробовал разные карти с разным форматированием...результат примерно тот же) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба Задержка в данном случае возникает на границе сектора - 512 байт. Совсем уйти от задержек нельзя: операция записи SD может занимать до 250мс (и занимает иногда). Ваше приложение должно обеспечивать достаточную буферизацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба Да согласен... т.к. примерно 21-25 * 24 байта ~512 Ваше приложение должно обеспечивать достаточную буферизацию. Ну а вот с этим как раз таки проблемы у ПИК32 есть определенная РАМ память..но вот как реализовать буферизацию?..дело в том что пока функция FSfwrite исполняется нужно ждать ее завершения пока что либо можно будет сделать... памяти у меня 32кБ...но вот процесс сбора данных с различных сенсоров идет очень долгое время... т.е. это не кратковременная работа где я бы мог записать в память, потом в карту и так далее... тут требование чтобы процесс записи новых данных не прерывался хотябы на протяжении часа. поетому если я скажем буду записывать данные в память, а после этого начну писать из памяти в карту...то в это время я начну терять новые поступающие данные. другое решение будет например сократить интервал времени сбора данных...скажем собирать их каждые 7миллисекунд... что примерно чуть больше самой долгой задержки.... но хотелось бы конечноже более частого сбора данных с равномерным интервалом.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба памяти у меня 32кБ... Ну, этого как раз достаточно. если я скажем буду записывать данные в память, а после этого начну писать из памяти в карту...то в это время я начну терять новые поступающие данные. Используйте, например, прерывания для сбора данных, чтобы распараллелить процессы. Или ОС. другое решение будет например сократить интервал времени сбора данных...скажем собирать их каждые 7миллисекунд... что примерно чуть больше самой долгой задержки.... Это не лучшее решение: задержки никто не гарантирует. У другой карты они будут совсем другими, да и на этой же могут периодически меняться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба Ну а вот с этим как раз таки проблемы у ПИК32 есть определенная РАМ память..но вот как реализовать буферизацию?.. Очень может быть, что то что вы видите уже есть действие внутренней буферизации используемого вами софта. То есть якобы записанные вами байтики на самом деле никуда не уходят, а лежат себе спокойненько или внутри майкрочиповского RAM в накапливаемом софтом буфере размером в сектор или передаются понемногу в SD-Card. Но реально запись происходит раз в сектор, в этот же момент времени и обновляется информация в FAT. Если бы при каждом вашем миллисекундном чихе данные физически писались бы в флэшку и происходило обновление FAT, карточка бы долго не протянула. Думаю вам нужен ресурс больше чем на пару месяцев и надеюсь у вас все просчитано. Буферизация записываемых данных как таковая не нужна. Нужно построить свою программу, чтобы она умела накапливать данные в течении времени, когда SD-Card занята, вот от этой буферизации вам не уйти. То есть собираете себе данные в свой буфер, и раз в какое-то время проверяете освобождение карточки. Освободилась-сливаете буфер или его часть в карточку, не освободилась- продолжаете накапливать. Если у вас проблемы с распаралеливанием реалтаймовой задачи сбора и фоновой задачи обработки данных (сюда можно отнести и нужный вам процесс общения с SDC) - это уже другой вопрос, не имеющий прамого отношения ни к SDC ни к PIC32. По поводу этих посчитанных вами миллисекунд. Максимальное время записи сектора нормировано. Вот прям счас не скажу или спецификацией SDC или читается из регистра самой карточки при инициализации. Но это не экспериментальная величина, она известна. Конечно, плюс задержки вносимые фирмварью и интерфейсом, но они малы (если не задаться целью что-то тормознутое в фоне написать). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackOps 0 16 мая, 2011 Опубликовано 16 мая, 2011 · Жалоба спасибо всем за ответы... ну я провел опать много измерений...задержка записи более 8 миллисекунд макс. не превышает. разрешено обновлять данные каждые 10 миллисекунд. думаю пока прокатит, тем более что изделие не на массовое производство а для кратковременного теста. а вообще для такого рода задач где нужно быстро записывать данные и еще управлять чем то параллельно выход это ПЛИС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться