Перейти к содержанию
    

PIC32 SD card

Привет всем,

 

Такая вот проблема... использую PIC32 и стандартные Микрочиповские библиотеки для работы с файловой системой FAT.

 

Записываю данные размером 24 байта каждую 1 миллисекунду, длится эта запись меньше 100 микросекунд, и так далее... Но... вот проблема: каждые примерно 21-25 миллисекунд процесс записи данных длится около 5-6 миллисекунд, а не 100 микросекунд как обычно.

 

т.е. каждые примерно 21-25 миллисекунд команда: FSfwrite(&data, 1, 24, pointer); занимаыет около 5-6миллисекунд, в то время как каждую 1 миллисекунду она занимает около 100 микросекунд.

 

 

У кого есть опыт работы с системой FAT, кто может поделится или подсказать в чем дело? как это исправить?

 

(пробовал разные карти с разным форматированием...результат примерно тот же)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задержка в данном случае возникает на границе сектора - 512 байт. Совсем уйти от задержек нельзя: операция записи SD может занимать до 250мс (и занимает иногда). Ваше приложение должно обеспечивать достаточную буферизацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да согласен... т.к. примерно 21-25 * 24 байта ~512

 

Ваше приложение должно обеспечивать достаточную буферизацию.

 

Ну а вот с этим как раз таки проблемы у ПИК32 есть определенная РАМ память..но вот как реализовать буферизацию?..дело в том что пока функция FSfwrite исполняется нужно ждать ее завершения пока что либо можно будет сделать... памяти у меня 32кБ...но вот процесс сбора данных с различных сенсоров идет очень долгое время... т.е. это не кратковременная работа где я бы мог записать в память, потом в карту и так далее... тут требование чтобы процесс записи новых данных не прерывался хотябы на протяжении часа. поетому если я скажем буду записывать данные в память, а после этого начну писать из памяти в карту...то в это время я начну терять новые поступающие данные.

 

 

другое решение будет например сократить интервал времени сбора данных...скажем собирать их каждые 7миллисекунд... что примерно чуть больше самой долгой задержки.... но хотелось бы конечноже более частого сбора данных с равномерным интервалом..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

памяти у меня 32кБ...

Ну, этого как раз достаточно.

 

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

Используйте, например, прерывания для сбора данных, чтобы распараллелить процессы. Или ОС.

 

другое решение будет например сократить интервал времени сбора данных...скажем собирать их каждые 7миллисекунд... что примерно чуть больше самой долгой задержки....

Это не лучшее решение: задержки никто не гарантирует. У другой карты они будут совсем другими, да и на этой же могут периодически меняться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну а вот с этим как раз таки проблемы у ПИК32 есть определенная РАМ память..но вот как реализовать буферизацию?..

Очень может быть, что то что вы видите уже есть действие внутренней буферизации используемого вами софта. То есть якобы записанные вами байтики на самом деле никуда не уходят, а лежат себе спокойненько или внутри майкрочиповского RAM в накапливаемом софтом буфере размером в сектор или передаются понемногу в SD-Card. Но реально запись происходит раз в сектор, в этот же момент времени и обновляется информация в FAT. Если бы при каждом вашем миллисекундном чихе данные физически писались бы в флэшку и происходило обновление FAT, карточка бы долго не протянула. Думаю вам нужен ресурс больше чем на пару месяцев и надеюсь у вас все просчитано.

 

Буферизация записываемых данных как таковая не нужна. Нужно построить свою программу, чтобы она умела накапливать данные в течении времени, когда SD-Card занята, вот от этой буферизации вам не уйти. То есть собираете себе данные в свой буфер, и раз в какое-то время проверяете освобождение карточки. Освободилась-сливаете буфер или его часть в карточку, не освободилась- продолжаете накапливать.

Если у вас проблемы с распаралеливанием реалтаймовой задачи сбора и фоновой задачи обработки данных (сюда можно отнести и нужный вам процесс общения с SDC) - это уже другой вопрос, не имеющий прамого отношения ни к SDC ни к PIC32.

 

По поводу этих посчитанных вами миллисекунд. Максимальное время записи сектора нормировано. Вот прям счас не скажу или спецификацией SDC или читается из регистра самой карточки при инициализации. Но это не экспериментальная величина, она известна. Конечно, плюс задержки вносимые фирмварью и интерфейсом, но они малы (если не задаться целью что-то тормознутое в фоне написать).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо всем за ответы... ну я провел опать много измерений...задержка записи более 8 миллисекунд макс. не превышает. разрешено обновлять данные каждые 10 миллисекунд. думаю пока прокатит, тем более что изделие не на массовое производство а для кратковременного теста. а вообще для такого рода задач где нужно быстро записывать данные и еще управлять чем то параллельно выход это ПЛИС.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...