Какого размера файл можно считать в ОЗУ Ардуины

Тема в разделе "Arduino & Shields", создана пользователем AlexVS, 24 авг 2014.

  1. AlexVS

    AlexVS Гик

    Для чтения файла использую следующий код:
    Код (Text):
        while ((d = mFile.read()) > 0)
        {
            c[i] = d;
            i++;
        }
        Serial.print(c);
    Насколько я понял у Pro Mini обьем ОЗУ 1Кб.
    Сколько ОЗУ доступно для считывания информации из файла?
     
  2. altex

    altex Гик

    Создайте большой файл и сделайте Serial.print(i);
    :)
     
  3. AlexVS

    AlexVS Гик

    У меня после чтения 100 с копейками байт в serial monitor начинает лезть мусор
     
  4. NR55RU

    NR55RU Гик

    Вероятнее всего тут проблема в другом. Функция Seria.print() определяет конец строки по нулевому байту.
    Ваше код считывает в массив содержимое файла но в конце массива не устанавливает NULL байт, следовательно функция Serial.print() выкинет массив и потом пойдет дальше по памяти выкидывая "мусор" пока не наткнется где либо на NULL байт.

    Попробуйте так.
    Код (Text):
        while ((d = mFile.read()) > 0)
        {
            c[i] = d;
            i++;
        }
        c[i] = '\0';
        Serial.print(c);
    А вообще объем доступной памяти указывается характеристиках микроконтроллера :)
     
    AlexVS нравится это.
  5. geher

    geher Гуру

    Нужно учитывать, что часть ОЗУ уйдет под стек (где хранятся локальные переменные и данные, необходимые при вызове функций: параметры, адреса возврата, сохраненные состояния регистров), часть под статические переменные, часть под регистры, и только остальное под хип - область памяти, где и происходит выделение памяти по запросу.
    Причем хип и стек растут навстречу друг другу.
    Так что навскидку сказать, сколько памяти можно выделить под считывание файла не получится.
    Для выделения массива динамически, через malloc, надо знать, сколько будет занято статическими переменными (наверняка, выровнено на какую-то "круглую" границу), сколько будет использовано в стеке (это просуммировать все локальные переменные и параметры на всю глубину вызовов, добавив 4-8 байт на каждый вызов для адреса возврата и прочего, нужного при вызове), сколько к моменту выделения памяти будет выделено в хипе.
    Для выделения массива как локальной переменной нужно знать, не налезет ли выросший стек на хип, для чего нужно знать все вышеперечисленное.
    Для выделения массива в статической области нужно быть уверенным, что ни при каких обстоятельствах хип и стек не вырастут настолько, чтобы встретиться в оставшемся после выделения статических переменных пространстве.
    При всем этом надо помнить, что используемые библиотеки тоже используют локальные переменные, вызовы функций и статические данные.
    Так что максимальный объем массива придется либо устанавливать экспериментально (например, выделить минимальный массив и посмотреть, какое расстояние будет между __brkval и указателем стека), либо заняться почти нереальными подсчетами.
     
    AlexVS нравится это.
  6. AlexVS

    AlexVS Гик

    Спасибо за развернутый ответ.
    Я пока что выделил 40 байт, считываю часть информации, обрабатываю, очищаю массив и дальше читаю содержимое файла.
    Если не сложно, подскажите как посмотреть "посмотреть, какое расстояние будет между __brkval и указателем стека"?
     
  7. AlexVS

    AlexVS Гик

    Про 1 Кб ОЗУ я знаю.
     
  8. NR55RU

    NR55RU Гик

    Вот тут есть небольшая статейка на эту тему. Как раз дающая ответ :)
     
  9. AlexVS

    AlexVS Гик

    NR55RU, спасибо.
     
  10. AlexVS

    AlexVS Гик

    По мере переноса тестового кода (работа с SD card) в рабочий проект я обнаружил, что скетч стал слишком большим :(
    Вот думаю как поступить: использовать 2560 или вынести сохранение/чтение данных на отдельную Pro Mini с подключенными SD шилд и nRF24, т.к. nRF24 все равно задействован на всех устройствах.
     
  11. geher

    geher Гуру

    Знакомая проблема. Мне тоже после подключения SD (на редкость прожорливая по памяти библиотека) пришлось решать эту проблему.
    Рассматривал те же варианты, сначала сделал две раздельные платы (получилось самостоятельное устройство, к которому можно присоединять внешний дополнительный модуль, расширяющий возможности).
    Но остановился в итоге на меге 2560. Размеры единого устройства на ее основе в результате получились больше, чем у двух раздельных устройств, вместе взятых, (Mega2560 + IoShield против Micro + Mini + плата коммутации), но зато с проводами возни оказалось существенно меньше, и появился резерв для дальнейшего расширения проекта как по памяти, так и по пинам.
     
  12. AlexVS

    AlexVS Гик

    Мне нужно собрать воедино: Arduino + Ethernet + nRF24 + SD.
    Сейчас все это удобно сочетается в iBoard. Есть конечно iBoard Pro, но дорогая она, и куда девать эту плату :(
     
  13. geher

    geher Гуру

    Тогда остается два варианта.
    1. Попытаться ужать код, выкидывая все, без чего можно обойтись (в том числе делая облегченные версии стандартных библиотек, выбрасывая неиспользуемые участки кода).
    2. Делать дополнительный модуль, на который вынести часть функционала, ту же SD карту, как предполагали. Правда SD слот на iBoard будет простаивать.