Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_otmp / Keil_51_v750a_OK_work / gs51_ch5_rus.doc
Скачиваний:
25
Добавлен:
14.04.2015
Размер:
477.18 Кб
Скачать

127

Н ачинаем работу и создание приложений

Глава 5. Отладка программ

Отладчик µVision2

Вы можете использовать отладчик среды µVision2 для отладки программ, которые вы разрабатываете при помощи компилятора С51 и макроассемблера А51. Отладчик µVision2 имеет два рабочих режима, нужный режим может быть выбран в диалоговом окне Options for Target на закладке Debug:

Использовать симулятор (Use Simulator) – позволяет Вам сконфигурировать отладчик µVision2 как только программный продукт, который симулирует большинство свойств микроконтроллеров семейства 8051 без необходимости в действительности иметь целевое «железо». Вы можете тестировать и отлаживать Ваше встраиваемое приложение до того как будет готово «железо». Отладчик µVision2 симулирует большой набор периферии, включая последовательный порт, внешний ввод-вывод и таймеры. Набор периферии выбирается, когда Вы выбираете тип целевого процессора из базы данных поддерживаемых устройств.

Использовать дополнительные GDI драйвера, такие как интерфейс с Keil Monitor 51 (Use Keil Monitor 51). Используя дополнительный драйвер GDI интерфейса, Вы можете подключать отладчик непосредственно к эмулятору или к программе Keil Monitor. Для получения более подробной информации см. главу 11 «Использование программы Monitor-51» на странице 199.

Симуляция процессора

Симулятор µVision2 имитирует до 16 Мбайт памяти, которая может быть разделена на области, к которым назначается доступ для чтения, записи или исполнения программы. Симулятор µVision2 перехватывает и сигнализирует о недопустимом обращении к памяти.

В дополнение к распределению памяти симулятор также поддерживает интегрированную периферию для множества модификаций 8051. Встроенная периферия выбранного Вами процессора конфигурируется согласно данным из базы данных устройств. При создании целевого проекта Вы выбираете из базы данных устройств необходимый тип процессора. См. на стр. 58 подробную информацию о том, как выбирать тип устройства.

Вы можете выбрать и показать на экране компоненты встроенной периферии, используя меню Debug. Вы также можете изменить настройки каждого периферийного модуля, используя элементы управления в соответствующих диалоговых окнах.

Запуск сеанса отладки

Вы можете запустить режим отладки в среде µVision2 командой меню Debug – Start/Stop Debug Session. В зависимости от конфигурации заданной на закладке Debug диалога Options for Target, отладчик µVision2 загрузит отлаживаемую программу и запустит на исполнение программу инициализации. Для получения информации о конфигурации отладчика µVision2 см. стр. 101. Среда µVision2 сохраняет расположение окон в режиме редактирования и восстанавливает расположение окон во время последнего сеанса отладки. Когда выполнение отлаживаемой программы останавливается, то отладчик µVision2 открывает окно редактирования с исходным текстом или показывает инструкции процессора в окне дизассемблера. Следующая инструкция, которая будет исполнена, отмечается желтой стрелкой.

В течение сеанса отладки большинство возможностей редактирования остаются доступными. Например, Вы можете использовать команду поиска текста или исправлять ошибки в программе. Исходный текст Вашей программы отображается в тех же самых окнах редактирования. Режим отладки среды µVision2 отличается от режима редактирования в таких аспектах:

  • Доступны меню «Debug» и команды «Debug», описанные на стр. 28. Дополнительные отладочные окна обсуждаются далее.

  • Структура проекта или параметры компилятора/линкера не могут быть изменены. Запрещены все команды компиляции и компоновки программы.

Окно дизассемблера (Disassembly)

Окно дизассемблера показывает Вашу программу как смесь исходного текста и соответствующих инструкций ассемблера или только как ассемблерный код. Историю трассировки ранее исполненных инструкций можно вывести на экран командой меню Debug – View Trace Records. Чтобы разрешить трассировку выберите меню Debug – Enable/Disable Trace Recording.

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

Вы можете использовать диалоговое окно DebugInline Assembly, чтобы модифицировать инструкции процессора. Эта возможность позволяет Вам корректировать ошибки или производить временные изменения в коде отлаживаемой программы.

Точки останова (Breakpoints)

Отладчик µVision2 позволяет Вам определить точки останова несколькими различными способами. Вы можете устанавливать точки останова программы (Execution Breaks) уже на этапе редактирования исходного текста программы, даже до того как программа будет оттранслирована. Точки останова могут быть определены и модифицированы одним из следующих способов:

  • С помощью кнопок на панели File Toolbar. Просто выберите строку кода в окне редактирования или в окне дизассемблера и щелкните по кнопке, относящейся к точкам останова.

  • С помощью команд, относящихся к точкам останова, из локального меню. Локальное меню открывается, когда вы щелкаете правой кнопкой мышки на строке с кодом в окне редактирования или в окне дизассемблера.

  • Диалоговое окно DebugBreakpointsпозволяет Вам просмотреть, установить или модифицировать настройки точек останова. Это диалоговое окно также позволяет Вам установить точки останова с различными атрибутами по доступу к памяти. См. пример ниже.

  • На странице Command окна Output Window Вы можете использовать команды BreakSet, BreakKill, BreakList, BreakEnable и BreakDisable.

Диалоговое окно DebugBreakpoints позволяет Вам просмотреть и модифицировать точки останова. Вы можете быстро запрещать или разрешать точки останова щелчком мыши на check box в списке Current Breakpoints. Двойной щелчок на элементе списка Current Breakpoints позволяет Вам модифицировать выбранную точку останова.

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

  • Если выражение представляет собой адрес в исполняемой программе, то будет определена точка останова – прерывание программы (Execution Break (E) ), которая активизируется при достижении указанного адреса программы. Задаваемый программный адрес должен адресовать первый байт [многобайтной] инструкции процессора.

  • Если в диалоговом окне выбран доступ к памяти (Access: Read, Write или оба сразу), то будет определена точка останова по доступу к памяти (Access Break (A) ), которая активизируется в момент соответствующей попытки обращения к памяти. Вы можете указать размер окна в байтах, внутри которого будет отслеживаться доступ к памяти, или указать размер объекта, заданного в выражении. Выражения для определения точки останова по доступу к памяти (Access Break) должны быть сокращены до вида указания адреса и типа памяти. Операторы (&, &&, <. <=. >, >=, = =, и !=) могут быть использованы для сравнения значения переменной до того как сработает точка останова по доступу к памяти или будет выполнена определенная команда (Command).

  • Если выражение не может быть сокращено до вида указания адреса памяти, то будет определена точка останова по условию ( Conditional Break (C) ), которая активизируется когда условное выражение принимает значение «истина». Условное выражение пересчитывается после каждой выполненной инструкции процессора, таким образом, скорость выполнения программы может существенно замедлиться.

Если Вы назначаете точке останова некоторую команду (Command), то отладчик µVision2 выполняет эту команду и продолжает выполнение Вашей отлаживаемой программы. В качестве команды Вы можете указать отладочную или сигнальную функцию µVision2. Чтобы остановить выполнение программы, установите системную переменную _break_ в ненулевое значение. Для получения большей информации см. «Системные переменные», стр. 113.

Значение счетчика (Count) определяет сколько раз заданное выражение для точки останова должно принять значение «истина» перед тем, как точка останова будет активизирована.

Примеры точек останова (Breakpoint):

Нижеследующие описания поясняют определения элементов в показанном выше диалоговом окне Breakpoint. Список текущих точек останова (Current Breakpoints) показывает сводку, в которой указаны тип точки останова и ее физический адрес вместе с выражением (Expression), назначенной командой (Command) и счетчиком (Count).

Expression: \Measure\143

Точка останова – прерывание программы (Execution Break (E)) – это выражение приведет к останову отлаживаемой программы, когда она достигнет участка кода, который соответствует строке 143 в модуле MEASURE.

Expression: main

Точка останова – прерывание программы (Execution Break (E)) – это выражение приведет к останову отлаживаемой программы, когда она достигнет функции main.

Expression: timer0 Command: printf ("Timer0 Interrupt occurred\n")

Точка остановапрерывание программы (Execution Break (E)) будет активирована при достижении программой функции timer0, при активизации будет напечатан текст "Timer0 Interrupt occurred" на странице Command окна Output Window. Эта точка останова запрещена в приведенном выше диалоговом окне Breakpoint.

Expression: save_measurements Count: 10

Точка останова – прерывание программы (Execution Break (E)) – это выражение приведет к останову отлаживаемой программы, когда функция save_measurements будет вызвана 10й раз.

Expression: mcommand == 1

Точка останова по условию (Contional Break (C)) – это выражение вызовет останов программы, когда mcommand == 1 примет значение «истина». Эта точка останова запрещена в приведенном выше диалоговом окне Breakpoint.

Expression: save_record[10] Access: Read Write Size: 3 Objects

Точка останова по доступу к памяти (Access Break (A)), которая остановит выполнение программы в момент, когда произойдет попытка чтения или записи элемента save_record[10] и 2х следующих за ним элементов. Поскольку save_record представляет собой структуру, размер которой составляет 16 байт, то действие такой точки останова распространяется на область в 48 байт.

Expression: sindex == 10 Access: Write

Точка останова по доступу к памяти (Access Break (A)), которая остановит выполнение программы, когда значение 10 будет записано в переменную sindex.

Expression: measure_display Command: MyStatus ()

Точка останова – прерывание программы (Execution Break (E)), которая вызовет исполнение отладочной функции µVision2 с названием MyStatus, когда отлаживаемая программа достигнет функции measure_display. Выполнение отлаживаемой программы будет продолжено после того, как будет выполнена отладочная функция MyStatus.

Выполнение отлаживаемой программы

Отладчик µVision2 позволяет Вам запускать Вашу программу на исполнение несколькими различными способами:

  • При помощи кнопок на панели инструментов Debug Toolbar или из «Debug Menu и Debug Commands», как это описано на странице 28.

  • При помощи команды Run till Cursor line локального меню. Локальное меню открывается, когда вы щелкаете правой кнопкой мыши на линии кода программы в окне редактора или дизассемблера.

  • На странице Command окна Output Window Вы можете использовать команды отладчика Go, Ostep, Pstep и Tstep.

Окно Watch

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

Страница Locals показывает все локальные переменные текущей функции. Страницы Watch отображают программные переменные, заданные пользователем. Вы можете добавить переменные одним из трех способов:

  • Выделите текст <enter here>1 щелчком мыши и подождите секунду. Следующий щелчок мыши2 поможет войти в режим редактирования, в котором Вы сможете добавить имя переменной. Таким же образом Вы можете изменять значения переменных.

  • В окне редактирования откройте контекстное меню щелчком правой кнопки мыши и выберите пункт меню Add to Watch Window. µVision2 автоматически выберет имя переменной под курсором. В альтернативном случае Вы можете выделить выражение перед вызовом контекстного меню.

  • В окне Output Window на странице Command Вы можете использовать команду WatchSet, чтобы ввести имя переменной.

Чтобы удалить переменную, щелкните на линии с переменной и нажмите клавишу Delete.

На странице Call Stack отображается стек вызовов для текущей функции. Вы можете сделать двойной щелчок на одной из линий в списке стека вызовов, чтобы увидеть в окне редактирования место, откуда была вызвана функция.

Регистры процессора (CPU Registers)

Регистры процессора отображаются в окне Project Window на странице Regs, и могут быть модифицированы тем же способом, что и переменные в окне Watch.

Окно дампа памяти (Memory Window)

Окно дампа памяти (Memory) отображает содержимое различных областей памяти. На разных страницах могут быть просмотрены до 4х различных областей памяти. Контекстное меню позволяет Вам выбрать формат вывода данных.

В поле Address окна Memory Вы можете ввести любое выражение, значение которого будет определять начальный адрес и тип области памяти, которую Вы хотите просмотреть. Для изменения содержимого памяти сделайте двойной щелчок по значению. Тогда будет открыто окно редактирования, в котором Вы сможете ввести новое значение ячейки памяти. Для обновления окна дампа памяти во время выполнения отлаживаемой программы необходимо разрешить опцию View – Periodic Window Update.

Инструментальная панель (Toolbox)

Инструментальная панель (Toolbox) содержит кнопки, определяемые пользователем. Щелчок по кнопке на панели Toolbox вызывает выполнение ассоциированной с кнопкой команды. Команды, назначенные кнопкам на панели Toolbox можно вызывать в любое время, даже во время выполнения тестируемой программы.

Кнопки на панели Toolbox определяются командой DEFINE BUTTON на странице Command окна Output Window. Синтаксис команды таков:

>DEFINE BUTTON "button_label", "command"

где

button_label

надпись, которая будет отображаться на кнопке на панели Toolbox;

command

Команда отладчика µVision2, которая будет выполнена при нажатии на кнопку.

Следующий пример показывает при помощи каких команд были созданы кнопки, показанные на рисунке (см. выше).

>DEFINE BUTTON "Decimal Output", "radix=0x0A"

>DEFINE BUTTON "Hex Output", "radix=0x10"

>DEFINE BUTTON "My Status Info", "MyStatus ()" /* вызов отладочной функции */

>DEFINE BUTTON "Analog0..5V", "analog0 ()" /* вызов сигнальной функции */

>DEFINE BUTTON "Show R15", "printf (\"R15=%04XH\\n\")"

ПРИМЕЧАНИЕ

Команда printf, заданная в определении последней кнопки в примере, показывает, как необходимо обращаться со вложенными строками. Символы двойной кавычки (") и обратного слэша (\) в строке форматирования должны предваряться эскейп-символом (\) во избежание синтаксических ошибок.

Вы можете удалить кнопку с панели Toolbox с помощью команды KILL BUTTON и указания номера кнопки. Например:

>Kill Button 5 /* Remove Show R15 button */

ПРИМЕЧАНИЕ

Кнопка Update Windows на панели Toolbox создается автоматически и не может быть удалена. Нажатие на кнопку Update Windows обновляет некоторые отладочные окна во время выполнения отлаживаемой программы.

Настройка параметров отладчика

Закладка Debug диалога Options for Target позволяет сконфигурировать отладчик µVision2.

Следующая таблица описывает опции доступные на закладке Debug:

Пункт

Описание

Use Simulator

Выбрать симулятор µVision2 в качестве отладочного механизма.

Use Keil Monitor-51 Driver

Выбрать Advanced GDI драйвер, с помощью которого отладчик будет подключаться к вашему отлаживаемому устройству. Драйвер Keil Monitor-51 Driver позволяет вам подключаться к целевой плате с установленным там Keil Monitor. В разработке находится несколько драйверов под эмулятор для µVision2 и OCDS.

Settings

Открывает конфигурационный диалог для выбранного Advanced GDI драйвера.

Остальные опции доступны отдельно как для секции Simulator, так и для секции Advanced GDI.

Load Application at Startup

Разрешите эту опцию для того, чтобы при запуске отладчика µVision2 автоматически загружалась ваша отлаживаемая программа.

Go till main ()

При запуске отладчика запустить выполнение программы до метки main.

Initialization File

При запуске отладчика обработать указанный файл как командный ввод.

Breakpoints

Восстанавливать настройки точек останова из предыдущей отладочной сессии.

Toolbox

Восстанавливать кнопки на панели Toolbox из предыдущей отладочной сессии.

Watchpoints & PA

Восстанавливать настройки окна Watch и анализатора работы программы (Performance Analyzer) из предыдущей отладочной сессии.

Memory Display

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

CPU DLL

Driver DLL

Parameter

Конфигурация внутренних отладочных библиотек µVision2. Эти настройки берутся из базы данных элементов (device database). Пожалуйста, не изменяйте имя библиотеки или параметры.

Окно терминала последовательного порта

(Serial Window)

Отладчик µVision2 имеет два окна терминала последовательного порта для симуляции последовательного ввода и вывода. В этом окне отображаются данные, посылаемые моделируемым процессором из своего последовательного порта. Символы, которые вы вводите в окне терминала, поступают на вход последовательного порта отлаживаемого процессора.

Окно терминала позволяет моделировать работу модуля UART микроконтроллера без дополнительного внешнего оборудования. Кроме того, последовательный порт моделируемого микроконтроллера может быть назначен аппаратному СОМ порту вашего компьютера при помощи команды ASSIGN. Команда ASSIGN вводится в окне Output Window на закладке Command.

Анализатор работы программы (Performance Analyzer)

Анализатор работы программы (Performance Analyzer) отладчика µVision2 отображает время выполнения заданных вами функций и диапазонов адресов.

Диапазон адресов <unspecified> генерируется анализатором автоматически. Он показывает, какое количество времени тратится на выполнение той части программы, которая не входит в указанные функции и диапазоны адресов.

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

Метка

Описание

min time

Минимальное время выполнения кода в выбранном диапазоне адресов или в функции.

max time

Максимальное время выполнения кода в выбранном диапазоне адресов или в функции.

avg time

Среднее время выполнения кода в выбранном диапазоне адресов или в функции.

total time

Суммарное время выполнения кода в выбранном диапазоне адресов или в функции.

%

Процент суммарного времени выполнения кода в выбранном диапазоне адресов или в функции (по отношению ко всему времени выполнения программы).

count

Показывает, сколько раз был выполнен код в указанном диапазоне адресов или в функции.

Для настройки параметров анализатора используйте команду Performance Analyzer в меню Debug. Также вы можете ввести команду PA в командном окне для установки диапазонов адресов или для печати результатов.

Покрытие кода (Code Coverage)

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

Диалоговое окноCode Coverage (покрытие кода) предоставляет вам соответствующую информацию и статистику. Вы можете напечатать эту информацию в командном окне (закладка Command в окне Output Window), используя команду COVERAGE.

Карта памяти (Memory Map)

Диалоговое окно Memory Map (карта памяти) позволяет вам указать области памяти, которые используются вашей программой для хранения данных и выполнения программы. Эти же действия по конфигурированию памяти вы можете произвести при помощи команды MAP.

При загрузке отлаживаемой программы, µVision2 автоматически определяет все доступные участки в адресном пространстве вашей программы. Обычно не возникает необходимости для определения дополнительных участков памяти. Вы должны определить только те участки памяти, доступ к которым происходит без явного определения переменных (в этих областях), например, для портов ввода-вывода, отображенных в память.

Диалоговое окно открывается через меню

Debug – Memory Map

Во время выполнения вашей отлаживаемой программы, отладчик µVision2 использует карту распределения памяти для проверки, что ваша программа не пытается обратиться к несуществующей области памяти. Для каждой области памяти вы можете указать допустимый метод обращения: Read (Чтение), Write (Запись), Execute (Выполнение), или их комбинацию.

Окно информации о символах (ViewSymbols Window)

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

Вы можете выбрать тип символов и задать фильтр для отображения необходимой информации.

Опции

Описание

Mode

Режим — позволяет выбрать PUBLIC, LOCALS или LINE. Общедоступные символы (PUBLIC) видимы по всей программе. Область видимости локальных символов (LOCALS) ограничена текущим модулем или функцией. Строки (LINES) представляют информацию о номерах строк исходного текста программы.

Current Module

Текущий модуль — позволяет выбрать исходный модуль, информация о символах которого должна быть отображена.

Mask

Маска — позволяет указать маску, которая будет использоваться при отборе символических имен. Маска может содержать буквы, цифры плюс специальные символы, задающие маску:

# любая цифра (0 — 9)

$ любой символ

* ноль или больше любых символов

Apply

Применить — применить маску к списку имен и обновить список.

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

Маска

Совпадение символических имен

*

Совпадение с любым символом. Маска по умолчанию.

*#*

Совпадение с именами, которые содержат одну любую цифру в любом месте имени.

_a$#*

Совпадение с именами, которые начинаются со знака подчеркивания, затем идет буква a, следом за которой следует любая цифра, и могут оканчиваться ни одним или любым количеством символов. Например, _ab1 или _a10value.

_*ABC

Совпадение с именами, которые начинаются со знака подчеркивания, затем идет любое количество любых символов, и оканчиваются на ABC.

Команды отладчика (Debug Commands)

Вы можете взаимодействовать с отладчиком µVision2, вводя команды на странице Command окна Output Window. В нижеследующих таблицах приведены все доступные команды (по категориям) отладчика µVision2. Используйте подчеркнутые буквы в именах команд для ввода соответствующих команды. Например, команда WATCHSET должна вводиться как WS.

Во время ввода команды синтаксический генератор показывает возможные варианты команд, опций и параметров. По мере того, как вы вводите команду, отладчик µVision2 уменьшает список вариантов подходящих команд в зависимости от введенных вами символов.

Если вы введете B, то синтаксический генератор уменьшит список доступных команд.

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

Синтаксический генератор — ваш проводник при вводе команды, он помогает избежать ошибок при вводе команд.

Команды работы с памятью (Memory Commands)

Нижеследующие команды позволяют вам отображать и изменять содержимое памяти.

Команда

Описание

ASM

Ассемблировать и сохранить код инструкции.

DEFINE

Определить типизированный символ, который вы можете использовать в своих отладочных функциях µVision2.

DISPLAY

Показать содержимое памяти.

ENTER

Ввести значение и сохранить в указанной области памяти.

EVALUATE

Вычислить выражение и вывести результаты.

MAP

Определить параметры доступа к областям памяти.

UNASSEMBLE

Дизассемблировать программную память.

WATCHSET

Добавить переменную в окно Watch.

Команды управления выполнением программы (ProgramExecutionCommands)

Команды управления программой позволяют вам запустить в отладчике вашу программу и пошагово ходить по инструкциям в коде.

Команда

Описание

Esc

Остановить выполнение программы.

GO

Запустить выполнение программы.

PSTEP

Шагать по инструкциям, но не заходить в тело процедур или функций.

OSTEP

Проделать шаги до выхода из текущей функции.

TSTEP

Шагать по инструкциям и заходить в функции.

Команды управления точками останова (BreakpointCommands)

µVision2 provides breakpoints you may use to conditionally halt the execution of your target program. Breakpoints can be set on read operations, write operations and execution operations.

Команда

Описание

BREAKDISABLE

Disables one or more breakpoints.

BREAKENABLE

Enables one or more breakpoints.

BREAKKILL

Removes one or more breakpoints from the breakpoint list.

BREAKLIST

Lists the current breakpoints.

BREAKSET

Adds a breakpoint expression to the list of breakpoints.

Переменные (символические имена) программы

Отладчик µVision2 позволяет вам обращаться к переменным (или символическим именам) отлаживаемой программы просто набирая их имена. Имена переменных (или символические имена) представляют собой числовые значения и адреса. Символические имена делают процесс отладки проще, поскольку вы можете использовать в отладчике те же имена, какие вы использовали в своей программе.

Когда вы загружаете свою программу в отладчик, то одновременно загружается и информация о символических именах программы. Символические имена – это локальные переменные (объявленные внутри функций), имена функций, и информация о номерах строк исходного текста программы. Для генерации символических имен при компиляции программы вы должны разрешить опцию Options for Target – Output – Debug Information. Если такая отладочная информация отсутствует, то отладчик µVision2 не в состоянии проводить отладку на уровне исходных текстов и символических имен вашей программы.

Соседние файлы в папке Keil_51_v750a_OK_work