Я использую слишком много оперативной памяти. Как это можно измерить?

Я хотел бы узнать, сколько оперативной памяти я использую в своем проекте, насколько я могу судить, на самом деле нет способа это вычислить (кроме как пройтись и посчитать самому). Я дошел до стадии в довольно большом проекте, когда я определил, что у меня заканчивается оперативная память.

Я определил это, потому что я могу добавить раздел, а затем все начнется где-то еще в моем коде без видимой причины. Если я #ifndef что-то еще, это снова заработает. В новом коде нет ничего программно неправильного.

Я подозревал некоторое время, что я приближаюсь к концу доступной оперативной памяти. Я не думаю, что я использую слишком много стека (хотя это возможно), как лучше всего определить, сколько оперативной памяти я фактически использую?

Просматривая и пытаясь разобраться, у меня возникают проблемы, когда я дохожу до перечислений и структур; сколько памяти они занимают?

первое редактирование: КРОМЕ ТОГО, я так много редактировал свой набросок с тех пор, как начал, что это не те результаты, которые я получил изначально, но это то, что я получаю сейчас.

  text     data     bss     dec     hex filename
 17554      844     449   18847    499f HA15_20140317w.cpp.elf
 16316      694     409   17419    440b HA15_20140317w.cpp.elf
 17346      790     426   18562    4882 HA15_20140317w.cpp.elf

Первая строка (с текстом 17554) не работала, после долгого редактирования вторая строка (с текстом 16316) работает как надо.

редактирование: в третьей строке все работает, последовательное чтение, мои новые функции и т. д. По сути, я удалил некоторые глобальные переменные и дублирующий код. Я упоминаю об этом, потому что (как и предполагалось) речь идет не об этом коде как таковом, а об использовании оперативной памяти. Что возвращает меня к изначальному вопросу: «как лучше всего это измерить». Я все еще проверяю некоторые ответы, спасибо.

Как мне на самом деле интерпретировать приведенную выше информацию?

На данный момент я понимаю так:

`TEXT` is program instruction memory
`DATA` is variables (unitialised?) in program memory
`BSS`  is variables occupying RAM

поскольку BSS значительно меньше 1024 байт, почему второй работает, а первый нет? Если это DATA+BSS, то оба занимают больше 1024.

повторное редактирование: я отредактировал вопрос, включив код, но теперь я удалил его, потому что он на самом деле не имел никакого отношения к проблеме (кроме, может быть, плохой практики кодирования, объявления переменных и т. п.). Вы можете просмотреть код, просмотрев правки, если вы действительно хотите его увидеть. Я хотел вернуться к вопросу, который был больше основан на: Как измерить использование оперативной памяти.

, 👍20

Обсуждение

Я подумал, что стоит добавить: за последние несколько недель я добавил несколько новых разделов кода, затем оптимизировал его до тех пор, пока он не заработал, но теперь я добавил только полдюжины байтовых переменных, и все... :(, @Madivad

Используете ли вы тип String в своих программах? Известно, что он часто выполняет динамическое выделение и освобождение памяти, что может фрагментировать кучу до такой степени, что у вас может не остаться памяти., @jfpoilpret

@jfpoilpret Я избегаю String из-за накладных расходов. Мне нравится работать с массивами символов, но я почти всегда определяю все свои массивы символов с фиксированным размером (на данный момент у меня есть ОДИН байтовый массив, который не является чисто потому, что я меняю длину содержимого для разных перекомпиляций)., @Madivad

Размещение вашего кода здесь (или на pastebin, если он слишком большой) может помочь выяснить, с какими проблемами с памятью вы столкнулись., @jfpoilpret

@jfpoilpret Я не могу выложить код, он огромный и, к сожалению, очень раздутый, разбросан по 16 файлам. Это был проект, которому я позволил разрастись намного больше, чем требовалось (это несколько проектов, объединенных вместе). Сейчас я начинаю разбивать его на части, что, я уверен, поможет решить проблему. Хотя есть некоторые части, на которые мне нужно, чтобы люди посмотрели (или дали мне указания), я выложу их позже., @Madivad

может быть, вы могли бы просто разместить раздел, который вы удалили с #ifndef, это могло бы дать нам подсказки; еще один момент: вы не упомянули, какой Arduino вы используете. Список используемых вами библиотек также может быть полезен. Наконец, вывод, выдаваемый avrdude, как правило (работает на Windows), включает размер статических данных, что может очень помочь., @jfpoilpret

Хотя ваш вопрос, похоже, связан с потреблением памяти во время выполнения, вы хотели бы рассмотреть возможность использования серии 1.5.x Arduino IDE: она сообщает объем «статической» оперативной памяти, используемой скетчем (объявления переменных), сразу после компиляции. Это не будет точным, если ваш код использует malloc, но это начало., @Federico Fissore

Да, хорошо, я скоро отредактирую, чтобы включить немного кода. Я сделал так много изменений и сокращений с прошлой ночи, удаляя и настраивая вещи и просматривая выходные данные avr-size и avr-objdump. Я выложу код, который сломал верблюдов, @Madivad

Я просто подумал, что стоит добавить, я не думаю, что в коде выше есть что-то изначально неправильное, на самом деле, если я уберу другие сегменты кода, то код выше будет работать так, как и ожидалось. На самом деле, сам этот код ВСЕГДА работает так, как и ожидалось. Он ЛОМАЕТСЯ в другом месте кода (по сути, он нарушает прием последовательной связи)., @Madivad

Что касается вашего замечания о bss и data: data — это инициализированные глобальные данные, которые изначально находятся во Flash и копируются в SRAM при запуске программы; bss — это неинициализированные глобальные данные, которые существуют только в SRAM. Следовательно, оба используют SRAM в целом. То, что остается в SRAM, предназначено для стека и кучи., @jfpoilpret

Означает ли это, что используемая SRAM, находящаяся в эксплуатации, будет эквивалентна как минимум .bss PLUS .data? Или есть некоторое совпадение?, @Madivad

Это ПЛЮС, нет совпадений (к счастью, я бы добавил!), @jfpoilpret


1 ответ


1

Существует программа под названием Arduino Builder, которая обеспечивает наглядную визуализацию объема флэш-памяти, SRAM и EEPROM, используемого вашей программой.

Arduino Builder

Arduino builder является частью решения CodeBlocks Arduino IDE. Его можно использовать как отдельную программу или через CodeBlocks Arduino IDE.

К сожалению, Arduino Builder немного устарел, но он должен работать для большинства программ и большинства Arduino, таких как Uno.

,