Как расширить память программы на arduino?

Иногда у меня заканчивается пространство размером программы для встроенной программы на языке Си, которую я хочу разместить на arduino. Итак, какой чип мне нужен для расширения программной памяти arduino, чтобы я мог использовать более крупные программы на C с моим arduino?

, 👍10

Обсуждение

Учитывая, что [парень по имени Петри Хаккинен](https://plus.google.com/100797925989882885975) поставьте [игру в аркадном стиле](http://www.gammon.com.au/forum/?id=12623) на ATmega328P, может быть, вам стоит подумать об экономии места в вашем коде? Если это непрактично, как говорится в некоторых ответах, вы можете получить чип большего размера с большим количеством программной памяти. Например, Atmega644, помимо прочего, поставляется в корпусе с чипом DIP., @Nick Gammon

См. также https://forum.arduino.cc/index.php?topic=226465.0, @Mikael Patel

не могли бы вы, пожалуйста, объяснить немного подробнее свой ответ ? 2) Arduino имеет SPI, поэтому можно получить доступ к SD-карте. Любой код на SD-карте необходимо будет загрузить в исполняемую память. Это сложно и не для начинающих... Вы имеете в виду, что вы можете изменить или перепрограммировать память команд во время работы программы ? Может ли запущенная программа вызвать загрузчик и загрузить новые инструкции по другим адресам ? Не состарит ли это память программы ? Другим решением может быть идентификация рутинов в вашей программе и всех "вызовов", хранящихся с данными во внешней памяти spi... Спасибо!, @DiegoJR


5 ответов


Лучший ответ:

12

ATmega2560-это чип, который нужно добавить для увеличения объема памяти, когда у вас заканчивается программная память в Uno. Ссылка на страницу памяти по адресу arduino.cc, вы увидите, что у него Flash=256 КБ, SRAM=8 КБ, EEPROM=4 КБ, где чип ATmega328 на Uno имеет Flash=32 КБ, SRAM=2 КБ, EEPROM=1 КБ.

Когда в Uno заканчивается программная память, у вас есть три практических варианта: уменьшить размер программы; удалить загрузчик (чтобы освободить один или два КБ); использовать другую плату с более мощным процессором. Процессор на плате Uno не имеет возможности получить доступ к байтам программы из других мест, кроме встроенной флэш-памяти 32 КБ. Процессор на плате Mega2560 запускается с 8-кратным объемом флэш-памяти, поэтому он может содержать больше программ, чем Uno.

Если вы удалите загрузчик, вы можете вместо этого программировать с помощью платы USBASP, как описано в “Запрограммируйте чип AVR с помощью USBASP с 10-контактным кабелем” статья на learningaboutelectronics.com.

,

но если вы освободите загрузчик, то как я буду использовать arduino IDE для программирования?, @qwerty10

@qwerty10, см. Последний абзац правки. Arduino IDE поддерживает USBASP ok., @James Waldby - jwpat7

Разве это не сработало бы с любым программистом, который может загружать код в ATMEGA? Вместо того, чтобы только USBASP. Насколько я понимаю, на самом деле используется не 10 контактов, а подмножество этих контактов., @qwerty10

@qwerty10, USPASP-программист интернет-провайдера (в области системного программирования). Как правило, для программирования чипа можно использовать любой программатор ISP (с загрузчиком или без него), если на целевом чипе доступны контакты MOSI, MISO, SCK, RST, VCC и GND., @James Waldby - jwpat7

В настоящее время Unos использует очень компактный загрузчик optiboot. Удаление этого файла освободит только 512 байт., @Edgar Bonet

@qwerty10: Существуют версии USBASP с 6-контактным разъемом. 10 - контактный разъем имеет 4 резервных контакта., @Edgar Bonet

@Эдгар Бонет . У меня есть еще один вопрос, Эдгар. Если я выну чип atmega 328 из его гнезда на Uno и заменю его на использование atmega8-16PU вместо этого, и я запишу этот загрузчик объемом 512 байт-означает ли это, что я могу использовать arduino Uno с atmega8, как atmaga328 (но с подмножеством функций 328). Atmega8, конечно, является более старым чипом, чем 328, но у него все еще те же выводы., @qwerty10

@qwerty10: Я совершенно уверен, что это должно работать на физическом уровне. Однако на программном уровне вам придется убедить Arduino IDE хорошо работать с ним. Вы можете попытаться сообщить IDE, что ваша плата на самом деле является “Arduino NG или старше с ATmega8”., @Edgar Bonet

@Эдгар Бонет. Итак, использование его в качестве Arduino NG с чипом atmeg8 означает ли это, что загрузчик установит предохранители на atmega8 arduino для использования кристалла на печатной плате arduino? Или загрузчик устанавливает предохранители на atmega8 arduino для использования его внутреннего генератора? Эта информация о часах должна быть известна для перехода от прототипа arduino к постоянной версии схемы на печатной плате. Сколько памяти осталось после записи загрузчика в atmega8-это 7,5 КБ вместо 8 КБ?, @qwerty10

@qwerty10: Вы очень далеко отклонились от своего первоначального вопроса. Это действительно должен быть новый вопрос., @Edgar Bonet

@Эдгар Бонет. Я бы предположил, что ответ таков, потому что он выводит для подмножества выводов atmega328 (т. Е. Контакты 328 могут быть такими же, как mega8) платы uno, следовательно, для этого потребуются кристалл и конденсаторы., @qwerty10


7

Другой способ (кроме MCU с большим объемом памяти) - не использовать платформу Arduino и ее библиотеки. Такой уровень абстракции дорог в обоих отношениях - использование памяти и скорость. Но это гораздо более сложный путь. Если вам нужна какая-то библиотека, вы должны перенести ее (если вы не нашли родную) или, по крайней мере, предоставить необходимые функции из Arduino.

Например, в Arduino IDE 1.6.11 пустой скетч использует до 444 байт флэш-памяти. Использование одного PIN-кода и digitalWrite(13, ! digitalRead(13)); + delay(500); означает 964 байта. Конечно, это, скорее всего, одноразовые. Если вы используете еще шесть контактов и переключаете его, он использует гораздо меньше памяти программы, чем при использовании первого (1192B). Но он все равно растет очень быстро.

В чистом языке Си пустая программа имеет длину около 134 байт. Та же функциональность (переключение одного вывода каждые 500 мс) занимает 158 байт (и это намного быстрее).

Но для хобби-проекта я бы выбрал ATmega2560 или ATmega644/1284 вместо этого.

И вы также можете использовать прямой доступ к оборудованию. Переключите скетч pin с использованием регистров напрямую, а _delay_ms из библиотек avr использует 468 байт вместо 964B. С задержкой от библиотек ядра Arduino это 602B.

,

Вы имеете в виду " _delay_ms ()"., @Edgar Bonet

Это дает дополнительное преимущество в том, что вы на самом деле изучаете используемый вами микроконтроллер. AVR на этих Ардуино гораздо более мощные, чем можно было бы предположить в "стандартной библиотеке". ++, @RubberDuck


2

А как насчет raspberry pi zero? У меня есть пара, и я довольно часто использую их в качестве ардуино.

,

Действительно, следует рассмотреть другие архитектуры, но встроенная система Linux *с обязательной загрузкой SD-карты*, такая как pi, добавляет много сложности и является хрупкой уникальными способами, даже если не дороже. Существует множество плат, основанных на небольших, более интегрированных микроконтроллерах ARM, которые гораздо больше похожи на Arduino с точки зрения приложений, но при этом значительно более способны. Но если вам нужно много обработки или мегабайт памяти, то да, эти сложности начинают стоить того., @Chris Stratton

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


2

Вы также можете изучить другие платформы. Например, Teensy 3.2 совместим с Arduino и имеет 2 КБ eeprom и 64 КБ оперативной памяти.

,

3

Задавая широкий вопрос, полезно включить некоторые детали. Например, сколько вам нужно памяти и почему вы думаете, что она вам нужна.

Однажды я указал процессор с программным пространством 2 КБ, 64 байтами оперативной памяти и 1 КИП. Инженер спросил: "MIPS?", и я объяснил тысячи в секунду. Он ответил: "Они не приходят так медленно". В конце проекта был добавлен огромный пользовательский интерфейс, и память стала жесткой... но это все равно подходило без проблем.

Поэтому подумайте о том, чтобы быть более внимательным к используемым ресурсам.

Чтобы ответить на вопрос:

  1. Arduino не предоставляет удобную шину для передачи памяти. Таким образом, нет никакого способа подключить чип, чтобы получить больше памяти.

  2. У Arduino есть SPI, поэтому можно получить доступ к SD-карте. Любой код на SD - карте должен быть загружен в исполняемую память. Это сложно и не для начинающих...

  3. Как и предлагалось, подтяните свой код. Это, вероятно, хороший способ учиться.

  4. Перейдите к более крупному Arduino.

Существуют разные процессоры Arduino. Некоторые из линии ACR, другие из линии ARM. Переход на другое устройство в том же семействе является относительно скромным изменением и может обеспечить до 368 байт программной ФЛЭШ-памяти. Но это не совсем платы для Arduino.

Устройства на базе Arduino ARM очень разные и используют разные библиотеки.

Проверьте Arduino Mega 2560, он очень похож на Uno, имеет схожий размер, код должен переноситься относительно легко и стоит недорого.

В семействе AVR также есть устройства большего размера.

Обратите внимание, что AVR32-это другой процессор, а периферийные устройства настолько разные, что это другое устройство.

Если вы хотите проникнуть в очень большие программы (гигабайты памяти), ознакомьтесь с платой Beagleboard. Он имеет полный linux, с виртуальной памятью (см. № 2 выше) и имеет более мощные механизмы ввода-вывода.

,

Возможно, исправите некоторые опечатки, такие как Wen, 3 и другие, @James Waldby - jwpat7

Я имею в виду, что если вы исправите эти опечатки, кто-нибудь может проголосовать за ваш ответ..., @James Waldby - jwpat7