Какая платформа лучше подходит для отладки проблем с памятью Arduino: Linux или Windows?
Я разрабатываю продукт. Я разработал каждый модуль в прошивке по отдельности. Теперь я интегрирую их, но получаю проблемы с памятью. Я не могу увидеть, как память распределяется внутри MCU во время выполнения.
Может ли Linux помочь мне отлаживать проблемы лучше, используя свои команды, а не платформу Windows?
Заранее спасибо.
@bandejiya, 👍2
Обсуждение1 ответ
Операционная система не имеет значения. Если вы хотите отладить целевое устройство, вам нужен отладчик и среда отладки. Это означает правильный интерфейс аппаратного отладчика, а не последовательный порт USB Arduino, и правильная IDE, например Atmel Studio, а не Arduino IDE. Все они доступны как для Linux, так и для Windows.
Я разработал прошивку на Arduino IDE..! не потребуется ли гораздо больше усилий, чтобы изменить IDE..? пожалуйста, предложите какой-либо другой способ, если это возможно, для достижения MVP., @bandejiya
Arduino IDE очень легко программировать, но практически невозможно отлаживать. Лучшее, что вы можете сделать, это использовать Serial.print для отображения информации. Вы не можете выполнять настоящую отладку в среде Arduino. Это не профессиональный инструмент., @Majenko
- Вызов функций одного класса из другого класса — Обратный вызов
- Функция freeMemory() из библиотеки memoryfree не возвращает уменьшенное значение в arduino UNO
- Arduino записывает в память и автоматически выключается (через MOSFET)
- Библиотека MemoryFree, демонстрирующая нестандартное поведение..!
- C++ против языка Arduino?
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- ошибка: ожидаемое первичное выражение перед токеном ','
- Ввести идентификатор чипа ESP32 в строковую переменную (новичок в Arduino/C++)
Насколько я помню, Arduino IDE одинакова в Linux и Windows. Разве IDE не показывает, сколько памяти используется во время компиляции? Или вы используете динамическое выделение? (Вам следует отказаться от них в любом случае, если это возможно, из-за фрагментации кучи), @chrisl
IDE показывает мне 54% динамического выделения, оставляя 46% для стека. У меня нет трека для стека, где он рушится. Я отказался от calloc, malloc из-за фрагментации в куче. Моя программа работает хорошо в некоторых циклах, но через некоторое время она зависает. Я хочу отслеживать каждый байт памяти в каждой функции и указать, где происходит утечка памяти и программа зависает., @bandejiya
#include <MemoryFree.h>
Serial.println(freeMemory());
, @JurajПочему вы думаете, что у вас проблемы с памятью? Это может быть связано с несколькими причинами. Наиболее вероятной проблемой является запись за пределами буфера в стеке или функции, которая возвращает указатель на буфер, объявленный в этой функции в стеке., @Jot
46% оперативной памяти для стека вполне достаточно, если только вы не занимаетесь рекурсией или не выделяете много стековой памяти., @Edgar Bonet
@jot для некоторых циклов Мое устройство работает нормально, когда я вижу его в последовательном мониторе, но когда я делаю его автономным устройством, оно перестает пинговаться или устройство зависает через некоторое время. Каковы могут быть другие причины зависания программы, помимо проблем с памятью? Вы сказали, что запись за пределами буфера, но я проверил, у меня нет такой проблемы в коде, но, пожалуйста, назовите другие причины сбоя программы., @bandejiya
@EdgarBonet Я на самом деле делаю много стекового выделения в своей финальной структуре прошивки. На самом деле это незаменимо :( ., @bandejiya
@juraj спасибо за ваш добрый ответ. Я попробовал MemoryFree.h, но проблема в том, что эта библиотека немного глючит, например, while(1){Char c=0;Serial.println(freeMemory());} снова и снова объявляет переменную c в функции, которая должна уменьшать имеющуюся память стека, но она показывает то же значение., @bandejiya
Ваше «доказательство» того, что MemoryFree глючит, ошибочно. Повторное объявление переменной _не_ увеличивает использование памяти: компилятор не такой тупой, как вы, похоже, считаете., @Edgar Bonet
@bandejiya, по определению языка переменная существует до конца блока, поэтому в } она удаляется из стека. На самом деле компилятор оптимизирует ее и помещает в стек родительского блока., @Juraj
@Juraj: Компилятор никуда его не помещает: поскольку это неиспользуемая переменная, она оптимизируется., @Edgar Bonet
@EdgarBonet, правда. То, что я написал, было бы правдой, если бы это использовалось :-), @Juraj
Хм..! замечание принято к сведению. Спасибо всем большое..! :), @bandejiya
Я просто записал код, написанный ниже, но он показывает мне свободную память в размере 2267 байт. Пожалуйста, кто-нибудь, объясните, как в Atmega328pu может быть 2267 байт свободной памяти при общей емкости 2048 байт. Код такой: ----#include <MemoryFree.h> недействительная настройка() {Serial.begin(9600); Serial.println(freeMemory(), DEC);} пустой цикл() {}, @bandejiya