Столкнулся со странной проблемой в Arduino. Как будто какой-то баг с памятью. Если использую больше 2-3 кб памяти под данные, то ардуина виснет или начинает вести себя некорректно. Вот пример тестовой проги, которая заполняет массив числами. А потом проверяет то, что записалось и выводит в последовательный порт "good" или "bad". При размере массива, заданном в AR_SIZE меньше 1000, всё окей. Если больше, то ардуина просто молчит (зависает) или посылает в последовательный порт левые символы (отображаются как квадратики). Я сперва думал, что мне попалась бракованная Arduino Nano 328P. Попробовал другую из того же заказа — так же. Попробовал купленную год назад Pro Mini — то же самое. Значит дело не в ардуине, а в IDE или в компиляторе, или в каких-то настройках.

Комментарии: 42

  1. 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 и после.... в общем - не надо так

  2. Sergy

    у 328 всего 2 кб озу, там стек, куча

  3. Serg

    Что за задача то такая? Весь мозг сломал чтоб понять:)

    • Pavel

      Да это просто тест памяти. Я сперва подумал, что у меня память битая, или что она меньше, чем должна быть. Типа знаете как китайцы продают флешки, которые искусственно отформатированы на большой объём и показывают, что они, к примеру, на 32 Гб, а по факту там 8 Гб, и когда записываешь больше, чем 8 Гб, то начинают стираться более ранние данные. У меня было подозрение, что происходит что-то типа такого. Вот и сделал тест, который записывает в массив последовательность значений, а потом проверяет, что там именно то, что должно было быть. Потому что у меня при записывании сверх какого-то порога, начинала портиться область кода программы.

      • Bulochka

        флешки эти не отформатированы, а чип так прошит - можно исправить сервисными утилитами под необходимый размер.... а мысль про обрезанную память МК весёлая, да))

      • Serg

        Ясно :)

Не нашли ответ?

Вам также может быть интересно