Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Микропроцессоры и микроЭВМ. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]