Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Микропроцессоры и микроЭВМ. Учебное пособие
.pdf
2. РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
Для разработки программного обеспечения используется специальный инструмент – язык программирования. Выбор конкретного языка из
множества реализуется по различным признакам. Таковыми могут являться возможности языка при выполнении определённых задач, личные симпатии разработчика или другие факторы. В принципе каждый алгоритм
можно реализовать на любом языке программирования. Для микроконтроллеров предлагается выбор, по сути, только из двух вариантов – ассемблер или С.
Ассемблер – это не универсальный язык программирования, подобно
С или Pascal, а просто несколько (не очень много) правил, по которым
последовательность команд процессора, записанных в мнемоническом
виде, может объединяться в программу. Программа сначала получается в
текстовом формате (её ещё называют «исходным текстом», «исходным
кодом», или просто «исходником»). Этот формат должен представлять
собой «чистый текст» в однобайтовой кодировке, никакие другие форматы (вроде MS Word) тут не проходят категорически.
Эту программу потом компилируют с помощью собственно ассемблера (assembler – сборщик) – так называется программа, которая переводит текст с мнемоническими обозначениями в последовательность команд
и данных, записанных уже в двоичной форме, и пригодную для загрузки в
память контроллера. В принципе операция компиляции (иногда её в данном случае ещё называют ассемблированием) лишняя и служит только
для удобства человеческого восприятия исходного текста программ. Когда-то программы писали прямо в двоичных кодах. Но программировать
прямо в машинных кодах не только крайне неудобно, но ещё и очень долго, особенно при поиске ошибок и отладке. Поэтому и придумали мнемонические обозначения для команд (для каждого процессора, вообще говоря, свои) и несколько несложных правил нотации (т.е. оформления текста
программ, также в общем случае своих для каждой системы, но в целом
похожих), чтобы программа-ассемблер «понимала» текст правильно.
Ассемблер крайне просто изучить и быстро использовать практически. Фирменное описание ассемблера для AVR занимает несколько страничек (см. табл. 1.1 – 1.13), и его можно скачать с сайта Atmel. А вот особенности использования конкретных команд можно изучать долго (любой
программист обязательно имеет под рукой справочник по командам), но к
ассемблеру, как таковому, они не имеют отношения, в большинстве случаев эти нюансы точно также необходимо знать и учитывать при программировании на С.
Но ассемблер обладает одним большим недостатком: программы на
его основе получаются довольно громоздкими и неудобочитаемыми. Это
МИКРОЭВМ
51

вызвано тем, что здесь любую операцию приходится разлагать на составляющие. Особенно это характерно для RISC-архитектур (к которым относится и AVR) – например, в системе команд AVR нет даже операции деления (да и операция умножения работает не во всех моделях). Но в общем случае и наличие расширенного набора команд (CISC-архитектура)
не очень помогает.
Для примера рассмотрим типовую задачу, реализуемую на языке
Pascal в одну строку:
if (var_x>const_1) then begin var_x:=0; pr1 end else pr2;
(где pr1 и pr2 – наименования неких процедур, которые выполняются в
зависимости от результата сравнения переменной var_x с константой
const_1, причём во втором случае переменную ещё нужно дополнительно
обнулить). А листинг ниже иллюстрирует, как то же самое может выглядеть на ассемблере для процессоров x86 фирмы Intel.
Листинг
…….
сmр var_x,const_1 ; сравниваем
ja metka1 ; если больше, то на метку 1
call рr_2 ; иначе вызываем процедуру 2
jmp metka2 ; после неё на продолжение
metka1: хоr ах,ах ; обнуляем регистр
ах mov var_x,ax ; переменная = 0
call рг_1 ; вызываем процедуру 1
metka2: [продолжение основной программы]
. . . . . .
Как видим, никакой речи о том, чтобы следовать знаменитому лозунгу Дейкстры «программирование без goto», тут идти не может, так как
ассемблерная программа, если можно так выразиться, состоит из сплошных «goto» – «лапши», по словам Дейкстры, условных и безусловных переходов (он намекал на многочисленные линии ветвления, которые возникают в блок-схемах таких программ). Таким образом, для работы на
ассемблере требуется учить реализацию всех типовых приёмов программирования, таких как различные циклы с условными и безусловными переходами, математические операции, самостоятельно организовывать деление на локальные и глобальные переменные и т.п. Это и служит основным аргументом в пользу языков высокого уровня, где подобные вещи в
большинстве случаев уже сделаны.
И в фирменных руководствах, и в примерах в тексте технических
описаний контроллеров можно встретить бесконечный цикл ожидания
очистки какого-нибудь бита, и в теории, если этот бит никогда не очистится, МК так и «повиснет». ПК-программист от такой ситуации пришёл
52

бы в ужас. Конечно, есть средства вывести контроллер из этого состояния: наиболее кардинальным будет использование сторожевого таймера,
который в конце концов перезапустит систему. Более грамотно было бы
заставить контроллер ожидать не самой по себе очистки бита, а связанного с этим прерывания (что позволит выполнять остальные функции без
задержек), но далеко не всегда это возможно: например, запись байта во
встроенную EEPROM заставляет МК «висеть» несколько миллисекунд,
пока этот процесс не закончится, но соответствующее прерывание в ряде
моделей просто отсутствует, а если даже имеется, то задействовать на
практике его неудобно из-за значительного усложнения логики построения программы.
Ядро и система команд МК AVR с самого начала создавались в сотрудничестве с фирмой IAR Systems – производителем компиляторов для
языков программирования C/C++. Поэтому структура контроллера максимально оптимизирована для того, чтобы можно было писать программы
на языках высокого уровня. Так утверждает реклама, но верить подобным
заявлениям стоит с некоторой оглядкой – все, конечно, зависит от компилятора и конкретной задачи. Ведь функция компилятора очень непростая:
перевести строки на языке высокого уровня в команды контроллера, что
для AVR, с его многочисленными ограничениями на использование команд, ничуть не проще, чем для «настоящих» микропроцессоров, и потери
тут неизбежны – как с точки зрения компактности кода, так и времени его
выполнения.
Но в реальности выбор определяется совсем не компактностью кода.
Необходимо учесть, что значительная часть программ (особенно любительских) для МК имеет относительно небольшой размер и вполне читается на ассемблере. Так как ассемблер сам по себе учить не нужно, то его
выбор оказывается лучшим вариантом для начинающих (которые при
этом получают возможность глубже изучить собственно микроконтроллер), а также для тех, кто пришел к МК от электроники и привык мыслить
в терминах регистров и ячеек памяти. В то же время те, кто чувствует себя, «как рыба в воде», в программировании на языках высокого уровня, и
ставит перед собой задачи чисто практического плана, не желая углубленно изучать «матчасть», несомненно, сделают выбор в пользу С.
Следует только учесть, что, вне всякого сомнения, профессиональная
работа в области программирования МК без языка С не обойдётся – если
ассемблерная программа превышает по объёму 1000 – 1500 строк, то в
ней уже не разберётся ни один хакер, а привязка к конкретному автору,
который только один знает своё произведение, обычно слишком дорого
обходится заказчикам. Но учтите, что при переходе к языку С и профессиональным средствам работы с AVR, кроме всего прочего, придётся преодолевать некий порог (и не только в денежном смысле), который не всегда оправдан достигаемой целью. Такое подразделение пользователей, по
53

сути, заложено в маркетинговой политике компании Atmel, которая ассемблер и сопутствующие средства распространяет бесплатно. В то же
время профессиональное программное обеспечение почти всё платное, и
зачастую весьма дорогое. Фирма IAR Systems в настоящее время предлагает серию пакетов Embedded Workbench для более чем двадцати типов
МК различных фирм (под девизом «различные архитектуры – одно решение»). Здесь всё рассчитано на то, чтобы человек, владеющий языком С, с
минимальными потерями времени смог «пересесть» на другой тип контроллера. В этом «монструозном» инструменте всё здорово, кроме цены.
Но это оправданно – рабочие инструменты должны быть качественными и
потому дешёвыми являться не могут. Стоят денег и средства отладки
(аппаратные эмуляторы), на работу с которыми рассчитана сама по себе
бесплатная AVR Studio.
Стоит также упомянуть, что IAR Systems – не единственный разработчик компиляторов с языка С для AVR. Есть и не столь «навороченные» инструменты (например, ICC for AVR от фирмы ImageCraft,
CodeVisionAVR от HP Infotech), но в любом случай реальная цена их начинается от сотен евро. Для полноты картины нужно упомянуть и бесплатный WinAVR (AVRGCC, winavr.sourceforge.net), который создан на
основе компилятора GNU GCC и, соответственно, распространяется по
лицензии GPL (с исходными кодами), обладающий всеми недостатками и
достоинствами «свободных» продуктов. Этот продукт также поддерживается AVR Studio.
Для желающих попрактиковаться на С укажем на отличную библиотеку типовых модулей для AVR, расположенную по адресу
http://hubbard.engr.scu.edu/embedded/avr/avrlib.
2.1. AVR STUDIO
Для разработчиков приложений на микроконтроллерах AVR компания Atmel предлагает полноценный пакет САПР AVR Studio (на данный
момент уже выпущена пятая версия программы). Скачать AVR Studio
можно совершенно бесплатно с сайта Atmel по адресу
http://atmel.ru/Software/Software.htm. Установку AVR Studio лучше выполнять по пути, не содержащему имен каталогов, написанных кириллицей,
чтобы в дальнейшем не было проблем различного рода. При разработке
программ в этой среде создаётся отдельный проект, который привязывается к конкретному типу микроконтроллера, параметры которого используются затем в процессе отладки на симуляторе.
При запуске программы появляется менеджер проектов, предлагающий открыть один из существующих проектов, либо создать новый
(рис. 2.1).
54

Рис. 2.1. Менеджер проектов
В случае создания нового проекта откроется следующее окно выбора
языка разработки программы и имени проекта (рис. 2.2). Здесь можно выбрать тип проекта: Atmel AVR Assembler – для написания программ на
ассемблере, а AVR GCC – для программирования на Си (для написания
программ на Си необходимо установить программу WinAVR, так как плагин AVR GCC является её частью). Здесь же задаётся имя проекта, можно
выбрать место его сохранения, а также доступны опции создания отдельной папки для проекта и создание начального файла с текстом программы. Эта опция очень удобна, так как после компиляции количество файлов резко увеличивается, и их гораздо удобнее хранить в одном месте.
Рис. 2.2. Создание файла проекта
55

Рис. 2.3. Выбор целевого контроллера и средства отладки
После нажатия кнопки Next откроется следующее диалоговое окно
(рис. 2.3). В данном диалоге предлагается выбрать отладочную платформу
и модель микроконтроллера, для которой будет разрабатываться программа.
Отладочной платформой может быть как реально существующий в
железе программатор-эмулятор (AVR Dragon, AVR One, ICE 200 и т.д.)
так и виртуальный отладчик – AVR Simulator, позволяющий отлаживать
разрабатываемую программу средствами AVR Studio.
Если на компьютере установлена САПР Proteus компании Labcenter
Electronics, то в качестве отладочной платформы может быть выбран
Proteus VSM Viewer. Это означает, что можно в Proteus создать схему уст-
ройства, для которого разрабатывается программа, а потом это виртуальное устройство подключить к AVR Studio и проверять на нём работу программы. Благодаря связке Proteus и AVR Studio изучение программирования микроконтроллеров можно начинать без какой-либо материальной
базы, имея только желание и необходимое программное обеспечение.
После всех предварительных установок появляется рабочая среда
AVR Studio (рис. 2.4). Она состоит из нескольких окон, содержание, количество и положение которых могут быть настроены так, как удобно пользователю во вкладке главного меню View>Toolbars. На рисунке представлены следующие окна: основное окно кода; окно проекта – показана
структура проекта, подключаемые файлы, метки и прочее; окно периферии – отображает состояние всех внутренних модулей микроконтроллера;
окно системных сообщений – содержит различные сообщения об ошибках, успешных операциях, результатах компиляции.
56

Рис. 2.4. Основное окно AVR Studio
AVR Studio поддерживается операционными системами Windows9x /
ME / NT / 2000 / XP / VISTA. Содержит в себе менеджер проектов, редак-
тор исходного кода, инструменты виртуальной симуляции и внутрисхемной отладки, позволяет писать программы на ассемблере или на C/C++.
В силу перечисленных достоинств AVR Studio может считаться лучшей
средой разработки приложений для микроконтроллеров AVR.
2.2. ОБЩАЯ СТРУКТУРА ПРОГРАММЫ НА АССЕМБЛЕРЕ
Как известно, при работе МК последовательно выполняет команды
программы, имеющейся в памяти. Программист может менять порядок
выполнения команд, организуя циклы и различные переходы. Одно из
самых мощных средств программирования – вызов подпрограмм или
процедур (в данном случае это одно и то же), т.е. кусков кода, которые
могут использоваться неоднократно. Во всех ассемблерах вызов процедур
предусмотрен обязательно.
Естественно, программу сначала нужно записать в память МК, причём так, чтобы МК «знал», откуда начинать при включении питания или
после подачи импульса на вывод /RESET. Это его «знание» в случае современных МК AVR также программируется, однако для простоты будем
считать, что программа всегда начинает читаться с самой первой ячейки
57

памяти программ – т.е. с нулевого адреса (в современных моделях AVR,
поддерживающих самопрограммирование, адрес этот можно изменять).
Исходя из этих обстоятельств, программа должна иметь определённую
структуру.
По этому начальному (нулевому) адресу всегда располагается одна и
та же команда безусловного перехода (по-английски jump – «прыжок»),
которая записывается так:
rjmp RESET
или
jmp RESET
Форма написания (jmp или rjmp) зависит от выбранного контроллера –
если в нём объём памяти программ меньше или равен 8 кбайт, то всегда
(и не только в этом случае) используется команда rjmp (relative jump, т.е.
«относительный безусловный переход»). Она занимает в памяти два
байта – как и практически все остальные команды AVR. Код самой команды в этих двух байтах занимает старшую тетраду старшего байта – т.е.
четыре бита, остальные 12 битов представляют собой адрес, куда переходить – в данном случае компилятор подставит адрес команды, следующей
сразу за меткой reset, с которой и начнётся собственно выполнение программы. Метка с этим именем, естественно, всегда должна присутствовать, но может быть расположена уже в любом другом удобном месте
программы, за исключением ещё нескольких первых адресов, которые
содержат прыжки на обработчики прерываний. Метка, естественно, может называться и не reset, а любым другим именем (например, Main), просто так принято для удобства чтения (хотите найти в любой программе её
начало – ищите метку reset).
Вернёмся к форме записи команды. 12 битов адреса могут представлять 4096 различных адресов. Так как единицей объёма памяти программ
служит слово из двух байтов, то общий объём адресуемой таким образом
памяти и составит 8 кбайт. А вот если памяти больше, то приходится прибегнуть к команде jmp (абсолютный безусловный переход) – она состоит
из четырёх байтов, в которых адрес займёт 22 бита, и потому может адресовать до 4 М слов (до 8 Мбайт) памяти.
Те же соображения относятся к другим командам, адресующим память программ – к паре rcall и call (а также, с некоторыми нюансами, lpm
и elpm). Заметим, что в системе команд AVR семейства Mega есть ещё
команды icall и ijmp (косвенный вызов и косвенный переход), которые по
определению могут адресовать 64 К слов (до 128 кбайт) памяти – для этих
команд адрес задаётся 16-битовым регистром Z. Однако их употребляют
нечасто (только в старших Mega), а в начале программы (в таблице прерываний, см. далее) их вообще указывать нельзя чисто технически (нужно
заранее задавать значение Z, а до начала программы это сделать невозможно).
58

Структура типовой программы для AVR начинаться с директивы
include, ссылающейся на файл с определениями имён для конкретного
процессора, далее обычно идут пользовательские определения переменных (директива def) и констант (директива equ), а программа должна начинаться с безусловного перехода на метку reset. Начало собственно программы будет располагаться сразу после этой метки где-то в другом месте
программы. Можно, конечно, написать программу прямо с нулевого адреса, но только в том случае, когда не используются прерывания. Даже директиву include можно опустить, но тогда вместо имен регистров придётся писать их адреса в шестнадцатиразрядном формате, что не совсем
удобно.
2.3. WINAVR
WinAVR – набор исполняемых Windows-совместимых файлов, каж-
дый из которых решает определённую задачу по разработке микропрограммного обеспечения для микроконтроллеров AVR компании Atmel. В
комплект входит компилятор GNU GCC для языков программирования
Си и Си++. На рисунке 2.5 показан интерфейс программы после связки с
AVR Studio. Также для разработки программ можно пользоваться и специальным редактором WinAVR.
Рис. 2.5. WinAVR в среде AVR Studio
59

WinAVR включает следующий набор компонентов:
Programmers Notepad – удобный редактор программиста и интегри-
рованная среда разработки (IDE);
AVR GCC – компилятор языков C и C++ для AVR;
avr-libc – стандартная С библиотека AVR для использования с GCC;
avr-as – ассемблер для микроконтроллеров AVR;
AVRDUDE – программатор (программа для загрузки и выгрузки ко-
да микроконтроллеров);
avrdude-gui – графический интерфейс пользователя для AVRDUDE
(только в версиях до WinAVR-20060421 включительно);
MFile – автоматический генератор Make-файлов for AVR GCC;
GNU Binutils – утилиты для AVR (поддерживают преобразование
форматов из ELF в AVR COFF или в AVR Extended COFF);
GNU Debugger (GDB) – дебагер (отладчик) с интерфейсом команд-
ной строки;
Insight – дебагер (отладчик) с графическим интерфейсом пользова-
теля;
AVaRICE (JTAG ICE interface) – программа для интерфейсов Atmel
JTAG ICE (используется вместе с GDB);
SimulAVR – симулятор GDB с поддержкой симулятора от AVR;
SRecord – коллекция мощных утилит для загрузки файлов разных
форматов в EPROM;
дополнительные вспомогательные программы и утилиты;
набор документации.
Скачать этот программный продукт можно совершенно свободно и
использовать бесплатно (winavr.sourceforge.net). Несмотря на это он обладает достаточно высокой функциональностью и формирует компактный
исполнительный код. Для связки с AVR Studio он должен устанавливаться
последним. Данная программа не очень любит взаимодействие с кириллицей. Это значит, что установку WinAVR следует выполнять в папку с
названием только из латинских букв или цифр. Так же не желательны
пробелы в адресе для установки, так что лучше всего ставить, как сама
программа и предлагает по умолчанию, в папку: C:/winavr/.
Главной программой, в которой собственно и идёт работа, является
Programmer Notepad. Открываем Programmer Notepad, «File» -> «New».
Откроется окно нового файла. Предварительно создадим папку, в которой
будут храниться проекты. Как и для WinAVR для каждого проекта лучше
создавать отдельную папку, куда и сохраним новый файл с расширением «с».
После написания программы для задания параметров самого проекта необходимо создать так называемый makefile. В дальнейшем, после приобретения некоторого опыта, данный файл можно будет копировать из других своих проектов. Составление его структуры и заполнение можно сделать с помощью специальной программы из пакета WinAVR.
60
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
