05.04.2009

+1К свободной памяти для Arduino

Как известно, в Arduino используется bootloader - специальная подпрограмма, которая постоянно находится в самом конце памяти программ. После сброса она получает управление и через последовательный интерфейс (SPI, пины Rx и Tx) зашивает новую микропрограмму (sketch) в верхние адреса памяти, а затем и вовсе отдает ей управление.

Строго говоря, bootloader необязателен. В готовом изделии можно одним легким движением поставить FUSE-бит BOOTRST в 1, и управление после сброса будет передаваться непосредственно программе, по адресу 0x0000 (именно так я и сделал с ATmega в светодиодном индикаторе).

Испокон веков ;) размер bootloader-а Arduino был 2048. Конечно, реально-то он был чуть меньше, но размер bootloader-а кодируется двумя FUSE-битами BOOTSZ1 и BOOTSZ0. Таким образом, для ATmega168P есть четыре фиксированных размера: 256, 512, 1024 и 2048 байт. Для ATmega328P тоже четыре размера, но поскольку памяти программ у него в два раза больше, то разработчики чипа "сдвинули" размеры bootloader-а в сторону увеличения: 512, 1024, 2048, 4096.

Те, кто писал программы на ассемблере, обычно загадочно улыбаются в ответ на мою фразу "скетч занял пять килобайт в памяти программ". Оно и понятно - при программировании на C память программ съедается стремительно, зато и сама программа пишется значительно быстрее. Именно поэтому ATmega328P заменил на боевом посту ATmega168 - в некоторых случаях просто не хватало 16К памяти программ.

Стоп-стоп, не 16, а 14-ти ( минус 2К на бутлоадер ). После замены процессора становится свободно 30К:



Но что делать, если скетч занял 30936 байт? Переходить на ассемблер?

Старшие товарищи давно бились над задачей сокращения размера bootloader-а хотя бы до 1К. Совместными усилиями они этого достигли, о чем и написал в своем блоге уважаемый Spiff. Последовательность действий такая:
  1. Берется новый исходник bootloader-а, компиляется в .hex
  2. Результат зашивается в память ATmega, корректируются fuse-биты
  3. Чтобы ArduinoIDE поняла, что у нее стало больше памяти для результата компиляции, правится boards.txt.
Результаты компиляции можно взять у Spiff-а в блоге, но есть одна беда - он выложил неправильно скомпилированные результаты. Я неделю некоторое время помучился с его .hex-файлом, пока не принял решение "чисто на всякий случай" перекомпилять. Помогло!

Итак, вот мой результат компиляции: bootloader_1k_0015.zip. Его надо распаковать в каталог с Arduino IDE 0015, при этом изменятся две секции в списке плат, станет так: "Arduino Duemilanove w/ ATmega 328P 1k" и "Arduino Diecemila or Duemilanove w/ ATmega 168 1K". Выбирайте нужную, затем можно прошить новый bootloader через Arduino IDE, дальше - как обычно.

Сами понимаете, что если прошить 1К-bootloader, то даже немодифицированная Arduino IDE будет замечательно работать, но не наоборот :(

Более правильно было бы добавить секции, но тогда Arduino IDE не сможет корректно отобразить в своем окне информацию об ошибках, сославшись на длинную цепочку исключений java - согласитесь, это не очень удобно.

Я скомпилировал bootloader-ы для тех процессоров, для которых смог 100%-но убедиться в работоспособности - с трудом, но нашел таки ATmega168P :) Во всех моих Arduino сейчас работает ATmega328P - выписал целую упаковку из-за границы, и, как всегда, раздаю остатки через "молоток"...

5 комментариев:

  1. на mouser.com по 4.30, правда доставка дорогая... но если брать 25 штук, (цена по 3.30) то доставка окупиться.

    ОтветитьУдалить
  2. нет, не окупится.

    цена за 25 штук - 117 USD, доставка - 120 USD.

    получается по 9,48.

    ОтветитьУдалить
  3. 3,30*25=82.50 откуда 117?
    От маузера доставка 120$ -- это fedex и ups. Eсть варианты когда гораздо дешевле... :-) например, можно написать им пиьмо и вышлют USPSом без страховок в bubble envelop без всяких проблем. Пробовал, работает. Обойдется примерно в 20-30. Второй вариант, это через местных. Мне например доставка обходится в 7-10 долларов. До 40 унций -- обычное письмо. до Украины -- в пределах 20-25. так что все возможно. Если еще и оказия отсюда -- то совсем дешево получается.
    PS Зря книгу потер...

    ОтветитьУдалить
  4. Ну, ясно дело, что с оказией и/или через местных дешевле.

    Письмо писать им не пробовал, спасибо за идею. Основная проблема - вычислить вес посылки, чтобы стала понятна ее стоимость по международным тарифам.

    Ссылку на книгу я потер, чтобы ко мне не было вопросов от правообладателей. А скачать её можно в любом крупном англоязычном торренте (те же пираты), причем без всяких паролей. Сокращенная версия книги - вообще халявная ;)

    ОтветитьУдалить
  5. Письма писать следует всегда. Даже если у них написана Россия, они могут не знать как туда отправить. И еще очень многие торгуют через e-bay, там свои нюансы, но чаще всего получается договориться.

    ОтветитьУдалить