3. Технология программирования микроконтроллеров
3.1.1. Программа микроконтроллера –это последовательность команд, каждая из которых представлена в программной памяти одним, двумя или тремя восьмиразрядными двоичными числами, первое из которых–это код операции, а второе и третье число–это либо абсолютный адрес операнда (номер ячейки памяти в которой находится операнд), либо относительный адрес (смещение относительно базового адреса), либо значение константы. В принципе, если знать архитектуру микроконтроллера, иметь алгоритм решаемой задачи и технические средства для записи двоичных чисел в программную память, то микроконтроллер можно запрограммировать, пользуясь только лишь списком машинных кодов команд. Однако, такая технология очень редко применяется на практике, вследствие чрезвычайно высокой трудоемкости программирования на уровне машинных кодов, а также из-за неудобной для человека формы представления результатов работы, что затрудняет поиск и исправление ошибок в программе.
3.1.2. Для повышения производительности и качества программирования микроконтроллеров на уровне системы команд широко используется язык ассемблера, который позволяет сделать исходный текст программы более наглядным и понятным для программиста, чем колонка двоичных чисел. Принципиальное отличие языка ассемблера от всех других языков программирования состоит в том, что этот язык оперирует только командами, которые непосредственно распознает центральный процессор микроконтроллера. По исходному тексту программы, написанной на языке ассемблера, всегда можно определить время ее исполнения и объем программной памяти, необходимый для хранения программы, так как точно известны длина (количество байтов) и время выполнения каждой команды.
Кроме языка ассемблера опытные разработчики применяют языки программирования высокого уровня (например, С51 и PL/M51), которые в данном учебном пособии не рассматриваются. Это сделано по двум причинам. Во-первых, учебное пособие является узко специализированным, и в число его задач не входит повышение эрудиции читателей в вопросах выбора языка программирования. Во-вторых, по мнению автора, для начинающих разработчиков программирование на языке ассемблера значительно полезнее, чем на языках высокого уровня, поскольку дает возможность лучше изучить архитектуру микроконтроллеров.
3.1.3. В настоящее время широко применяются технологии программирования микроконтроллеров с помощью персональных компьютеров, позволяющих автоматизировать многие трудоемкие процессы. Ниже рассмотрена одна из компьютерных технологий программирования, при использовании которой разработка программы состоит из следующих основных этапов (рис. 3.1):
2) разработка исходных текстов всех модулей программы с помощью текстового редактора,
3) трансляция исходных текстов модулей программы в объектные модули с помощью программы-транслятора,
4) компоновка объектных модулей вместе с библиотечными модулями в единый загрузочный модуль,
5) отладка программы с помощью эмулятора ПЗУ,
6) запись отлаженной программы в ПЗУ или внутреннюю программную память микроконтроллера с помощью программатора.
Для выполнения перечисленных выше работ достаточно иметь следующие аппаратные и программные средства:
- любой IBM-совместимый персональный компьютер с операционной системойMSDOSверсии 3.30 или более поздней,
- эмулятор ПЗУ,
- программатор ПЗУ,
- текстовый редактор,
- транслятор,
- компоновщик.
Технология программирования, описанная в учебном пособии, не является единственно возможной, однако именно она рекомендуется начинающим разработ-чикам микропроцессорных систем, поскольку эта технология очень проста и не требует дорогостоящих программно-аппаратных средств. Рис. 3.1. Алгоритм программирования МК 3.1.4. Декомпозицией(decomposition) называется разбиение программы на модули (или другие структурные единицы), которые в дальнейшем будут разрабатываться параллельно. Этот этап работы не автоматизирован. Он выполняется на основе общего алгоритма функционирования микропроцессорной системы. Один из модулей программы является главным (в нем содержится программа, запускаемая при сбросе микроконтроллера), а остальные модули обеспечивают работу главного модуля (в них содержатся подпрограммы, которые могут вызываться как из главного, так и из других модулей программы). На этапе декомпозиции разрабатывается структурная схема программы, показывающая взаимосвязи отдельных модулей, а также производится распределение адресного пространства памяти данных между модулями.
Микроконтроллеры Процессоры, проекты, программирование
Языки программирования микроконтроллеров по своей структуре мало отличаются от классических языков для компьютеров. Единственным отличием становится ориентированность на работу со встроенными периферийными устройствами. Архитектура микроконтроллеров требует, например, наличия битово-ориентированных команд. Последние позволяют выполнять работу с отдельными линиями портов ввода/вывода или флагами регистров. Подобные команды отсутствуют в большинстве крупных архитектур. Даже ядро ARM, активно применяемое в микроконтроллерах, не содержит битовых команд, вследствие чего разработчикам пришлось создавать специальные методы битового доступа.
Ассемблер
Ассемблер является языком самого низкого уровня. При этом он позволяет наиболее полно раскрыть все возможности микроконтроллеров и получить максимальное быстродействие и компактный код. В некоторых случаях альтернативы ассемблеру нет, но тем не менее он имеет множество недостатков. Несмотря на получаемую компактность машинного кода, программа, написанная на языке Ассемблер, громоздка и труднопонимаема. Для ее создания требуется отличное знание архитектуры и системы команд микроконтроллеров.
Ассемблер отлично подходит для программирования микроконтроллеров, имеющих ограниченные ресурсы, например 8-ми битных моделей с малым объемом памяти. Для больших программ и тем более 32-разрядных контроллеров, лучше использовать другие языки, отличающиеся более высоким уровнем. Это позволит создавать более сложные и при этом понятные программы.
С/С++
Язык программирования С/С++, относится к языкам более высокого уровня, по сравнению с Ассемблером. Программа на этом языке лучше понятна человеку. Достоинством С/С++ является огромное число программных средств и библиотек, позволяющих просто создавать необходимый код. Фактически, С/С++ сегодня стал основным языком разработки управляющих программ. Компиляторы данного языка реализованы практически для всех моделей микроконтроллеров. Стандартный язык дает возможность переноса программ с одной платформы на другую. Теоретически, используя разные компиляторы, можно преобразовать любую программу в команды микроконтроллера нужного типа. На практике дополнительно требуется учитывать архитектуру микроконтроллера каждого типа.
Язык С/С++ имеет достаточно сложную для изучения структуру. Получаемый программный код конкретной задачи, имеет больший объем, чем код той же задачи, реализованной на Ассемблере. Тем не менее язык С/С++ следует признать единственным правильным выбором для профессионального программирования микроконтроллеров.
// Пример программы на языке С
// Мигание встроенным светодиодом Arduino
void setup() <
pinMode(13, OUTPUT); // Инициализация выхода 13
>
void loop() digitalWrite(13, HIGH); // Зажечь светодиод
delay(1000); // Задержка
digitalWrite(13, LOW); // Зажечь светодиод
delay(1000); // Задержка
>
Pascal
Язык Pascal еще более удобен для восприятия и изучения. Тем не менее, он не имеет такого распространения как C/C++, особенно при программировании микроконтроллеров. Некоторые отдельные фирмы поддерживают данный язык, с целью упрощения перехода на контроллеры с больших ПК. В частности вариант языка под названием MicroPASCAL входит в состав поставки отладочных средств фирмы Mikroelektronika.
// Пример программы на языке MicroPASCAL
// Мигание светодиодом
program LED_Blinking;
begin
PORTC := 0; // Инициализация PORTC
TRISC := 0; // Настройка PORTC
while TRUE do // Начало бесконечного цикла
begin
PORTC := not PORTC; // Инвертирование PORTC
Delay_ms(1000); // Задержка
end;
end.
BASIC
Старинный язык первоначального обучения программированию, в настоящее время в основном сохранился в виде реализации Visual BASIC от Microsoft. Используется он и для программирования микроконтроллеров. Реализаций этого языка гораздо больше, чем того же Pascal. Связано это в первую очередь с простотой языка. BASIC часто выбирают разработчики программно-аппаратных платформ, нацеленных на упрощенную разработку электронных устройств. Можно назвать такие проекты, как PICAXE, Amicus18, microBASIC и некоторые другие. Недостатком BASIC является плохая структурированность кода. Этот язык не стоит выбирать для первоначального изучения с целью дальнейшего перехода на С/С++. Программирование микроконтроллеров на BASIC можно рекомендовать любителям, не нацеленным на создание, в основном, простых устройств.
' Пример программы на ProtonBASIC
' Мигание светодиодом на PORTB.0 Amicus18.
While 1 = 1 ' Начало бесконечного цикла
High RB0 ' Включить PortB.0
DelayMS 500 ' Задержка полсекунды
Low RB0 ' Выключить PortB.0
DelayMS 500 ' Задержка полсекунды
Wend ' Закрытие цикла
Визуальные языки
В отличие от классических языков программирования, визуальные языки позволяют разрабатывать программы в виде изображений. Среди таких языков можно выделить FlowCODE или Scratah. Достоинством визуальных языков является хорошо воспринимаемая структура алгоритма. Это позволяет просто разобраться в его функционировании любому человеку, знающему основные символы языка. Перевод структурных схем в команды микроконтроллера, как правило, выполняется не сразу. Вначале алгоритм транслируется в команды ассемблера или какого-либо языка высокого уровня. Только затем, все преобразуется в машинный код. Такая схема, несмотря на свою сложность, позволяет использовать наиболее удобные компиляторы разных разработчиков.
Еще одним достоинством визуального программирования становится простота изучения, поэтому подобные языки часто используются для обучения детей. Недостатком визуального подхода является громоздкость исходных материалов. Тем не менее, подобные языки программирования нашли очень большое распространение для решения специальных задач.
Заключение
Выбор того или иного языка программирования зависит от множества факторов. В первую очередь необходимо определиться с типом решаемых задач и необходимым качеством кода. Если не требуется разработка объемных и сложных программ, то можно использовать практически любой язык. Для обеспечения компактности кода подойдет Ассемблер, а если ставятся серьезные задачи, то альтернативы С/С++ практически нет. Также необходимо учитывать доступность компилятора. В некоторых случаях, реализация языка может вообще отсутствовать, или предлагаться за солидные деньги. В итоге самым универсальным решением можно назвать связку Ассемблера и C/C++.
You have no rights to post comments