В. КРАСНОВ, г. Москва Р №3, 2000

Разработка программы — один из наиболее важных этапов в создании устройства на базе МК. Без нее он "мертв", не реагирует на внешние воздействия и не выдает управляющих сигналов.

При включении питания МК немедленно начинает исполнять программу, находящуюся в подключенной к нему памяти программ (обычно это ПЗУ). Ее выполнение начинается с некоторого фиксированного адреса, чаще всего нулевого. Адрес — это просто номер ячейки ПЗУ. Процесс осуществляется следующим образом: МК считывает число, хранящееся в памяти программ, и в зависимости от его значения, называемого машинным кодом, выполняет определенные действия над содержимым регистров АЛУ, памяти, портов и т. д. Например, прочитав из памяти программ число 32Н, МК "соображает", что нужно считать значение из входного порта номер 2 и поместить его в регистр-аккумулятор. Часто одного байта для описания действия не хватает, и тогда МК считывает из памяти дополнительные байты.

После выполнения действия МК считывает значение из следующей по порядку ячейки памяти и т. д. Совокупность байтов, описывающих одно выполняемое МК действие, называют машинной командой (инструкцией), а совокупность таких команд, которые "понимает" МК, — его системой команд или набором инструкций (Instruction Set). МК разных семейств имеют разные системы команд, т. е. машинные коды у них имеют разные значения, хотя и выполняют похожие действия.

Итак, программа для МК представляет собой последовательность чисел, значения которых указывают ему, какие действия выполнять. Результатом разработки программы является компьютерный файл, содержащий эти машинные коды. С помощью программатора ПЗУ его заносят ("зашивают") в память программ МК.

Каким же образом составляется эта последовательность машинных кодов — программа для МК? Неужели разработчику необходимо помнить значения машинных кодов и вручную задавать их последовательность? Первые программы для МК создавались именно так, и называлось это программированием в машинных кодах. Ясно, что такой способ разработки программ очень трудоемок и неэффективен.

Первым шагом в облегчении процесса создания программ была компьютерная программа — так называемый транслятор с языка ассемблера. Идея состояла в том, чтобы выражать выполняемые МК действия на более понятном человеку языке и затем преобразовывать эти выражения в машинные коды. В приведенном выше примере машинной инструкции, которая считывает значение порта 2 и помещает его в аккумулятор, выполняемые действия можно условно обозначить как MOVA.P2.

Здесь слово MOV (от англ. move), называемое мнемоникой инструкции, обозначает пересылку значения, а А и Р2, именуемые операндами, указывают, откуда взять значение и куда его поместить. Система подобных обозначений называется языком ассемблера. Программа, написанная на нем, обрабатывается транслятором, который преобразует конструкции языка ассемблера в машинные коды.

Программирование на ассемблере широко распространено по сей день. Трансляторы с языка ассемблера для всех популярных семейств микроконтроллеров бесплатны.

Несмотря на очевидные преимущества программирования на ассемблере перед программированием в машинных кодах, во многих случаях ассемблер недостаточно эффективен для реализации задач разработчика. Дело в том, что МК способен выполнять лишь простейшие действия вроде арифметических операций над целыми числами, пересылок, сравнений и т. п. Для более сложных задач, например, для операций над числами с плавающей запятой, разработчикам приходилось писать специальные подпрограммы, пользоваться которыми неудобно и громоздко. Следующим шагом в разработке программ для МК стало создание специальных компьютерных программ — трансляторов с языков программирования высокого уровня, или компиляторов. Наибольшее распространение получил язык программирования Си.

С появлением трансляторов разработка программ для МК резко упростилась. Если, например, нужно сложить в программе два числа, то теперь достаточно просто написать а = b + с, а транслятор преобразует это выражение в необходимую последовательность машинных команд в зависимости от типов переменных a, b и с.

Использование языка высокого уровня позволяет разработчику отвлечься от системы команд конкретного МК и оперировать более простыми и понятными человеку категориями. От разработчика требуется только знание общей архитектуры МК, принципов работы необходимых для решения поставленной задачи встроенных периферийных устройств и навыки программирования на языке Си. Функциональное наполнение программы реализуется с помощью средств языка Си, который содержит большое число разнообразных подпрограмм (функций): арифметических, для работы с символьными строками и многих других.

Рассмотрим процесс создания программы для МК на языке Си. В процессе разработки потребуется персональный компьютер.

После уяснения поставленной задачи разработчик пишет исходный текст своей программы на языке Си с помощью любого текстового редактора. Затем он запускает программу-транслятор с языка Си, которая преобразует исходный текст в промежуточный объектный файл. Транслятор управляется с помощью набора ключей (их описание можно найти в его документации), которые указываются в его командной строке. Если при написании программы разработчик допустил синтаксические ошибки, транслятор выдает на экран их список с указанием для каждой номера строки в файле исходного текста. Разработчик должен исправить все ошибки. После успешной трансляции объектные файлы нужно обработать редактором связей (линкером), который и генерирует файл программы в машинных кодах.

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

Описанный процесс выглядит довольно громоздким: разработчик должен вручную запускать разнообразные программы (текстовый редактор, компилятор Си, линкер), помнить управляющие ключи, искать ошибки в программе по номерам строк в файле. Последним на сегодняшний день шагом в облегчении труда разработчика программ для МК стало появление интегрированных сред разработки (Integrated Development Environment, IDE). Интегрированная среда разработки — это компьютерная программа, связывающая воедино все этапы разработки программы. Она совмещает в себе текстовый редактор для написания исходных текстов, трансляторы с ассемблера и Си, линкер, отладчик, справочную информацию по МК и другие средства, необходимые разработчику. Настройка трансляторов, линкера и других компонентов производится не методом указания ключей в командной строке, а в виде диалоговых окон, где нужно только расставить "галочки" в нужных местах. Преобразование исходных текстов программ в файл машинных кодов запускается одной клавишей.

Фирма (адрес сайта) Поддерживаемые семейства МК Характеристики пакета Keii Software (www.keli.com) MCS-51 Простая и удобная среда разработки. Компилятор Си генерирует компактный и быстрый код, не содержит ошибок. Отладчик не интегрирован в среду разработки IAR Systems (www.iar.com) MCS-51.MCS-196 PiCmicro и др. Среда разработки несколько неудобна. Компилятор Си генерирует хороший код Отладчик не интегрирован в среду разработки. Franklin Software (www.fsinc.com) MCS-51 Среда разработки вполне удобна. Компилятор Си генерирует компактный и быстрый код. однако, по отзывам пользователей содержит ошибки. Отладчик не интегрирован в среду разработки. H ech Software (www.htsoft.com) MCS-51.MCS-196. PiCmicro и др Среда разработки сильно устарела Качество генерируемого кода относительно невысокое (это не относится к компилятору Си дпя PiCmicro) Task ng Software (www.tasklng.com) MCS-51.MCS-196 Среда разработки перегружена ненужными функциями Контекстная обработка ошибок сделана неудовлетворительно. Компилятор генерирует хороший код. имеется множество опций управления генерацией кода. Microchip (www.microchip.com) PiCmicro Среда разработки простая и не очень удобная. Компилятор языка Си сильно урезан "Микропроцессорные системы МИФИ " (www.msl.gaw.ru) MCS-51 Русифицированная среда разработки функционирующая в среде DOS Отладчик не интегрирован в среду разработки. Макроассемблер и компилятор языка Паскаль "Фитой" (www.phyton.ru) MCS-51, MCS-196. PiCmicro, Atmel AVR Удобная русифицированная (по желанию) среда разработки Вся справочная информация - на русском языке. Дополнительно поддерживает интегрированную разработку программ для пакетов Keii, Microchip. Tasking (для MCS-196), Hi-Tech (дпя PiCmicro).

 


и генерирует компактный и быстрый код. однако, по отзывам пользователей содержит ошибки. Отладчик не интегрирован в среду разработки. H ech Software (www.htsoft.com) MCS-51.MCS-196. PiCmicro и др Среда разработки сильно устарела Качество генерируемого кода относительно невысокое (это не относится к компилятору Си дпя PiCmicro) Task ng Software (www.tasklng.com) MCS-51.MCS-196 Среда разработки перегружена ненужными функциями Контекстная обработка ошибок сделана неудовлетворительно. Компилятор генерирует хороший код. имеется множество опций управления генерацией кода. Microchip (www.microchip.com) PiCmicro Среда разработки простая и не очень удобная. Компилятор языка Си сильно урезан "Микропроцессорные системы МИФИ " (www.msl.gaw.ru) MCS-51 Русифицированная среда разработки функционирующая в среде DOS Отладчик не интегрирован в среду разработки. Макроассемблер и компилятор языка Паскаль "Фитой" (www.phyton.ru) MCS-51, MCS-196. PiCmicro, Atmel AVR Удобная русифицированная (по желанию) среда разработки Вся справочная информация - на русском языке. Дополнительно поддерживает интегрированную разработку программ для пакетов Keii, Microchip. Tasking (для MCS-196), Hi-Tech (дпя PiCmicro).