Здравствуйте. Программа не влезет в память ардуино. Там с аналоговых входов считываются три переменных, которые сравниваются с нулевыми столбцами и строкой не маленького трехмерного массива [30][20][20] (значения в массиве постоянны) соответственно, далее находится значение на пересечении трех искомых. Полученное значение отправляется на выход. Всё это должно прогнаться менее чем за 10 мс. Далее цикл повторяется. Вопрос в чём - хватит ли производительности ардуино (нано) и карточки? И зависит ли скорость считывания с карты в зависимости от ее объема?
@Braun, а во флеше не получится разместить массив? Код (C++): #include <avr/pgmspace.h> const int PROGMEM bigarray[30][20][20] = ....;
Во флеш-памяти 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 мс
Пожалуйста. Вообще, я еще чуть-чуть подумал и мой первый вариант решения неоптимален. На самом деле у этих чипов есть такая функция как Sequential Read, в которой вы сперва устанавливаете адрес в чипе, а после он уже байт за байтом выставляет данные на линию при каждом запросе, самостоятельно инкрементируя адреса. Поэтому правильней сделать так: прочитать значения по первой размерности данных, найти нужное, высчитать новый адрес, прочитать новые значения по второй размерности и. д. Удачи.