Какая платформа лучше подходит для отладки проблем с памятью Arduino: Linux или Windows?

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

Может ли Linux помочь мне отлаживать проблемы лучше, используя свои команды, а не платформу Windows?

Заранее спасибо.

, 👍2

Обсуждение

Насколько я помню, 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


1 ответ


2

Операционная система не имеет значения. Если вы хотите отладить целевое устройство, вам нужен отладчик и среда отладки. Это означает правильный интерфейс аппаратного отладчика, а не последовательный порт USB Arduino, и правильная IDE, например Atmel Studio, а не Arduino IDE. Все они доступны как для Linux, так и для Windows.

,

Я разработал прошивку на Arduino IDE..! не потребуется ли гораздо больше усилий, чтобы изменить IDE..? пожалуйста, предложите какой-либо другой способ, если это возможно, для достижения MVP., @bandejiya

Arduino IDE очень легко программировать, но практически невозможно отлаживать. Лучшее, что вы можете сделать, это использовать Serial.print для отображения информации. Вы не можете выполнять настоящую отладку в среде Arduino. Это не профессиональный инструмент., @Majenko