Скорость ардуино и sd карты

Тема в разделе "Arduino & Shields", создана пользователем Braun, 15 сен 2016.

Метки:
  1. Braun

    Braun Нуб

    Здравствуйте. Программа не влезет в память ардуино. Там с аналоговых входов считываются три переменных, которые сравниваются с нулевыми столбцами и строкой не маленького трехмерного массива [30][20][20] (значения в массиве постоянны) соответственно, далее находится значение на пересечении трех искомых. Полученное значение отправляется на выход. Всё это должно прогнаться менее чем за 10 мс. Далее цикл повторяется. Вопрос в чём - хватит ли производительности ардуино (нано) и карточки? И зависит ли скорость считывания с карты в зависимости от ее объема?
     
  2. ZAZ-965

    ZAZ-965 Гуру

    @Braun, а во флеше не получится разместить массив?
    Код (C++):
    #include <avr/pgmspace.h>
    const int PROGMEM bigarray[30][20][20] = ....;
     
    Последнее редактирование: 15 сен 2016
  3. Faberge

    Faberge Administrator Администратор

    Во флеш-памяти SD карточек данные организуются файловой системой, файлы записываются в кластеры, которые в свою очередь состоят из секторов к которым и обращается программа. Из-за особенностей технологии Flash, нельзя осуществить доступ к отдельному байту, только к сектору. Поэтому в общем случае ответ на ваш вопрос: да, скорость считывания зависит от объема.

    Но в вашем случае объемы на самом деле небольшие, можно обойтись и EEPROM памятью на линии I2C, например, микросхемой AT24C128. Даже в худшем случае, по расчетам, поиск не займет больше 3.5 мс, а реально будет быстрее.

    При тактировании сигнала SCL на max. скорости 1MHz:
    1) Байтов для запроса - 4
    2) Тактов для запроса - 4*8 = 32 (округлим в большую сторону до 50)
    3) Худший случай при поиске - 30 + 20 + 20 = 70 запросов.
    4) 70 * 50 = 3500 мкс или 3.5 мс
     
  4. Braun

    Braun Нуб

    Спасибо)
     
  5. Faberge

    Faberge Administrator Администратор

    Пожалуйста. Вообще, я еще чуть-чуть подумал и мой первый вариант решения неоптимален. На самом деле у этих чипов есть такая функция как Sequential Read, в которой вы сперва устанавливаете адрес в чипе, а после он уже байт за байтом выставляет данные на линию при каждом запросе, самостоятельно инкрементируя адреса. Поэтому правильней сделать так: прочитать значения по первой размерности данных, найти нужное, высчитать новый адрес, прочитать новые значения по второй размерности и. д. Удачи.
     
  6. Braun

    Braun Нуб

    будем пробовать)