Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
20.11.2009, 10:55
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
Оказалось сделать хорошую буферизацию потока данных не так просто. Вообщем пляшу с бубном уже вторую неделю вокруг своего девайса, но результаты честно говоря фиговые. Если кто делал буферизацию потоков, то плиз хелп.
Как у меня все устроено. Имеется некоторый девайс, который читает векторные анимации(или просто мультики) с карты памяти и выводит их на ШИМовый ЦАП(2 выхода - X и Y). Надо обеспечить боле менее плавное воспроизведение, чтоб если карта занята то воспроизведение не прерывалось(а она становится занятой после считывания каждого сектора - готовит новые данные). Два буфера, функция заполнения буфера и функция считывания информации с буфера. Считывание буфера происходит по переполнению счетчика первого таймера(~10КГц).
Алгоритм работы. При открытии файла заполняются оба буфера FIFO1 и FIFO2. После этого активируется прерывание, которое разрешает считывание первого буфера - FIFO1. При возникновении прерывания вызывается подпрограмма считывания буфера, при каждом входе считывается только одна точка(3 байта). Мы ждем пока не опустошится первый буфер. Когда он станет пуст, то на воспроизведение переключается второй буфер - FIFO2, а FIFO1 автоматически начинает заполняться(если не ошибаюсь, называется пинг-понг буфер). Итак все по кругу, пока не будет достигнут конец файла.
Проблема в том, что при воспроизведении параллельно с полезной информацией в некоторых местах начинает выводится грязь(результат я контролирую на экране осциллографа). Может быть один буфер начинает наезжать на другой, но это проявляется только начиная с определенных скоростей воспроизведения. Грязи быть не должно,а если оба буфера оказались пусты(конец файла, не хватает быстродействия процессора и т.д.), то прерывания отключатся и система ожидает заполнения обоих буферов и только потом продолжает воспроизведение. Ошибки работы файловой системы сразу исключаю т.к без буферизации воспроизводится без грязи.
Уже у меня нет мыслей что бы могло стать причиной такого странного поведения программы.
Вот основной код на Си с довольно подробными комментами, функции буферизации находятся в файле stream_play.c Гляньте плиз, может у кого появятся какие-то идеи.
|
|
|
|
22.11.2009, 00:39
|
|
Частый гость
Регистрация: 25.08.2006
Сообщений: 32
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
|
|
|
|
23.11.2009, 15:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
В Вашем случае, мне кажется, так и проситься кольцевой буфер. Возьмем его для упрощения (чтобы не контролировать переполнение указателей) 256 байт.
Берем указателя - 2 - один для чтения, другой для записи, байтовых.
В случае освобождения данных их кольца инкрементируем значение указателя чтения, а при записи в кольцо контролируем, не равны ли они друг другу (чтобы не наехать), записываем, инкрементируем указатель записи.
проект для иллюстрации в приложении.
|
|
|
|
23.11.2009, 18:38
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
urry
Поковырял ваш код. Идея понравилась. Попробую сделать аналогичное в своем приложении.
|
|
|
|
24.11.2009, 15:08
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
Заработало. И очень даже хорошо заработало. Прокрутил несколько файлов, все ОК. Только в функцию считывания, вызываемую из прерывания, пришлось тоже добавить проверку на наезжание. Иначе как-то нестабильно работало, файлы слишком рано закрывались.
У меня такой вопрос. У вас проверка реализована так:
while(!(pos_read ^ pos_write));
В моем случае это числа типа unsigned int. Я сделал так:
while(pos_read == pos_write);
и компилятор(CVAVR 1258, оптимизация по скорости) сказал что в последнем случае надо меньше флеша. А реально как быстрее будет?
|
|
|
|
24.11.2009, 16:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
Выбрать буфер со значением, кратным 2. Тогда обычной маской можно закрыть указатель, не
if(i›(FIFO_LEN-1))
pos_write=0;
else
pos_write=(--i);
а
#define FIFO_LEN 512
#define FIFO_MASK FIFO_LEN -1
pos_write=--i & FIFO_MASK;
как-то так.
И версию компилятора обновить попробовать...
|
|
|
|
24.11.2009, 18:49
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
Сообщение от urry
|
Выбрать буфер со значением, кратным 2. Тогда обычной маской
|
Не получится. У меня размер буфера должен быть кратен трем т.к. за один раз добавляется или считывается по 3 байта.
|
|
|
|
15.01.2011, 13:17
|
|
Прохожий
Регистрация: 15.01.2011
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
Cyber_RAT,
Интересует работа с SD картами в быстром режиме. Вы можите поочь добрым советом? Давайте пообщаемся по Skype. Мой логин - plis200. иЛИ ПОЧТА - mortalcombat2000@mail.ru
|
|
|
|
15.01.2011, 13:18
|
|
Прохожий
Регистрация: 15.01.2011
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
|
|
|
|
15.01.2011, 13:20
|
|
Прохожий
Регистрация: 15.01.2011
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Пытаюсь работать с SD card. Нужна помощь
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:52.
|
|