Столкнулся со странной проблемой в Arduino. Как будто какой-то баг с памятью. Если использую больше 2-3 кб памяти под данные, то ардуина виснет или начинает вести себя некорректно. Вот пример тестовой проги, которая заполняет массив числами. А потом проверяет то, что записалось и выводит в последовательный порт "good" или "bad". При размере массива, заданном в AR_SIZE меньше 1000, всё окей. Если больше, то ардуина просто молчит (зависает) или посылает в последовательный порт левые символы (отображаются как квадратики). Я сперва думал, что мне попалась бракованная Arduino Nano 328P. Попробовал другую из того же заказа — так же. Попробовал купленную год назад Pro Mini — то же самое. Значит дело не в ардуине, а в IDE или в компиляторе, или в каких-то настройках.
Комментарии: 42
Anonim
проблемы с массивами, индексы проверяй
Pavel
Поясните пожалуйста?
Anonim
сегфолта на ардуине не бывает, у тебя просто начнет глючить ардуина, весело потирая данные в неожиданных местах. Проверяй индексы, что и куда ты пишешь
Pavel
Ну, исходный код видите? Какие там индексы? Просто цикл от 0 до AR_SIZE-1. Что тут может быть не так?
Anonim
размер озу
Pavel
32 Кб вроде на Arduino
Anonim
озу?) 2кб
Th0r
прогмем и оперативка - разные вещи
Pavel
Да, похоже вы правы
Sergy
если нужно много озу, берите esp32 или stm32 (f401, например)
Pavel
Точно, спасибо большое за помощь.
Anonim
1кб еепром еще есть
Pavel
Я че-то думал озу побольше. Всё, разобрался. Я просто делал простую поделку, состоящую из зуммера и кнопки. При нажатии кнопки зуммер пищит. Можно кнопкой набрать какое-то послание азбукой морзе или ритм. А ардуина запоминает последовательность нажатий и длительности, и потом, если 2 секунды не было нажатий на кнопку, то воспроизводит записанную последовательность писков.
Anonim
возьми внешнюю память и записывай туда
Sergy
spi psram
Anonim
2кб это овердохрена для такой простой задачи
Sergy
но надо будет научиться пользоваться
Pavel
Да, но я сделал не очень оптимально, а по-простому. Просто каждые 0.01 сек записывал есть сигнал или нет. Поэтому память довольно быстро кончалась. :)
Anonim
Простые вещи делать сложно Гораздо проще переусложнить В твоем случае подойдет формат записи типа миди, хранишь высоту звука и длительность.
Bulochka
если цикл отсекать по определенному таймауту, например не более 5с - проблем будет меньше.... а если начинать запись по задающей команде - и того меньше
Sergy
1. тогда можно ставить тип не int, а byte уже в два раза выигрыш по памяти 2. можно записывать время сигнала и паузы
Anonim
высота звука равная 0 это и есть пауза
Sergy
какая высота звука? у него там кнопка, два состояния
Bulochka
для длительности byte будет сложно применить) ну и он собственно так и делал, просто ногой и с помощью квантового телепортатора))
Anonim
>клавиатура Один канал - два массива с длительностью и высотой звука. Два канала - четыре массива и т. д.
Pavel
Я потом переделаю на массив из структур, в которой одно поле длительность, а другое состояние вкл или выкл. Хотя, сейчас подумал, состояния же будут чередоваться. Начинаться всегда будет с вкл. Им же и заканчиваться. Так что можно хранить просто массив длительностей.
Anonim
с одной нотой?)
Pavel
Да, у меня же зуммер, он только одной тональности писк воспроизводит
Anonim
ок
Pavel
Кстати, а int в arduino 16 или 32 бита? Вроде 32, но как тогда у меня получилось записать массив из почти 1000 int'ов? Или 32 это long?
Anonim
есть активные, а есть пассивные генераторы звука, я не понял сразу, что у тебя активный
Sergy
плюс размерность ещё привести по 1мс может быть слишком избыточно, может быть 5мс или даже 10 или 25 мс
Pavel
Ну, у меня сейчас 10 мс. Этого хватает. На слух не слышно разницы. Вот на 100 мс была разница очень заметная.
Pavel
Да, вы абсолютно правы. И да, в коде именно того скетча я использовал массив bool, он как раз 1 байт. А о том, что можно хранить более оптимально я подумал только сейчас.
Sergy
да, bool 1 байт можно обыграть и ужать как-то, что бы побитно писать в byte и тогда ещё больше будет
Sergy
Вот выше пример, что всё же надо знать тонкости системы =) флеши
Bulochka
не надо делать такие массивы, это достаточно известный баг\фича, который ведёт себя примерно как тангенс на отрезке 89..90, т.е. до 1000 и после.... в общем - не надо так
Sergy
у 328 всего 2 кб озу, там стек, куча
Serg
Что за задача то такая? Весь мозг сломал чтоб понять:)
Pavel
Да это просто тест памяти. Я сперва подумал, что у меня память битая, или что она меньше, чем должна быть. Типа знаете как китайцы продают флешки, которые искусственно отформатированы на большой объём и показывают, что они, к примеру, на 32 Гб, а по факту там 8 Гб, и когда записываешь больше, чем 8 Гб, то начинают стираться более ранние данные. У меня было подозрение, что происходит что-то типа такого. Вот и сделал тест, который записывает в массив последовательность значений, а потом проверяет, что там именно то, что должно было быть. Потому что у меня при записывании сверх какого-то порога, начинала портиться область кода программы.
Bulochka
флешки эти не отформатированы, а чип так прошит - можно исправить сервисными утилитами под необходимый размер.... а мысль про обрезанную память МК весёлая, да))
Serg
Ясно :)