putchar(*ptr);
ptr++;
}
}
В этом примере указатель ptr используется для передачи в функцию putchar одного кода символа, который будет выведен на экран. Далее содержимое ptr увеличивается на 1, адресуя тем самым следующий элемент массива. По условию цикла while вывод на экран закончится, если в последовательно перебираемом массиве будет найден код конца строки.
Во встраиваемых системах указатели используются для обращения к регистрам специальных функций микроконтроллера. Рассмотрим следующую запись:
#define PORTA *(volatile unsigned char *) 0x1000
Эта запись информирует компилятор о том, что однобайтовая целочисленная переменная с именем PORTA располагается в памяти по адресу 0x1000. Служебное слово volatile информирует программу (и отладчик) о том, что значение PORTA может изменяться не только под управлением программы. Любое упоминание имени PORTA далее по тексту программы будет связано с выполнением операций чтения или записи в регистр данных PORTA по его физическому адресу 0x1000. Поэтому следующий программный фрагмент позволит прочитать содержимое порта PORTA в переменную new_value:
DDRA = 0x00; //инициализировать порт PORTA на ввод
new_value = PORTA; //читать содержимое регистра данных PORTA в
//переменную new_value
3.12. Структуры
Возможности языка Си позволяют объединить под одним именем переменные с разным форматом представления данных. Для этого используется понятие структуры.
Структура — это объект, состоящий из данных различных типов. При использовании структур следует различать объявление (или описание) структуры, как нового типа данных, например тип данных «структура x», от фактического определения некоторой переменной с типом данных «структура x». Пример объявления структуры типа car:
struct car {
int doors;
char color[10];
char *maker;
int num_cyl;
int year;
}
Служебное слово struct указывает начало объявления или определения структуры. За ним следует имя, которое присваивается данной структуре, оно называется идентификатором структуры. В фигурных скобках указывается список определений отдельных элементов, образующих структуру. Элементы структуры могут иметь любой тип, включая массивы, другие структуры и объединения.
Анализируя приведенную запись, отметим, что имя car — это имя нового типа данных. Не следует путать его с именем переменных типа car, которые далее будут определены в программе:
struct car your_car;
struct car my_car;
struct car his_car;
Записав приведенные выше строки, мы определили в программе три переменные с именами your_car, my_car, his_car, и каждая из этих переменных представляет собой структуру с одним и тем же набором элементов. Так первым элементом каждой из этих переменных структур будет двухбайтовое целое число. Численные значения этих первых элементов для всех переменных структур различаются, но формат представления данных для всех трех первых элементов одинаков.
Каждый элемент структуры имеет свое собственное имя: doors, color, maker и т.д. Допускается обращение к каждому элементу структуры с использованием его имени:
your_car.doors = 4;
Если переменная типа структура передается в качестве параметра в какую либо функцию, то следует помнить, что передаются не сами элементы структуры, а лишь указатель на первый элемент названной структуры. Поэтому при обращении внутри функции к отдельным элементам структуры следует вместо оператора «.» использовать оператор «–>». Например, в программе определяется функция assign_doornumber, которая присваивает численное значение первому элементу структуры типа car:
void assign_doornumber(struct car *some_car);
:
:
;
assign_doornumber(&your_car)
:
:
void assign_doornumber(struct car *some_car) {
some_car–>doors = 4;
return 0;
}
А сейчас мы обсудим, как создать массив структур. Допустим, что мы уже определили структуру circuit_board как новый тип данных:
struct circuit_board {
int transistor;
int bus;
int serial_port;
int parallel_port;
}
Создадим теперь массив new_board с пятью элементами, каждый из которых является структурой типа circuit_board:
struct circuit_board new_board[5];
К каждой записи внутри каждого элемента этого массива можно обратиться, используя номер элемента (фактически это номер структуры внутри массива) и имя записи внутри структуры:
new_board[2].transistor = 100;
Это выражение присваивает значение 100 записи под именем transistor третьего элемента массива new_board (элементы в составе массива отсчитываются с нулевого). Этим разделом мы закончили краткий обзор техники программирования МК на Си. Перейдем теперь к рассмотрению процесса генерации файла исполняемого кода программы для выбранного типа МК из файла исходного текста программы на Си.
3.13. Процесс программирования и отладки микропроцессорной системы
В данном разделе мы обсудим технологию создания и отладки прикладной программы в микроконтроллерных системах. Сначала рассмотрим процесс создания исходного текста управляющей программы и его превращение в файл исполняемого кода (ехеcutable file).
3.13.1. Технология создания программного кода
Процесс программирования кажется достаточно простой монотонной деятельностью до тех пор, пока задача управления, которую требуется реализовать, достаточно проста. Однако программисты с опытом знают, что большинство технических заданий удивительно быстро превращается достаточно сложный проект, часть задач которого разработчиком ранее не реализовывалась. Именно по этой причине необходимо правильно организовать исполнение проекта, даже если первоначальная задача кажется простой. Поэтому авторы настоятельно советуют читателю приобрести навыки системного подхода к написанию программ, независимо от языка программирования, на котором реализуется проект. Поскольку данная книга не претендует на системное изложение вопросов теории программирования, то наши советы по данной теме будут достаточно краткими.
При написании программы первым делом необходимо как можно более полно понять принцип действия и особенности работы того устройства, для которого программа предназначена. На основе этих знаний следует создать такую структуру программы, которая позволит удовлетворить как текущему техническому заданию, так и возможным будущим его дополнениям. На первых порах Вы можете начать самостоятельную работу, следуя рекомендациям главы 2. Вы уже умеете перейти от произвольного описания алгоритма управления к структуре функций управления и блок схемам алгоритмов. Рассмотренные в главе 2 методы структурного проектирования позволят Вам сначала увидеть задачу управления целиком, а затем произвести ее разбиение на отдельные блоки (подзадачи). Каждая такая подзадача должна быть оформлена в виде законченной подпрограммы или функции. Выделенные функции впоследствии будут объединены в один программный модуль, который должен быть отлажен и тестирован до того, как все другие составляющие модули программы будут объединены. Процессы написания, тестирования и отладки программ близко связаны. Вы никогда не должны сначала собрать полный текст программы, а затем начать ее отлаживать. Правильным подходом является написание, тестирование и отладка каждого программного модуля по отдельности перед тем, как эти модули будут объединены вместе. Процесс объединения должен использовать тот же подход: добавлять уже оттестированные модули к отлаженной части общей программы следует последовательно. И после добавления каждого нового модуля не лениться тестировать функционирование получившегося нового промежуточного программного продукта, в том числе убедиться в исполнении новых добавленных функциональных возможностей.
Напомнив Вам основные моменты структурного подхода к процессу написания исходного кода и его отладке, рассмотрим процесс превращения файла исходного кода на Си в файл исполняемого кода для определенного типа микроконтроллера. Мы рассмотрим эту технологию с использованием интегрированной среды разработки ICC12 версии 6.12B от компании ImageCraft. Если Вы используете программную среду разработки от другого производителя, то этот материал не будет для Вас бесполезным, поскольку принципы преобразования кодов в процессе создания исполняемого модуля прикладной программы одинаковы для всех аналогичных программных продуктов.
Рис. 3.1. Интерфейс пользователя интегрированной среды разработки ICC12
На рис. 3.1 представлен интерфейс пользователя (картинка на экране монитора), возникающая при запуске среды ICC12. Большое пустое окно в центре экрана предназначено для ввода и редактирования исходного текста программы на Си. Окно меньшего размера в правой части экрана — окно менеджера проектов. Оно предназначено для отображения списка всех используемых в текущем проекте файлов. Окно состояния в нижней части экрана предназначено для отображения текущей информации о режимах работы и состоянии обрабатываемых в среде файлов. В этом окне будут выводиться сообщения об ошибках, возникающих при работе программ компилятора, Ассемблера, линковщика и загрузчика/программатора в процессе обработки файлов текущего проекта. Теоретически, для ввода и редактирования файлов исходного текста программ могут быть использованы любые текстовые редакторы, однако программные продукты класса «интегрированная среда разработки» обязательно содержат собственный редактор текста, которым и следует воспользоваться. Пакет ICC12, как и любая другая интегрированная среда разработки, предоставляет программисту удобный интерфейс пользователя для работы с встроенными в среду программами компилятора, Ассемблера, линковщика, загрузчика и программатора. Каждая из программ может быть запущена на исполнение, как из контекстного меню, так и с помощью кнопок на панели управления. На рис. 3.2 показан интерфейс пользователя среды ICC12 с текстом программы в окне редактирования и сообщениями о результатах ее компиляции в окне состояния.
Рис. 3.2. Интерфейс пользователя интегрированной среды разработки ICC12
В окне редактирования загружен файл исходного текста программы на Си.
В окне состояния сообщение об успешной компиляции этого файла.
После того, как исходный текст программы написан и находится в окне редактирования, файл программы должен быть обработан препроцессором компилятора Си. Препроцессор – это часть программы компилятора, которая анализирует выражения в исходном тексте, которые начинаются с символа «#». Вспомните, с этого символа начинаются директивы подключения заголовочных файлов, директивы условной компиляции и директивы для объявления подпрограмм прерывания. Если препроцессор не зафиксировал синтаксических ошибок, то вступает в работу синтаксический анализатор и генератор ассемблерного текста компилятора Си. В результате, после обработки компилятором исходного текста программы на Си, будет получен текст исходной программы на языке Ассемблера для данного типа МК. В нашем случае это МК семейства 68HC12. Сгенерированный компилятором текст будет содержать как мнемоники команд ассемблера МК данного семейства, так и псевдокоманды и директивы для программы Ассемблер в составе пакета ICC12. Смысловые названия и шаблоны имен входных и выходных файлов компилятора Си для среды ICC12 приведены на рис. 3.3. Программы компиляторов, которые способны генерировать инструкции языка ассемблера для процессорного ядра, отличающегося (т.е. программно несовместимо) от ядра, на котором программа компилятора исполняется, называют кросс-компилятора ми. Так в нашем случае программа кросс-компилятора, исполняемая на персональном компьютере, генерирует ассемблерный текст для МК 68HC12.
Рис. 3.3. Последовательность работы программ в процессе генерации файла исполняемого кода прикладной программы
Исходный текст программы не обязательно должен быть написан на Си. Однако его написание на языке ассемблера для больших задач приводит к большому числу ошибок, что требует длительного процесса отладки. В проектах, которые связаны с программным обслуживанием быстропротекающих процессов, целесообразно наиболее критичные по времени исполнения фрагменты программы писать на ассемблере, в то время, как основную часть программы — на Си. Компиляторы Си допускают объединение этих двух языков в файле исходного текста программы.
Полученный после обработки программой компилятора файл прикладной программы далее обрабатывается программой Ассемблер. Эта программа преобразует файл программы в файл объектного кода с расширением «o» (см. рис. 3.3).
В соответствие с методом системного проектирования, разрабатываемая прикладная программа должна состоять из нескольких файлов, каждый из которых содержит отдельный модуль программы. Часть этих модулей может быть разработана и отлажена в составе другого проекта, и поэтому не требует повторной компиляции. В этом случае для создания конечного варианта разрабатываемой программы необходимо объединить в один файл ранее полученные объектные файлы модулей и вновь разработанные, прошедшие обработку компилятором и Ассемблером файлы. Для объединения нескольких объектных модулей в один файл исполняемого кода используется программа линковщика. Линковщик генерирует три типа файлов с расширениями «s19», «map» и «lst». Файл карты памяти «xxx.map» содержит в себе информацию о расположении кодов прикладной программы в адресном пространстве МК. Файл листинга «xxx.lst» отражает процесс перевода мнемоник команд ассемблера в машинные коды. Файл в формате «s19» именуют файлом исполняемого кода или загрузочным модулем, поскольку именно этот файл заносится в постоянную память МК и исполняется им в процессе управления проектируемым устройством. Таким образом, в результате работы специальных программ в составе пакета интегрированной среды разработки, один или несколько файлов на Си были обработаны программами компилятора, Ассемблера и линковщика с целью получения одного исполняемого на выбранном типе МК файла машинных кодов прикладной программы.
Процесс разбиения задачи для программирования на множество программных модулей, каждый из которых функционально завершен и предназначен для реализации отдельной функции управления, называется структурным программированием. Для объединения отдельных программных модулей в одну программу управления с возможностью независимой модификации и отладки каждого модуля недостаточно располагать только исходными текстами или объектными файлами этих модулей. Необходим также достаточно большой набор служебных файлов, которые вместе с файлами модулей составляют так называемый проект задачи. Поэтому программа в составе интегрированной среды разработки, которая осуществляет управление процессом компиляции, ассемблирования, объединения модулей программой линковщика и загружает полученный исполняемый код в память микроконтроллера на отладочной плате, называется менеджером проектов (Project Manager или Project Builder). Это еще одна программа в составе пакета интегрированной среды разработки типа ICC12.
Программа менеджера проектов считается основной в составе IDE, поскольку она управляет доступом пользователя и взаимодействием с обрабатываемыми файлами всех остальных программ пакета интегрированной среды разработки и отладки программного обеспечения (ПО) микропроцессорных систем. Кроме используемого в книге пакета ICC12, для создания прикладного ПО микроконтроллеров семейства 68HC12 могут также использоваться другие аналогичные пакеты, например CodeWarrior компании Metrowerks.
В параграфе 3.14 на примере простой программы управления светодиодами мы рассмотрим особенности генерации всех промежуточных файлов при работе комплекта программ в составе интегрированной среды ICC12. В настоящем параграфе на рис. 3.4 мы демонстрируем лишь смысловые преобразования исходного текста на Си в процессе получения исполняемого кода прикладной программы.
Рис. 3.4. Форматы представления прикладной программы на разных этапах создания файла исполняемого кода
3.13.2. Режим отладки BDM
В отличие от МК предыдущего поколения, например, 68HC11, аппаратные средства МК семейства 68HC12 позволяют вести отладку без остановки выполнения прикладной программы. В микроконтроллерах семейства 68HC11 наблюдение за состоянием внутренних ресурсов МК в процессе отладки осуществлялось с использованием специальной программы монитора отладки, которая загружалась в память МК сразу после включения питания. Эта программа передавала в персональный компьютер содержимое регистров центрального процессора и ячеек памяти каждый раз, когда этого пожелает оператор. Однако каждое обращение к программе монитора для нового просмотра вызывало генерацию программного прерывания с последующим остановом отлаживаемой прикладной программы и запуском программы монитора отладки. Такой принцип организации отладки не позволял наблюдать в реальном времени функционирование прикладных программ с множеством аппаратных прерываний.
В МК семейства 68HC12 реализован иной, более совершенный режим отладки BDM (Background Debug Mode), что в переводе означает «фоновый режим отладки». Этот режим позволяет выполнить основные процедуры отладки — просмотр и модификацию содержимого регистров и ячеек памяти без останова выполнения прикладной программы.
В процессе отладки МК обменивается данными с персональным компьютером, используя последовательный интерфейс с оригинальным протоколом. Для подключения микроконтроллера, который установлен на плате проектируемого устройства, к персональному компьютеру разработан унифицированный интерфейс, который носит название «BDM порт» (рис. 3.5). Стандартизация линий связи и типа разъема интерфейса отладки BDM позволяет разрабатывать универсальные программные пакеты и аппаратные средства отладки так, что любая аппаратная платформа на основе МК семейства 68HC12, в том числе и плата собственной разработки, способна работать под управлением любой интегрированной среды разработки для 68HC12/HCS12.
Рис. 3.5. Цоколевка разъема BDM порта
Используя порт BDM, встроенный в МК блок отладки принимает от персонального компьютера команды отладки и возвращает в персональный компьютер запрашиваемые данные. Часть команд отладки может выполняться только аппаратными средствами блока BDM, без остановки выполнения прикладной программы. При этом используются «холостые» машинные циклы внутренних магистралей, когда исполняемая прикладная программа не производит обращения к памяти. Если такие «холостые» циклы не возникают в течение 128 машинных циклов, то блок BDM захватывает последующие циклы для выполнения поступившей команды отладки. При этом выполнение прикладной программы слегка притормаживается. Обсуждаемые так называемые аппаратные команды отладки могут поступать в блок BDM от персонального компьютера не чаще, чем 1 раз в 150 машинных циклов. Перечень аппаратных команд отладки представлен в табл. 3.3. В табл. 3.4. дано описание этих команд.
№ команды Имя команды Код операции Данные 1 BACKGROUND 90 – (нет) 2 READ_BD_BYTE E4 16 бит адреса, 16 бит данных (вывод) 3 STATUS E4 FF01, 00000000 (вывод) 4 FF01, 10000000 (вывод) 5 FF01, 110000000 (вывод) 6 READ_BD_WORD EC 16 бит адреса, 16 бит данных (вывод) 7 READ_BYTE E0 16 бит адреса, 16 бит данных (вывод) 8 READ_WORD E8 16 бит адреса, 16 бит данных (вывод) 9 WRITE_BD_BYTE C4 16 бит адреса, 16 бит данных (ввод) 10 ENABLE_FIRMWARE C4 FF01, 1xxxxxxx (ввод) 11 WRITE_BD_ WORD CC 16 бит адреса, 16 бит данных (ввод) 12 WRITE_BYTE C0 16 бит адреса, 16 бит данных (ввод) 13 WRITE_ WORD C8 16 бит адреса, 16 бит данных (ввод)
Табл. 3.3. Команды отладки, исполняемые аппаратными средствами модуля отладки BDM
№ команды по табл.3.3 Описание команды 1 Ввод в режим отладки с использованием монитора BDM 2 Чтение байта из области памяти блока BDM. Адрес указан в команде. Если адрес четный, то искомый байт содержится в старшем байте возвращаемого 16-ти разрядного слова. Если адрес нечетный, то искомый байт в младшем байте 16-разрядного слова. 3 Частный случай команды READ_BD_BYTE. Производится чтение регистра состояния модуля BDM. Считанный код 00000000 означает, что МК не может быть переведен в режим отладки и работает только под управлением прикладной программы. 4 Частный случай команды READ_BD_BYTE. Производится чтение регистра состояния модуля BDM. Считанный код 10000000 означает, что режим отладки разрешен и МК может быть переведен в режим отладки инструкцией BACKGROUND из табл. 3.3. 5 Частный случай команды READ_BD_BYTE. Производится чтение регистра состояния модуля BDM. Считанный код 11000000 означает, что МК находится в режиме отладки. 6 Чтение 16 разрядного слова из области памяти блока BDM по указанному в команде адресу. Адрес должен быть четным и указывать на старший байт возвращаемого из МК слова. 7 Чтение байта из области памяти МК. Адрес указан в команде. Если адрес четный, то искомый байт содержится в старшем байте возвращаемого 16-тиразрядного слова. Если адрес нечетный, то искомый байт в младшем байте 16 разрядного слова. 8 Чтение слова из области памяти МК по указанному в команде адресу. Адрес должен быть четным и указывать на старший байт возвращаемого из МК слова. 9 Запись байта в область памяти блока BDM. Если в команде указан четный адрес, то байт для записи содержится в старшем байте передаваемого 16-тиразрядного слова. Если адрес нечетный, то байт для записи — в младшем байте 16 разрядного слова. 10 Частный случай команды WRITE_BD_BYTE. Производится запись в регистр состояния STATUS модуля BDM. Передаваемый в регистр состояния код 1xxxxxxx разрешает работу программно аппаратных средств модуля отладки BDM. Для перевода МК в режим отладки необходимо далее подать команду BACKGROUND из табл. 3.3. 11 Запись слова в область памяти блока BDM по указанному в команде адресу. Адрес должен быть четным и указывать на старший байт передаваемого в память BDM слова. 12 Запись байта в область памяти МК. Если в команде указан четный адрес, то байт для записи содержится в старшем байте передаваемого 16-ти разрядного слова. Если адрес нечетный, то байт для записи — в младшем байте 16-разрядного слова. 13 Запись слова в область памяти МК по указанному в команде адресу. Адрес должен быть четным и указывать на старший байт передаваемого в память МК слова.
Табл. 3.4. Описание аппаратных команд модуля отладки BDM
Другая часть команд отладки исполняется под управлением программы монитора отладки, которая хранится в ПЗУ модуля BDM. Это ПЗУ располагается в общем адресном пространстве МК по адресам 0xFF00…0xFFFF. Память блока BDM доступна только в режиме отладки. В рабочем режиме ячейки памяти с этими адресами используются для других целей, в частности для размещения векторов прерываний. Перечень команд, исполняемых монитором отладки, представлен в табл. 3.5.
Имя команды Код операции Данные Описание GO 08 — Исполнять прикладную программу 10 ТRAСЕ1 — Выполнить одну команду прикладной программы и вернуться в монитор отладки 18 TAGGO — Разрешить режим отладки и вернуться к исполнению прикладной программы WRITE_NEXT 42 16 бит данных (ввод) X=X+2. Записать следующее слово по 0,X WRITE_PC 43 16 бит данных (ввод) Записать данные в счетчик команд WRITE_D 44 16 бит данных (ввод) Записать данные в аккумулятор D WRITE_X 45 16 бит данных (ввод) Записать данные в регистр X WRITE_Y 46 16 бит данных (ввод) Записать данные в регистр Y WRITE_SP 47 16 бит данных (ввод) Записать данные в указатель стека READ_NEXT 62 16 бит данных (вывод) X=X+2. Читать следующее слово по 0,X READ_PC 63 16 бит данных (вывод) Читать счетчик команд READ_D 64 16 бит данных (вывод) Читать аккумулятор D READ_X 65 16 бит данных (вывод) Читать регистр X READ_Y 66 16 бит данных (вывод) Читать регистр Y READ_SP 67 16 бит данных (вывод) Читать указатель стека
Табл. 3.5. Команды отладки, исполняемые монитором BDM
Для того, чтобы использование команд монитора отладки стало возможным, необходимо сначала установить бит ENBDM в регистре состояния STATUS (0xFF01), а затем выполнить команду BACKGROUND. Формат регистра состояния STATUS представлен на рис. 3.6.
Рис. 3.6. Формат регистра состояния модуля отладки ВDМ
Запись бита разрешения работы монитора отладки ENBDM осуществляется командой ENABLE_FIRMWARE из перечня аппаратных команд BDM (табл. 3.3). Отметим, что если МК 68HC12B32 сконфигурирован для работы в однокристальном режиме, то во время сброса бит ENBDM устанавливается в 1. Аппаратная команда отладки BACKGROUND также передается из персонального компьютера. Эта команда переводит МК в режим работы под управлением монитора отладки, когда центральный процессор на время прекращает выполнение основной программы и реализует команды монитора отладки. Для выполнения команд монитора отладки модуль BDM анализирует состояние внутренних магистралей МК. Если команда монитора требует для реализации только один машинный цикл, то работа прикладной программы не нарушается. Если же монитору необходимо несколько циклов, то работа процессора приостанавливается до завершения выполнения отладочной команды.
В области памяти модуля BDM расположены пять служебных регистров (табл. 3.6). Регистр INSTRUCTION хранит переданный из персонального компьютера код исполняемой команды отладки.
Адрес Имя регистра 0xFF00 INSTRUCTION — регистр кода выполняемой команды BDM 0xFF01 STATUS — регистр состояния блока BDM 0xFF02–0xFF03 SHIFTER — данные, передаваемые блоком BDM 0xFF04–0xFF05 ADDRESS — адрес регистра или ячейки памяти BDM 0xFF06 CCRSAV — содержимое регистра признаков CCR
Табл. 3.6. Регистры модуля отладки BDM
Регистр состояния STATUS (рис. 3.6) отражает текущий режим работы модуля BDM. Бит ENBDM установлен, если работа программы монитора отладки разрешена, т.е. могут реализовываться не только аппаратные, но и программно исполняемые команды отладки. Установленный в 1 бит BDMACT показывает, что МК прекратил выполнение прикладной программы и ожидает поступления команды отладки. Бит ENTAG отражает перевод МК в специальный режим тегирования команд. Этот режим устанавливается после исполнения команды TAGGO монитора отладки (табл. 3.5). Бит SDV является служебным битом монитора отладки, он отражает наличие данных в регистре SHIFTER блока BDM. И, наконец, бит TRACE — это признак работы МК в режиме трассировки, который назначается после исполнения инструкции TRACE1 из списка табл. 3.5.
Регистр сдвига SHIFTER предназначен для хранения данных, передаваемых или получаемых модулем отладки по последовательному интерфейсу.
Регистр ADDRESS хранит принятый в команде отладки адрес регистра или ячейки памяти. В регистре CCRSAV сохраняется состояние регистра признаков CCR центрального процессора во время исполнения команд монитора отладки.
Режим тегирования используется для автоматического перевода МК в режим отладки при исполнении команды, которая ранее была отмечена программистом для более подробного рассмотрения результатов ее исполнения.
Обсудив принципы организации режима отладки для МК семейства 68HC12, мы перейдем к рассмотрению программно аппаратных средств отладки, которые используют режим BDM и обеспечивают простой и удобный интерфейс пользователя.
3.13.3. Аппаратные и программные средства отладчика P&E от компании PEMICRO
В данном параграфе представлены краткие сведения об аппаратных и программных средствах отладки для МК семейства 68HC12, которые используют порт модуля BDM для связи с микроконтроллером. Мы остановимся на описании возможных режимов отладки с использованием пакета внутрисхемного отладчика ICD12Z в составе интегрированной среды разработки WinIDE Pemicro HC12. Отладчики от других производителей работают схожим образом. Используя набок предоставляемых команд отладки, пользователь может обнаружить и зафиксировать ошибки в исполнении программы. Набор команд отладки приведен в табл. 3.7 и 3.8.
Имя команды Описание А или АСС Установить значение аккумулятора А B Установить значение аккумулятора В BR Установить контрольную точку CCR Установить значение регистра признаков CLEARSYMBOL Очистить массив символов CODE Показать дизассемблированный код в окне отладчика «Code window» DASM Дизассемблировать инструкцию DUMP Отобразить память в окне журнала отладки «Status window» EXIT Выйти в DOS G или GO Запустить программу на исполнение GONEXT Выполнить, начиная с текущего состояния счетчика PC до начала следующего оператора GOTILROM Выполнить, начиная с текущего состояния счетчика PC до достижения указанного адреса в ПЗУ HELP Показать справочную информацию IX Установить значение индексного регистра X LF или LOGFILE Открыть или закрыть файл журнала отладки LOADALL Выполнить команды загрузки LOAD и LOADМAP LOADV Выполнить команды загрузки LOAD и побайтового сравнения VERIFY MACRO Выполнить файл макрокоманд MACROSTART Начать запись файла макрокоманд MD или MDx Отобразить содержимое ячеек памяти в окне «Memory window» N Установить/сбросить бит знака N в регистре признаков CCR REG Отобразить регистры центрального процессора в окне журнала отладки «Status window» RTVAR Отобразить заданный адрес и содержимое ячейки с этим адресом в окне переменных «Variable window» S Установить/сбросить бит S в регистре признаков CCR SERIAL Установить параметры обмена для последовательного порта SERIALON Открыть окно интерфейса связи с отладочной платформой SS Выполнить один оператор программы на языке исходного текста STEP or ST or Т Выполнить один оператор (команда пошаговой отладки) STEPTIL Выполнять команду пошаговой отладки, начиная с текущего состояния счетчика PC до заданного адреса Т [n] Выполнить заданное число n команд пошаговой отладки ТRAСЕ Запустить программу на исполнение и включить режим трассировки V Установить/сбросить бит переполнения V в регистре признаков CCR VERIFY Сравнить содержимое памяти программ МК с кодами файла в формате S19 WHEREIS Отобразить код названного символа Z Установить/сбросить бит нулевого результата Z в регистре признаков CCR
Табл.3.7. Команды интерфейса пользователя отладчика P&E
Имя команды Описание ASM [add] Записать в память по заданному адресу код введенной команды BELL Подать звуковой сигнал BF Заполнить блок памяти константой С Установить/сбросить бит нулевого переполнения C в регистре признаков CCR CLEARMAP Очистить файл карты памяти COLORS Изменение цветовой гаммы интерфейса пользователя D Установить значение аккумулятора D DUMP_TRACE Вывести содержимое памяти трассировки в окно «Debug window» EVAL Вычислить выражение FILL Заполнить блок памяти константой (аналог BF) GOUNTIL Выполнить программу до указанного адреса H Установить/сбросить бит дополнительного переноса H в регистре признаков CCR I Установить/сбросить бит глобальной маски прерывания I в регистре признаков CCR IY Установить значение индексного регистра Y LOAD Загрузить файл в формате S19 LOADMAP Загрузить файл символьных имен *.map LOAD_BIN Загрузить файл исполняемого кода с указанного в команде адреса LPT1, LPT2, LPT3 Выбрать параллельный порт для обмена МACROEND Остановить запись файла макрокоманд МACS Вывести перечень макрокоманд мм or МЕМ Изменить содержимое ячеек памяти NOBR Сбросить все контрольные точки QUIT Выход из программы REM Добавить комментарии к файлу макрокоманд RESET Имитировать сброс микроконтроллера RUN Начать исполнение программы SCRIPT Выполнить файл макрокоманд SERIALOFF Закрыть окно интерфейса связи с отладочной платформой SHOWTRACE Показать результаты трассировки SOURCEPATH Указать имя и путь к файлу STATUS Отобразить регистры центрального процессора в окне журнала отладки «Status window» STEPFOR Выполнить по шагам до контрольной точки SYMBOL Добавить символ в текущий список символьных имен TIME Показать время исполнения программы UPLOAD_SREC Обновить содержимое ячеек памяти на экране отладчика VAR Показать значение переменной или ячейки памяти в окне переменных «Variable window» VERSION Показать версию программного обеспечения X Установить/сбросить бит X в регистре признаков CCR
Табл.3.8. Команды интерфейса пользователя отладчика P&E
На рис. 3.7. представлен необходимый для организации процесса отладки набор аппаратных средств. На рис. 3.8. показан вид экрана монитора компьютера в процессе использования пакета отладчика ICD12Z. Как показано на рис., пользователь имеет доступ к регистрам центрального процессора (левое верхнее окно), может наблюдать за изменением используемых в программе символьных переменных (среднее верхнее окно), следить за состоянием и изменять по желанию коды в ячейках памяти (правое верхнее окно), исходный текст отлаживаемой программы (два средних окна), осуществлять ввод команд отладки и наблюдать за их исполнением в окне состояния (нижнее окно).
Рис. 3.7. Система отладки на основе интерфейса BDM и платы микроконтроллером 68HC12B32
Рис. 3.8. Интерфейс пользователя отладчика P&E ICD12Z компании PEMICRO
Вы можете также организовать процесс отладки, используя другие аппаратные средства, например две платы MC68HC912B32EVB. На рис. 3.9. показана инсталляция аппаратных средств для этого случая. Одна из отладочных плат используется в качестве отладочного интерфейса BDM между персональным компьютером и платой, которая подлежит отладке. К плате MC68HC912B32EVB прилагается программное обеспечение — Motorola D-Bug12 монитор, который и будет использован для управления процессом отладки. Для того, чтобы воспользоваться таким режимом работы платы MC68HC912B32EVB, следует установить переключатели W3 и W4 платы в состояние 0 и 1 соответственно. Далее подсоединить кабель BDM от платы интерфейса к оставшейся плате MC68HC912B32EVB. Эта вторая плата будет платой целевой системы. Подключите источник питания к целевой системе. При этом плата интерфейса отладки будет питаться от этого же источника, используя BDM кабель. Теперь Вы можете использовать команды монитора отладки Motorola D-Bug12 для управления исполнением испытуемой прикладной программой.
Рис. 3.9. Система отладки на основе двух отладочных плат с микроконтроллером 68HC12B32
3.13.4. Эмуляторы
Другой способ отладки прикладной программы — использование программного пакета класса эмулятор, который изображает ход исполнения прикладной программы и при этом генерирует все аппаратные сигналы, которые были бы на выходе реального МК. Такие эмуляторы выпускают компании Noral и Hitex.
Эмуляторы полезны для тех пользователей, которые не могут купить настоящих аппаратных средств отладки. Вместе с тем, эмуляторы не следует использовать для завершающих этапов проверки работоспособности тех систем, которые жестко привязаны к реальному времени. Эмуляторы, исходя из своего принципа действия, используют персональный компьютер. Поскольку частота тактирования персонального компьютера отличается от частоты тактирования МК HC12, то и корректную имитацию исполнения программы в реальном времени гарантировать нельзя. Однако следует заметить, что некоторые компании предлагают эмуляторы с полной имитацией всех временных характеристик МК.
3.13.5. Логические анализаторы
Логический анализатор — это интеллектуальный электронный измерительный прибор, который используется для запоминания, отображения на экране и измерения временных параметров нескольких существующих одновременно логических сигналов. Функции логического анализатора по исследованию и наладке цифровых систем аналогичны функциям осциллографа для аналоговых систем. На рис. 3.10 представлена фотография логического анализатора компании Hewlett Packard, в настоящее время аналогичные приборы выпускаются под маркой Agilent.
Рис. 3.10. Логический анализатор фирмы Agilent Technologies
Исследуемое устройство подключается к логическому анализатору посредством набора пробников со специальными пружинными контактами. Число одновременно наблюдаемых на экране логических сигналов может достигать двадцати, что позволяет разработчику проверить реальное состояние магистралей адреса, данных и управления при взаимодействии различных интегральных схем системы. Отличительная особенность логического анализатора — возможность запоминания группы логических сигналов в течение длительного времени во внутренней памяти прибора. Позднее эти сигналы могут быть воспроизведены на экране прибора с целью анализа и измерения временных параметров.
Логический анализатор чрезвычайно полезен при поиске неисправностей в программе управления при взаимодействии микроконтроллера с другими периферийными ИС системы. В этом случае логический анализатор позволяет наблюдать одновременное состояние всех линий связи МК с ИС и установить, какие сигналы генерируются программой МК неверно, вследствие чего неверно реализуется обмен данными между МК и ИС.
3.14. Особенности компилятора и ассемблера