Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практическое занятие №9.doc
Скачиваний:
10
Добавлен:
26.11.2018
Размер:
6.34 Mб
Скачать

2 Практическая часть

Рассмотрел состав ИС РПО для семейства МК AVR

Выполнил примеры работы с ИС РПО для семейства МК AVR и Проанализировал результат работы с ИС РПО для семейства МК AVR.

Ниже приведено содержи­мое hех -файла, полученного в результате трансляции программы Рrog1 (листинг 1, см приложение в конце практической работы ):

-Данный файл состоит из четырех строк

-Строка начинается с двоеточия

-Сразу после кода вида строки начинаются собственно данные.

-Каждый байт данных занимает два знака.

-Самые последние два сим­вола— это контрольная сумма.

Очередные два знака занимает код вида строки. В интересующих нас строках он равен «00», что означает, что эти строки предназначены для записи данных (в первой строке такой код равен «02», а в последней «01»).

Сразу после кода вида строки начинаются собственно данные. Каждый байт данных занимает два знака

Самые последние два сим­вола— это контрольная сумма. Она рассчитывается по специальной формуле с использованием значений всех байтов цепочки и служит для проверки на отсутствие ошибок

В случае успешного завершения процесса трансляции в качестве послед­него сообщения выводится статистическая информация:

то сообщение означает:

  • что в программном сегменте использованы ячейки

с адреса 0x000000 по адрес 0x000412.

  • При этом собственно код программы занимает 508 байт.

  • Данные в программной памяти занимают 758 байт.

  • Всего использовано в программной памяти 1266 байт (сумма предыдущих двух чисел).

  • Размер программной памяти для этого микро- контроллера составляет 2048 байт.

  • Процент использования программой памяти 61,8%.

Естественно, что два последних вида памяти не содержат программного кода. Поэтому в соответствующем столбике стоят нули.

Последняя строка содержит сообщения об ошибках.

В данном случае сообщение переводится так:

«Ассемблирование прошло успешно, 0 ошибок, 0 предупреждений».

Каждое сообщение об ошибке во вкладке «Build содержит точное указание места в программе, где произошла эта ошибка.

Трансляция программы Форматы файлов

После того, как текст программы набран и записан на жесткий диск, необ­ходимо произвести трансляцию программы.

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

Кроме hех-файла транслятор создает еще несколько вспомогатель­ных файлов.

И главное, файл с расширением еер. Этот файл имеет точно такую же внутреннюю структуру, как файл hех . А содержит он инфор­мацию, предназначенную для записи в ЕЕРRОМ. Такая информация появля- ется в том случае, когда в тексте программы переменным, раз­мещен- ным в сегменте еерrom, присвоены начальные значение.

(В наших примерах этого не делали. Поэтому файл с расшире- ниием еер во всех проектах пустой (будет содержать лишь завершающую строку).

В обоих случаях применяется так называемый НЕХ-формат, который пра-ктиче­ски является стандартом для записи результатов транслирования раз­личных программ. Он поддерживается практически всеми транслято­рами с любого языка программирования.

В принципе, программисту не обязательно знать структуру этого формата. Достаточно понимать, что в hех -файле определенным спо­собом закодирована программа в машинных кодах. Именно этот файл используется программатором для «прошивки» программной памяти микроконтроллера.

Любой программатор поддерживает hех -формат и распознает записанные туда коды автоматически.

Краткое описание hех -формата.

Формат НЕХ-файла

Если посмотреть содержимое такого файла при помощи редак­тора «Блокнот», то можно увидеть, что это текстовый файл, в котором данные закодированы в виде текстовых строк.

Ниже приведено содержи­мое hех -файла, полученного в результате трансляции программы Рrog1 (листинг 1, см приложение в конце практической работы ):

Данный файл состоит из четырех строк.

  • Первая и послед­няя строки несут служебную информацию. Наличие первой строки необязательно. Система AVR Studio при трансляции программы всегда добавляет в hех -файд первую строку именно такого содержания. Последняя строка — это стандартный конец для любого hех -файла.

  • Оставшиеся две строки как раз и содержат информацию о кодах про­граммы. Б каждой такой строке закодирована цепочка байтов и адрес в памяти, где эти байты должны размещаться.

Строка начинается с двоеточия. Двоеточие— обязательный элемент, который служит для идентификации hех -формата. Все остальные символы в строке — это шестнадцатиричные числа, записанные слитно без пробе­лов. Отдельные числа отличают по их позиции в строке. Так первые два знака занимает шестнадцатиричное число, означающее длину цепочки.

В нашем случае длина обеих цепочек равна 0x10 (то есть 16) байт. Следующие четыре символа— это начальный адрес, куда эти байты должны быть помещены:

  • Первая цепочка будет размещена в памяти, начи­ная с нулевого адреса.

  • Вторая цепочка — с адреса 0x0010.

Очередные два знака занимает код вида строки. В интересующих нас строках он равен «00», что означает, что эти строки предназначены для записи данных (в первой строке такой код равен «02», а в последней «01»).

Сразу после кода вида строки начинаются собственно данные. Каждый байт данных занимает два знака.

Самые последние два сим­вола— это контрольная сумма. Она рассчитывается по специальной формуле с использованием значений всех байтов цепочки и служит для проверки на отсутствие ошибок.

Процедура трансляции

Для того, чтобы запустить про­цесс трансляции текущего проекта, нужно выбрать в меню «Build» пункт, который тоже называется «Build », или нажать кнопку

Длительность процесса трансляции зависит от размеров программы. Сразу же после начала процесса вкладка «Build » в окне 2 выходит на передний план.

В процессе трансляции сюда выводятся служебные сообщения:

  • К таким сообщениям относятся: сообщения о завершении различных этапов трансляции,

  • сообщения об ошибках (Error),

  • а также предупре­ждения (Warning).

В готовой отлаженной программе ошибок и предупреждений быть не должно.

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

В этом случае необходимо устранить ошибки и повто­рить трансляцию.

Естественно, транслятор не в состоянии найти все виды ошибок. Он находит только явные ошибки, которые можно найти автоматически.

К таким ошибкам относятся:

  • ошибки синтаксиса (неправильное написание имени команды);

  • неверное количество параметров у оператора;

  • попытка использования неописанных переменных и т. п.

Например, сообщение «Unknown instruction or macro » означает, что

найдена «Неизвестная инструкция или макрокоманда».

Предупреждения— это тоже ошибки, но некритические.

При воз­никновении некритической ошибки процесс трансляции заверша- ется как обычно. Все результирующие файлы создаются в полном объеме. Однако прежде чем зашивать такую программу в микроконтроллер, тщательно проанализируйте сообщение и постарайтесь определить, как оно повлияет на результаты работы.

В любом случае, лучше изменить программу таким образом, чтобы устранить все предупреждения.

Все сообщения во вкладке «Build » появляются по мере их поступле­ния.

Для наглядности каждое сообщение помечено цветным кружочком в начале строки:

  • сообщения об ошибках помечаются кружочком красного цвета;

  • предупреждения помечаются желтым кружочком;

  • сообщения об успешном выполнении каждого очередного этапа трансляции помечаются зеленым кружочком.

Если сообщения не вмещаются в окно, то они скрываются в верхней его части. Однако, используя полосу прокрутки, их всегда можно просмотреть. В случае успешного завершения процесса трансляции в качестве послед­него сообщения выводится статистическая информация:

то сообщение означает:

  • что в программном сегменте использованы ячейки

с адреса 0x000000 по адрес 0x000412.

  • При этом собственно код программы занимает 508 байт.

  • Данные в программной памяти занимают 758 байт.

  • Всего использовано в программной памяти 1266 байт (сумма предыдущих двух чисел).

  • Размер программной памяти для этого микро- контроллера составляет 2048 байт.

  • Процент использования программой памяти 61,8%.

Точно такие же сведения приведены для памяти данных (ОЗУ) и для ЕЕРRОМ.

Естественно, что два последних вида памяти не содержат программного кода. Поэтому в соответствующем столбике стоят нули.

Последняя строка содержит сообщения об ошибках.

В данном случае сообщение переводится так:

«Ассемблирование прошло успешно, 0 ошибок, 0 предупреждений».

Каждое сообщение об ошибке во вкладке «Build содержит точное указание места в программе, где произошла эта ошибка.

При этом ука­зывается:

  • имя файла;

  • номер строки;

  • фрагмент текста программы, содержащий ошибку;

  • ее расшифровка.

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

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

Иногда программа неверно определяет место, где возникла ошибка. Это происходит из-за несовершенства анализатора синтаксиса. Дело в том, что очень сложно разработать идеальный алгоритм анализа оши­бок. Если в какой-либо строке транслятор показывает ошибку, а вы ошибок не наблюдаете, посмотрите на предыдущие строки. Возможно, ошибка где-то там.

Отладка программы Ошибки алгоритма и его реализации

Если исправлены все ошибки и отсутствуют предупрежде­ния, то это значит, что программа успешно оттранслирована.

Можно записывать ее в программную память и пробовать ее работу «в железе».

Но в большинстве случаев отсутствие синтаксических ошибок еще не означает отсутствие ошибок как таковых:

  • Можно напи­сать команду правильно, да не ту.

  • Но самая главная неприятность — ошибки алгоритма или его реализации.

Программист может упустить какой-либо шаг или неправильно поставить условие. Всех возможных ошибок алгоритма не перечесть. Но в результате про-грамма может работать неправильно либо совсем не работать.

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

По-английски процесс отладки называется Debug (Дебаг). Слово «Bug» — означает блоха. А «Debug» — это процесс избавления от ошибок или процесс ловли блох.

Этапы процесса отладки

Процесс отладки начинается с перевода программы в соответствую­щий режим. Если проект открыт, а все его программы записаны и оттран­слированы, то для перехода в режим отладки выберите пункт «Start Debugging» в меню «Debug» или нажмите кнопку | на панели задач.

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

По окончании процесса подготовки программа переходит в новый режим. В окне 1 на передний план выходит вкладка «I/O View» (см. рис.2), которая теперь будет использоваться для просмотра содержимого всех регистров. Причем внешний вид этой вкладки немного изменяется. Для каждого элемента в дереве ресурсов появляется поле, отображающее его содержимое.

Б окне 2 на передний план выходит вкладка «Breakpoints and Tracepoints», где теперь будут отображаться все точки останова.

В панели инструментов активизируются все инструменты, относящиеся к режиму отладки (до этого они были неактивны).

В окне 3 на первый план выхо­дит текст главного программного файла. На левой границе окна этого файла появляется желтая стрелка— указатель текущей выполняемой команды.

Указатель установится в начало программы (напротив первой исполняемой команды). Теперь все готово для отладки.

Отладка может выполняться разными методами:

Самый простой метод— пошаговое выполнение.

Для того, чтобы сделать один шаг,

выберите в меню «Debug » пункт «Step into» («Шаг в») либо нажмите кнопку на панели инструментов.

Можно также просто нажать кнопку «F11». В результате программа выполнит одну текущую команду. Указатель текущей команды (желтая стрелка) переместится в следующую позицию. Содержимое регистров изменится в соответствии с выполненной операцией.

Можно это проверить, найдя нужный регистр в окне 1. Убедившись, что команда выполнена правильно, делайте следующий шаг. И так далее.

При этом можно проследить:

  • последовательность выполнения операций,

  • правильность выполнения условных переходов

  • и многое другое.

В любой момент вы можете вручную изменить содержимое любого из элементов в дереве ресурсов.

Причем можно изменять как содержимое любого отдельного разряда, так и всего регистра в целом.

Для изменения содержимого разряда достаточно щелкнуть при помощи мыши по одному из квадратиков, символизирующему нужный разряд ( рис. 2).

При этом состояние квадратика изменится на противоположное (еди­ница изме-нится на ноль либо наоборот)

Для изменения значения всего регистра необходимо произвести двойной щелчок мышью по изображению содержимого регистра (в шестнадцатиричном виде).

Откроется окно содержимого. В этом окне вы можете выбрать одну из четырех форм представления числа (шестнадцатиричное, десятичное, восьми­ричное или двоичное) и изменить это значение в выбранном вами фор­мате. Затем нажмите кнопку «Оk» и изменение «запишется» в соответ­ствующий регистр.

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

Кроме директивы «Шаг в», имеется еще несколько ее модификаций. Их назначение и способы вызова приведены в табл.1.

Таблица 1.

Рис. 2. Изменение содержимого регистров

Директива «Шаг через» используется в том случае, если при пошаго­вом выполнении программы встретится команда вызова подпрограммы.

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

Директива «Шаг из» применяется в том случае, если вы все же вошли в подпрограмму, но затем поняли, что ее пошаговое выполнение излишне. Выбрав данную директиву, можно за один шаг выполнить все оставшиеся команды подпрограммы.

Директива «Выполнить до» применяется в том случае, когда какая-либо часть программы не оформлена в виде подпрограммы, но ее жела­тельно выполнить за один шаг. В этом случае в конце выбранного фраг­мента вы можете установить текстовый курсор (мигающую вертикаль­ную полоску) и выбрать директиву «Выполнить до». Отладчик за один шаг выполнит все команды, начиная с текущей (отмеченной желтой стрелкой) и вплоть до текстового курсора. Команда в строке с курсором выполняться не будет. Она станет текущей (на нее теперь будет указы­вать желтая стрелка).

Применение точек останова

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

Но если программа содержит цикл, который должен быть выпол­нен большое количество раз. Для того, чтобы проверить правильность выполнения всего этого цикла в пошаговом режиме, пришлось бы очень долго щелкать мышкой! В подобных случаях применяются точки останова (Breakpoint).

Определение.

Точка останова — это специальная метка, которую в отладочном режиме программист может поставить против любой строки про­граммы/

Листинг программы (фрагмент) Приложение