При обнаружении какой-либо ошибки компоновщик выводит на экран монитора сообщение, в котором указывается характер ошибки, а также предупреждение об аварийном завершении работы:
**XLINK ABORTED**
Отладка программы
3.5.1. Отладкой (debugging) называется процесс обнаружения, локализации и устранения ошибок в программе.
Отладка разрабатываемой программы выполняется с помощью программы-отладчика на IBM-совместимом компьютере или с помощью программно-аппаратных средств, обзор которых приведен в книге [ 2 ].
В настоящем учебном пособии рассмотрена отладка программы с помощью эмулятора ПЗУ, который является самым доступным для начинающих разработчиков аппаратным средством отладки. Эмулятор ПЗУ – это устройство, которое подклю-чается к панели ПЗУ, установленной на плате микропроцессорной системы, вместо микросхемы ПЗУ и полностью имитирует работу этой микросхемы. Исполняемая программа загружается в эмулятор ПЗУ с помощью компьютера, с которым эмулятор связан последовательным или параллельным каналом передачи данных..
Автор в своей повседневной работе использует эмулятор ПЗУ ЧИП32-02, созданный инженерами фирмы “ЭФО” (г. Санкт-Петербург). Этот эмулятор подключается к последовательному порту компьютера и предназначен для имитации работы микросхем EPROM типов 27(С)64, 27(С)128, 27(С)256. Техническое описание и инструкция по эксплуатации эмулятора приведены в прил. 2.
3.5.2. Для загрузки программы в эмулятор ПЗУ ЧИП-32-02 используется следующая командная строка:
chip.exe <*.hex> <EPROM-type> <COM-number>,
где chip.exe – имя исполняемого файла программы-загрузчика,
*.hex – имя hex-файла загружаемой программы,
EPROM-type – тип имитируемого ПЗУ (64, 128 или 256),
COM-number – номер последовательного порта компьютера (1 или 2),
к которому подключен эмулятор ПЗУ.
Запуск загруженной программы выполняется с помощью аппаратного сброса микропроцессорной системы.
3.5.3. При отладке программы полезно создать командный файл, в котором бы содержались все команды, необходимые для трансляции, компоновки и загрузки отлаживаемой программы в эмулятор ПЗУ.
Такой командный файл (присвоим ему имя make_all.bat) может состоять, например, из следующих команд:
A8051 program.msa
xlink 8051 program.r03 /O=program.hex
Chip.exe program.hex 256 2
Теперь достаточно запустить командный файл make_all.bat для того, чтобы программа, исходный модуль которой имеет имя program.msa, была оттранслирована, скомпонована и загружена в эмулятор ПЗУ, подключенный к порту COM2 компьютера.
3.5.4. После исправления ошибок, выявленных в процессе отладки, программу записывают в ПЗУ (с помощью специального программатора, работающего под управлением компьютера), эмулятор ПЗУ отключают от микропроцессорной системы, а в панель ПЗУ устанавливают микросхему с “зашитой” программой.
На этом завершается разработка программы и начинается ее эксплуатация.
ЛИТЕРАТУРА
Гилмор Ч. Введение в микропроцессорную технику: Пер. с англ. – М: Мир, 1984. – 334 с.
Гребнев В.В. Незнакомое знакомое семейство. Однокристальные микроЭВМ семейства MCS-51 фирмы Intel. – Псков: Псковская коммерческая палата, 1996. – 47 с.
Першиков В.М., Савинков В.М. Толковый словарь по информатике. – М.: Финансы и статистика, 1991. – 543 с.
Сташин В.В., Урусов А.В., Мологонцева О.Ф. Проектирование цифровых устройств на однокристальных микроконтроллерах. – М.: Энергоатомиздат, 1990. – 224 с.
MCS 51 Microcontroller Family User’s Manual.– Intel Corporation, 1994.
ПРИЛОЖЕНИЕ 1
СИСТЕМА КОМАНД МК СЕМЕЙСТВА MCS-51
Таблица П.1
Мнемокод | КОП | Б | Ц | Мнемокод | КОП | Б | Ц |
ACALL 0xxH | ADDC A,R6 | 3E | |||||
ACALL 1xxH | ADDC A,R7 | 3F | |||||
ACALL 2xxH | ADDC A,@R0 | ||||||
ACALL 3xxH | ADDC A,@R1 | ||||||
ACALL 4xxH | ADDC A,#data | ||||||
ACALL 5xxH | B1 | AJMP 0xxH | |||||
ACALL 6xxH | D1 | AJMP 1xxH | |||||
ACALL 7xxH | F1 | AJMP 2xxH | |||||
ADD A,addr | AJMP 3xxH | ||||||
ADD A,R0 | AJMP 4xxH | ||||||
ADD A,R1 | AJMP 5xxH | A1 | |||||
ADD A,R2 | 2A | AJMP 6xxH | C1 | ||||
ADD A,R3 | 2B | AJMP 7xxH | E1 | ||||
ADD A,R4 | 2C | ANL A,addr | |||||
ADD A,R5 | 2D | ANL A,R0 | |||||
ADD A,R6 | 2E | ANL A,R1 | |||||
ADD A,R7 | 2F | ANL A,R2 | 5A | ||||
ADD A,@R0 | ANL A,R3 | 5B | |||||
ADD A,@R1 | ANL A,R4 | 5C | |||||
ADD A,#data | ANL A,R5 | 5D | |||||
ADDC A,addr | ANL A,R6 | 5E | |||||
ADDC A,R0 | ANL A,R7 | 5F | |||||
ADDC A,R1 | ANL A,@R0 | ||||||
ADDC A,R2 | 3A | ANL A,@R1 | |||||
ADDC A,R3 | 3B | ANL A,#data | |||||
ADDC A,R4 | 3C | ANL addr,A | |||||
ADDC A,R5 | 3D | ANL addr,#data |
Таблица П.1 (продолжение)
Мнемокод | КОП | Б | Ц | Мнемокод | КОП | Б | Ц |
ANL C,bit | DEC R7 | 1F | |||||
ANL C,/bit | B0 | DEC @R0 | |||||
CJNE A,addr,rel | B5 | DEC @R1 | |||||
CJNE A,#data,rel | B4 | DIV AB | |||||
CJNE R0,#data,rel | B8 | DJNZ addr,rel | D5 | ||||
CJNE R1,#data,rel | B9 | DJNZ R0,rel | D8 | ||||
CJNE R2,#data,rel | BA | DJNZ R1,rel | D9 | ||||
CJNE R3,#data,rel | BB | DJNZ R2,rel | DA | ||||
CJNE R4,#data,rel | BC | DJNZ R3,rel | DB | ||||
CJNE R5,#data,rel | BD | DJNZ R4,rel | DC | ||||
CJNE R6,#data,rel | BE | DJNZ R5,rel | DD | ||||
CJNE R7,#data,rel | BF | DJNZ R6,rel | DE | ||||
CJNE @R0,#data,rel | B6 | DJNZ R7,rel | DF | ||||
CJNE @R1,#data,rel | B7 | INC A | |||||
CLR A | E4 | INC addr | |||||
CLR bit | C2 | INC DPTR | A3 | ||||
CLR C | C3 | INC R0 | |||||
CPL A | F4 | INC R1 | |||||
CPL bit | B2 | INC R2 | 0A | ||||
CPL C | B3 | INC R3 | 0B | ||||
DA A | D4 | INC R4 | 0C | ||||
DEC A | INC R5 | 0D | |||||
DEC addr | INC R6 | 0E | |||||
DEC R0 | INC R7 | 0F | |||||
DEC R1 | INC @R0 | ||||||
DEC R2 | 1A | INC @R1 | |||||
DEC R3 | 1B | JB bit,rel | |||||
DEC R4 | 1C | JBC bit,rel | |||||
DEC R5 | 1D | JC rel | |||||
DEC R6 | 1E | JMP @A+DPTR |
Таблица П.1 (продолжение)
Мнемокод | КОП | Б | Ц | Мнемокод | КОП | Б | Ц |
JNB bit,rel | MOV addrD,addrS | ||||||
JNC rel | MOV bit,C | ||||||
JNZ rel | MOV C,bit | A2 | |||||
JZ rel | MOV DPTR,#data16 | ||||||
LCALL addr16 | MOV R0,A | F8 | |||||
LJMP addr16 | MOV R0,addr | A8 | |||||
MOV A,addr | E5 | MOV R0,#data | |||||
MOV A,R0 | E8 | MOV R1,A | F9 | ||||
MOV A,R1 | E9 | MOV R1,addr | A9 | ||||
MOV A,R2 | EA | MOV R1,#data | |||||
MOV A,R3 | EB | MOV R2,A | FA | ||||
MOV A,R4 | EC | MOV R2,addr | AA | ||||
MOV A,R5 | ED | MOV R2,#data | 7A | ||||
MOV A,R6 | EE | MOV R3,A | FB | ||||
MOV A,R7 | EF | MOV R3,addr | AB | ||||
MOV A,@R0 | E6 | MOV R3,#data | 7B | ||||
MOV A,@R1 | E7 | MOV R4,A | FC | ||||
MOV A,#data | MOV R4,addr | AC | |||||
MOV addr,A | F5 | MOV R4,#data | 7C | ||||
MOV addr,R0 | MOV R5,A | FD | |||||
MOV addr,R1 | MOV R5,addr | AD | |||||
MOV addr,R2 | 8A | MOV R5,#data | 7D | ||||
MOV addr,R3 | 8B | MOV R6,A | FE | ||||
MOV addr,R4 | 8C | MOV R6,addr | AE | ||||
MOV addr,R5 | 8D | MOV R6,#data | 7E | ||||
MOV addr,R6 | 8E | MOV R7,A | FF | ||||
MOV addr,R7 | 8F | MOV R7,addr | AF | ||||
MOV addr,@R0 | MOV R7,#data | 7F | |||||
MOV addr,@R1 | MOV @R0,A | F6 | |||||
MOV addr,#data | MOV @R0,addr | A6 |
Таблица П.1 (продолжение)
Мнемокод | КОП | Б | Ц | Мнемокод | КОП | Б | Ц |
MOV @R0,#data | POP addr | D0 | |||||
MOV @R1,A | F7 | PUSH addr | C0 | ||||
MOV @R1,addr | A7 | RET | |||||
MOV @R1,#data | RETI | ||||||
MOVC A,@A+DPTR | RL A | ||||||
MOVC A,@A+PC | RLC A | ||||||
MOVX A,@DPTR | E0 | RR A | |||||
MOVX A,@R0 | E2 | RRC A | |||||
MOVX A,@R1 | E3 | SETB bit | D2 | ||||
MOVX @DPTR,A | F0 | SETB C | D3 | ||||
MOVX @R0,A | F2 | SJMP rel | |||||
MOVX @R1,A | F3 | SUBB A,addr | |||||
MUL AB | A4 | SUBB A,R0 | |||||
NOP | SUBB A,R1 | ||||||
ORL A,addr | SUBB A,R2 | 9A | |||||
ORL A,R0 | SUBB A,R3 | 9B | |||||
ORL A,R1 | SUBB A,R4 | 9C | |||||
ORL A,R2 | 4A | SUBB A,R5 | 9D | ||||
ORL A,R3 | 4B | SUBB A,R6 | 9E | ||||
ORL A,R4 | 4C | SUBB A,R7 | 9F | ||||
ORL A,R5 | 4D | SUBB A,@Ri | |||||
ORL A,R6 | 4E | SUBB A,@R1 | |||||
ORL A,R7 | 4F | SUBB A,#data | |||||
ORL A,@R0 | SWAP A | C4 | |||||
ORL A,@R1 | XCH A,addr | C5 | |||||
ORL A,#data | XCH A,R0 | C8 | |||||
ORL addr,A | XCH A,R1 | C9 | |||||
ORL addr,#data | XCH A,R2 | CA | |||||
ORL C,bit | XCH A,R3 | CB | |||||
ORL C,/bit | A0 | XCH A,R4 | CC |
Таблица П.1 (продолжение)
Мнемокод | КОП | Б | Ц | Мнемокод | КОП | Б | Ц |
XCH A,R5 | CD | XRL A,R3 | 6B | ||||
XCH A,R6 | CE | XRL A,R4 | 6C | ||||
XCH A,R7 | CF | XRL A,R5 | 6D | ||||
XCH A,@R0 | C6 | XRL A,R6 | 6E | ||||
XCH A,@R1 | C7 | XRL A,R7 | 6F | ||||
XCHD A,@R0 | D6 | XRL A,@R0 | |||||
XCHD A,@R1 | D7 | XRL A,@R1 | |||||
XRL A,addr | XRL A,#data | ||||||
XRL A,R0 | XRL addr,A | ||||||
XRL A,R1 | XRL addr,#data | ||||||
XRL A,R2 | 6A |
Условные обозначения:
КОП – код операции,
Б – количество байтов в машинном коде команды,
Ц – количество машинных циклов,
addr – прямой адрес байта (число или символическое имя),
bit – прямой адрес бита (число или символическое имя),
data – значение константы (число),
rel – 8-битный относительный адрес (метка),
addr11 – 11-битный абсолютный адрес (метка),
addr16 – 16-битный абсолютный адрес (метка),
A – аккумулятор
PC – программный счетчик.
ПРИЛОЖЕНИЕ 2
ЭМУЛЯТОР ПЗУ ЧИП32-02
НАЗНАЧЕНИЕ
1.1 Эмулятор ПЗУ ЧИП32-02 (в дальнейшем эмулятор) предназначен для аппаратной имитации работы микросхем ПЗУ с ультрафиолетовым стиранием и объемом памяти 8Кх8, 16Кх8 и 32Кх8 бит.
1.2 Область применения эмулятора – отладка программного обеспечения микропроцессорных систем.
1.3 Эмулятор рассчитан на работу с внешним IBM-совместимым персональным компьютером.