Чтение онлайн

на главную - закладки

Жанры

Программируем Arduino. Основы работы со скетчами
Шрифт:

В главе 2 рассказывалось, как запрограммировать микроконтроллер непосредственно через контакты ICSP на плате Arduino с применением аппаратных программаторов. Такой подход поможет сэкономить пару килобайт, так как не требует установки загрузчика.

Статическое и динамическое размещение в памяти

Если вы, подобно автору книги, имеете опыт разработки крупномасштабных систем на таких языках, как Java или C#, вам наверняка приходилось создавать объекты во время выполнения и позволять сборщику мусора освобождать занимаемую ими память без вашего участия. Этот подход к программированию

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

Ниже приводится пример объявления статического массива, как это обычно делается в скетчах:

// sketch_06_04_static

int array[100];

void setup

{

array[0] = 1;

array[50] = 2;

Serial.begin(9600);

Serial.println(array[50]);

}

void loop

{

}

Объем памяти, занимаемой массивом, известен уже на этапе компиляции скетча, поэтому компилятор может зарезервировать для массива необходимый объем памяти. Второй пример, приведенный ниже, также создает массив того же размера, но выделяет память для него во время выполнения из пула доступной памяти. Обратите внимание на то, что версии Arduino IDE ниже 1.0.4 не поддерживают malloc.

// sketch_06_03_dynamic

int *array;

void setup

{

array = (int *)malloc(sizeof(int) * 100);

array[0] = 1;

array[50] = 2;

Serial.begin(9600);

Serial.println(array[50]);

}

void loop

{

}

В начале скетча определяется переменная int *array. Символ * сообщает, что это указатель на целочисленное значение (или в данном случае массив целых чисел), а не простое значение. Объем памяти, занимаемой массивом, неизвестен, пока не будет выполнена следующая строка в функции setup:

array = (int *)malloc(sizeof(int) * 100);

Команда malloc (memory allocate — выделить память) выделяет память в области ОЗУ, которую называют кучей (heap). В качестве аргумента ей передается объем памяти в байтах, который следует выделить. Так как массив хранит 100 значений типа int, требуется выполнить некоторые расчеты, чтобы определить размер массива в байтах. В действительности можно было бы просто передать функции malloc число 200 в аргументе, потому что известно, что каждое значение типа int занимает 2 байта памяти, но использование функции sizeof гарантирует получение правильного числа в любом случае.

После выделения памяти массивом можно пользоваться точно так же, как если бы память для него была выделена статически. Динамическое распределение памяти позволяет отложить принятие решения о размере массива до фактического запуска скетча, и это единственное преимущество данного подхода.

Однако, используя прием динамического распределения памяти, легко оказаться в ситуации, когда память выделяется, но не освобождается, из-за чего скетч может быстро исчерпать имеющуюся память. Исчерпание памяти может вызвать зависание Arduino. Но если вся память выделяется статически, такого не происходит.

Обратите внимание на то, что даже мне, разработавшему не одну сотню проектов на Arduino, сложно найти вескую причину, оправдывающую

прием динамического выделения памяти в Arduino.

Строки

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

Многие программы для Arduino вообще не нуждаются в текстовом представлении данных или используют его только в командах Serial.println для нужд отладки.

В Arduino поддерживаются два основных метода использования строк: старый метод — массивы элементов типа char и новый метод с применением библиотеки String Object.

Массивы элементов типа char

Когда в скетче определяется строковая константа, такая как

char message[] = "Hello World";

создается статический массив элементов типа char, содержащий 12 символов. Именно 12, а не 11, по числу букв в строке «Hello World», потому что в конец добавляется заключительный нулевой символ (\0), отмечающий конец строки. Такое соглашение для строк символов, принятое в языке C, позволяет использовать массивы символов большего размера, чем предполагалось вначале (рис. 6.4). Каждая буква, цифра или другой символ имеет код, который называют значением ASCII.

Рис. 6.4. Массив элементов типа char в стиле языка C с завершающим нулевым символом

Обратите внимание на то, что часто используется немного иной синтаксис записи строковых констант:

char *message = "Hello World";

Этот синтаксис действует подобным образом, но определяет message как указатель на символ (первый символ в массиве).

Форматированный вывод строк несколькими командами print

Часто строки необходимы, только чтобы вывести сообщение на жидкокристаллический дисплей или в качестве параметра Serial.println. Многие могут подумать, что в основном требуется только возможность объединения строк и преобразования чисел в строки. Например, рассмотрим конкретную проблему — как на жидкокристаллическом дисплее отобразить сообщение «Temp: 32 C». Вы могли бы предположить, что для этого нужно объединить число 32 со строкой "Temp: " и затем добавить в конец строку " C". И действительно, программисты с опытом использования языка Java могли бы попытаться написать на C следующий код:

String text = "Temp: " + tempC + " C";

Увы, в C этот прием не работает. В данном случае сообщение можно вывести несколькими инструкциями print, как показано далее:

lcd.print("Temp: "); lcd.print(tempC); lcd.print(" C");

Этот подход устраняет необходимость закулисного копирования данных в процессе конкатенации (объединения) строк, как происходит в других современных языках.

Аналогичный подход с применением нескольких инструкций вывода можно использовать при работе с монитором последовательного порта и инструкциями Serial.print. В подобных случаях последней в строке обычно используется команда println, добавляющая в конец символ перевода строки.

Поделиться:
Популярные книги

Возвышение Меркурия. Книга 12

Кронос Александр
12. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 12

Кодекс Охотника. Книга XXIV

Винокуров Юрий
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV

Буря империи

Сай Ярослав
6. Медорфенов
Фантастика:
аниме
фэнтези
фантастика: прочее
эпическая фантастика
5.00
рейтинг книги
Буря империи

Месть за измену

Кофф Натализа
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Месть за измену

Деспот

Шагаева Наталья
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Деспот

Осознание. Пятый пояс

Игнатов Михаил Павлович
14. Путь
Фантастика:
героическая фантастика
5.00
рейтинг книги
Осознание. Пятый пояс

Тринадцатый VII

NikL
7. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VII

Эра мангуста. Том 4

Третьяков Андрей
4. Рос: Мангуст
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эра мангуста. Том 4

Ветер перемен

Ланцов Михаил Алексеевич
5. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ветер перемен

Приручитель женщин-монстров. Том 11

Дорничев Дмитрий
11. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 11

На границе империй. Том 7

INDIGO
7. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
6.75
рейтинг книги
На границе империй. Том 7

Прометей: владыка моря

Рави Ивар
5. Прометей
Фантастика:
фэнтези
5.97
рейтинг книги
Прометей: владыка моря

Бракованная невеста. Академия драконов

Милославская Анастасия
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Бракованная невеста. Академия драконов

Кодекс Охотника. Книга XXII

Винокуров Юрий
22. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXII