Порядок компиляции и запуска программы – ОС Windows — КиберПедия 

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Порядок компиляции и запуска программы – ОС Windows

2022-09-12 27
Порядок компиляции и запуска программы – ОС Windows 0.00 из 5.00 0 оценок
Заказать работу

АННОТАЦИЯ

Настоящий документ содержит руководство пользователя для программной модели процессора NM6407 (далее – симулятор).

Симулятор реализован на архитектурах x86 и x86-64 под управлением операционных систем Windows 7 Service Pack 1 и CentOS Linux 6.5. В руководстве описаны методы компиляции для каждой программно-аппаратной платформы.

В руководстве описана структура симулятора, алгоритмы работы и интерфейсы взаимодействия с другими программными компонентами.


СОДЕРЖАНИЕ

1    Общие сведения о программе. 5

1.1 Назначение программы.. 5

1.2 Программное окружение. 5

1.3 Взаимодействие с отладчиком. 5

2    Структура программы.. 6

2.1 Структура текста программы.. 6

2.1 Структура текста программы.. 6

2.2 Порядок компиляции и запуска программы – ОС Windows. 8

2.3 Порядок компиляции и запуска программы – ОС Linux. 9

2.4 Структура симулятора на уровне классов. 9

3    Эмуляция памяти. 10

3.1 Интерфейс iMemInterface. 10

3.2 Класс TMemoryBus для эмуляции шины памяти. 11

3.3 Класс TBusSwitcher ‑ коммутатор шин внутри одного адресного пространства 13

3.4 Класс tSimpleMemBlock для эмуляции блока памяти. 13

3.5 TDDramBlock – эмуляция памяти DDRAM.. 15

4    Интерфейс с отладчиком. 17

4.1 Функции создания и уничтожения симулятора. 17

4.2 Интерфейс класса TDbgInterface. 18

4.3 Исключения, возвращаемые функцией StepInto. 28

4.4 Инициализация эмулятора. 34

5    Механизм старта и загрузки симулятора. 38

5.1 Платформо-зависимые макроопределения. 38

5.2 Функция потока симуляции. 40

6    Эмуляция периферийных устройств. 41

6.1 Таймеры.. 41

6.2 Контроллер прерываний. 41

6.3 Байтовые синхронные коммуникационные порты.. 42

6.4 Порты ввода/вывода общего назначения. 42

6.5 Кэш-память команд. 43

6.6 Блок упаковки-распаковки векторов данных. 43

7    Модуль ввода/вывода ‑ SEMIHOSTING.. 44

7.1 Назначение модуля. 44

7.2 Исполнение модуля. 44

7.3 Регистры и команды.. 44

7.4 Предопределённые дескрипторы.. 47

8    Трассировщик-профилировщик. 48

8.1 Назначение программы.. 48

8.2 Правила запуска программы и функции командной строки. 48

8.3 Работа в режиме трассировщика. 49

8.4 Работа в режиме профилировщика. 50

9    Настройка программы.. 53

10 Проверка программы.. 55

10.1 Назначение тестовой среды.. 55

10.2 Компоненты тестовой среды.. 55

10.3 Алгоритм работы скрипта для тестирования эмулятора. 56

11 Сообщения. 57

12 Оптимизация по быстродействию.. 58

12.1 Введение. 58

12.2 Сборка эмулятора NM в QEMU.. 58

12.3 Запуск эмулятора NM в QEMU.. 58

12.4 Структура каталогов эмулятора NM в QEMU.. 58

12.5 Структура файлов эмулятора NM в QEMU.. 59

Перечень ссылочных документов. 62

 

Общие сведения о программе

Назначение программы

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

Программное окружение

Симулятор реализован на архитектурах x86 и x86-64 под управлением операционных систем Windows 7 Service Pack 1 и CentOS Linux 6.5.

Взаимодействие с отладчиком

Управление симулятором осуществляется через интерфейс TDbgInterface, указатель на который передается отладчику после загрузки и инициализации библиотеки. Функции интерфейса TDbgInterface позволяют отладчику выполнять следующие действия:

- загрузить программу на симулятор;

- запустить программу на исполнение;

- остановить выполнение программы;

- исполнить программу в пошаговом режиме;

- просмотреть состояние регистров и памяти;

- установить/снять точку останова.

 

Структура программы

В данном разделе описана структура проекта эмулятора на уровне файлов и каталогов. В документе не упомянуты файлы и каталоги, которые генерируются автоматически программой Visual Studio или программами тестирования эмулятора.

Структура текста программы

Структура текста программы

Структура каталогов проекта:

bins\

htmler\

dbg_interface\

help\

libs\

models\

nm6407\

simulator\

     include\

     bins\

     sources\

     VC8\

libsrc\simlib\

tracer\

peripheral\

     com_port \

     ext_int_controller\

ins_cache\

pu_block\

 

Каталог bins\ содержит исполняемые файлы для компиляции проекта эмулятора.

Каталог bins\htmler\ содержит скрипт makeHTML для генерации отчета профилировщика в виде html-страницы, а также дополнительные необходимые для запуска данного скрипта файлы.

Каталог dbg_interface\ содержит заголовочные файлы, содержащие интерфейс управления эмулятора. В каталоге содержаться следующие файлы:

- datatypes.h – типы данных, используемые в структурах и функциях эмулятора;

- debug_structs.h – декларация структур данных, используемых эмулятором в интерфейсных функциях;

- dbg_interfae.h – описание класса Interface (см. п. 3.2).

Каталог headers\ содержит заголовочные файлы, в которых описаны классы и структуры, используемые эмулятором.

Каталог help\ содержит справочную информацию по программе ppdl. Каталог содержит подкаталог russian\ в котором содержится документация по структуре эмулятора и языку ppdl.

Каталог libs\ содержит статические библиотеки:

- libelf.lib – библиотека для работы с исполняемыми файлами в формате ELF;

- simlib.lib – библиотека содержит набор сервисных функций для управления эмулятором.

Каталог models\ содержит реализацию моделей процессоров.

Каталог models\nm6407\ содержит реализацию процессора nm6407. В частности, каталог содержит следующие файлы и подкаталоги:

- architecture.cpp – файл содержит функцию, в которой создаются остальные элементы модели: процессора, шин памяти, блоков памяти, а также инициализируются связи между процессором и памятью.

- NM6407.hdl – описание процессора на языке ppdl

- simulator\include\NM6407_sim.h – описание процессора на языке С++. Данный файл генерируется автоматически из ppdl описания процессора с помощью компилятора языка ppdl (программа bins\ppdl.exe).

- simulator\include\NM6407_sim.h – описание процессора на языке С++. Данный файл генерируется автоматически из ppdl описания процессора с помощью компилятора языка ppdl (программа bins\ppdl.exe).

- simulator\VC8\ - каталог содержит файлы проекта эмулятора для Visual Studio.NET. 2013

- bins\ - каталог содержит библиотеку симулятора nm6407.dll (только для ОС Windows) 

Каталог libsrc\simlib\ содержит исходные файлы и файлы проекта библиотеки simlib.lib. В частности, в подкаталоге headers\threads_cfg.h содержится набор платформо-зависимых макроопределений, используемых для управлением потоком симуляции (cм. п. 4.1).

Каталог tracer\ содержит файлы исходных кодов программы трассировщика.

Каталог peripheral\ содержит файлы исходных кодов подпрограмм, эмулирующих периферийные устройства:

каталог peripheral\com_port\ содержит файлы исходных кодов эмулятора байтового коммуникационного порта [1, раздел 10];

каталог peripheral\ext_int_controller\ содержит файлы исходных кодов эмулятора контроллера внешних прерываний [1, раздел 15];

каталог peripheral\ins_cache\ содержит файлы исходных кодов эмулятора кэш-памяти программ [1, раздел 9];

каталог peripheral\pu_block\ содержит файлы исходных кодов эмулятора блока упаковки/распаковки векторов данных [2, раздел 4].

 

Эмуляция памяти

Для эмуляции памяти микропроцессора используются следующие классы:

- для эмуляции шин памяти и коммутации запросов: TMemoryBus и TBusSwitcher;

- для эмуляции собственно блоков памяти – tSimpleMemBlock и TDDramMemBlock.

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

Интерфейс iMemInterface

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

Функции класса iMemInterface делятся на две группы: функции, используемые при эмуляции и функции, используемые для отладки или загрузки программы. iMemInterface – это класс-шаблон, который имеет два параметра:

vAddrType – тип шины адреса;

vDataType – тип шины данных.

Для процессоров семейства NeroMatrix используются следующие значения параметров:

vAddrType = unsigned long (32х разрядное беззнаковое целое);

vDataType = unsigned long long (64х разрядное беззнаковое целое).

 

Функции интерфейса, используемые при эмуляции, описаны в таблицах 3.1.1‑3.1.3.

Таблица 3.1.1 ‑ Чтение из памяти

Интерфейс virtual vDataType ReadMem(vAddrType aAddr)
Описание Функция возвращает содержимое памяти по адресу aAddr.
Аргументы vAddrType aAddr – адрес, по которому осуществляется чтение
Возвращаемое значение Считанное значение
Примечания -

 

Таблица 3.1.2 ‑ Запись в память

Интерфейс virtual void WriteMem32(vAddrType aAddr, uint32 aData)
Описание Функция записывает 32х битное значение aData по адресу aAddr. В случае если vDataType – это 64х битный тип данных, функция, в отличии от WriteMem модифицирует только верхние или нижние (в зависимости от значения младшего бита aAddr) 32 бита ячейки памяти.
Аргументы vAddrType aAddr – адрес, по которому осуществляется чтение uint32 aData – сохраняемое в память значение
Возвращаемое значение -
Примечания -

 

Таблица 3.1.3 ‑ Расчет задержки доступа к памяти

Интерфейс virtual TCycleCount SetMemLock(int aPipe);
Описание Функция возвращает номер такта, после которого закончится операция последняя осуществленная операция чтения или записи.
Аргументы int aPipe – ступень конвейера, на которой будет задействован результат чтения из памяти или записи в память.
Возвращаемое значение Номер такта
Примечания -

 

Интерфейс с отладчиком

Интерфейс симулятора можно условно разделить на две части:

- функции создания и уничтожения эмулятора;

- интерфейсный класс TDbgInterface.

Инициализация эмулятора

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

1) загрузить библиотеку;

2) сформировать и заполнить данными структуру типа ChipMem, указатель на которую должен быть передан в качестве аргумента функции CreateDevice;

3) получить адрес функции CreateDevice;

4) запустить функцию CreateDevice. Данная функция возвращает указатель на объект типа TDbgInterface (см. ниже).

После этого отладчик может управлять работой эмулятора, используя функции интерфейса TDbgInterface

В качестве альтернативного варианта вместо функции CreateDevice можно воспользоваться функцией InitSysChipMem (см.п. 3.3). В этом случае вместо указателя на СhipMem требуется. Функция CreateDevice описана в таблице 4.4.1.

 

Таблица 4.4.1 ‑ Функция CreateDevice

Интерфейс TDbgInterface* CreateDevice (ChipMem* aChipMem)
Описание Инициализация эмулятора: выполняет следующие действия - Создает класс эмулятора - Формирует модель памяти в соответствии со структурой aChipMem - Инициализирует массив флагов обработки предупреждений.
Аргументы -
Возвращаемое значение В случае успеха: Указатель на TDbgInterface – класс главного процессора эмулятора
Примечания -

 

4.4.1 Описание структуры ChipMem и рекомендации по её заполнению

Структура ChipMem имеет следующие поля:

int m_BankNum;          // номер банков памяти

unsigned long *p_startAddr;   // массив стартовых адресов банков памяти

unsigned long *p_Size;        // массив длин банков памяти

unsigned long *p_ReadWaitTime;  // массив значений времени задержки при чтения из памяти *

unsigned long *p_WriteWaitTime;  // массив значений времени задержки при записи в память (если значение равно 0xFFFFFFFF, то память считается долько для чтения)*

unsigned long m_StackStartAddr;  // начальный адрес стека

unsigned long m_EndStackAddr;  // Конечный адрес стека

unsigned long m_Flags;       // массив флагов (флаги определяют, какие ситуации предупреждения, а какие нет)

unsigned long m_SemiHostFiles;   // максимальное кол-во файлов, которые одновременно могут быть открыты через semihosting

unsigned long m_SemiHostAddr;    // адрес семихостинга

SDRamConfig*  p_Configs;     // массив структур, описывающих временные характеристики блоков памяти

Структура SDRamConfig имеет следующие поля:

eMemBlockKind mKind;      // тип памяти (SMEM_SRAM, SMEM_SDRAM, SMEM_SSRAM)

eSSramKind mSSramLKind;  // подтип (разновидность SSRAM памяти, для других типов параметр игнорируется

uint64    mPageSize;    // размер страницы (только для SDRAM)

TCycleCount mRegenPeriod; // периуд регенерации (только для SDRAM)

TCycleCount mRegenTime;   // время регенерации(только для SDRAM)

TCycleCount mPageOpenTime; // время открытия страницы (только для SDRAM)

TCycleCount mPageCloseTime; // время закрытия страницы

double    mMulFactor;   // отношение такта памяти к такту ядра процессора

uint32    mLatency;   // время доступа к ячейки (без учёта выбора страницы и регенерации)

 

В симуляторе предусмотрена следующая   логига инициализации памяти в завивисимости от значений полей передаваемого извне указателя на экземпляр структуры ChipMem:

1) если переменная p_ReadWaitTime инициализирована значением NULL, то предполагается, что все описанные в ChipMem блоки памяти имеют нулевую задержку по обращению. При этом значение переменной p_Configs игнорируется;

2) если переменная p_ReadWaitTime инициализирована значением, отличным от NULL, но значение переменной p_Configs равно NULL, то подразумевается, что задержка по обращению к каждому блоку I определяется значением p_ReadWaitTime[I];

3) если перемные ReadWaitTime и p_Configs имеют значения, отличные от NULL, от тип каждого блока определяется в зависимости от значения p_Configs.

Отдельно следует отметить поле m_Flags. m_Flags – это битовая маска предупреждения, если бит с индексом I равен 1, то предупреждение с номером I обрабатывается. В противном случае предупреждение игнорируется симулятором. 31-й бит поля m_Flags определяет, на каком языке будет выдаваться текст предупреждения (1- русский, 0 – английский).

С помощью бита 30 поля m_Flags задаётся инстанцирование устройства Semihosting, если значение бита равно 1, то Semihosting инстанцируется по адресу m_SemiHostAddr, максимальное количество одновременно открытых файлов будет равно m_SemiHostFiles.

Функция CreateDevice описана в таблице 4.4.2.

Таблицв 4.4.2 ‑ Функция SysDestroy

Интерфейс void SysDestroy ()
Описание Уничтожает класс эмулятора Уничтожает поток эмулятора
Аргументы -
Возвращаемое значение  
Примечания -

 

Функция потока симуляции

Ниже приведена реализация функции основного потока симуляции:            

SIM_FUNC_DECL()

{  

#ifdef SYSTEMC_USED

sc_initialize(); // используется только для потактовой модели

#endif

//

while(true) // основной цикл

{

WAIT_START_MSG() // ожидаем сигнала от отладчика

if(IsRunned) // если выполнение разрешено

{

while(IsRunned) // выполняем, пока симуляция не остановлена

   SingleClock(); // исполняем одну инструкцию

}

SEND_STOP_REASON(0) // посылаем сигнал отладчику об остановке эмулятора

}// while true

}

Таймеры

В эмулятор ядра процессора NM6406 реализована функциональность, позволяющая эмулировать интервальные таймеры TIMER0 и TIMER1 в соответствии с 4.1 документа [1]. 

Для эмуляции таймеров при каждом запуске функции Operate после эмуляции работы инструкций исполняется функция CheckTimers. Данная функция проверяет состояния таймеров. Если таймеры активны, то выполняется инкрементация счетчиков таймеров и, в соответствии со спецификацией, в случае перехода счетчиков в «0», выполняется перезагрузка счетчиков и\или установление запроса на прерывание.

 

Контроллер прерываний

Контроллер прерываний также реализован как часть ядра процессора.

Перед началом исполнения каждой инструкции эмулятором запускается функция CheckIrqs, которая проверяет состояние битов поля регистра IRR – регистра запросов внешних прерываний. Если IRR не равен нулю (установлен хотя-бы один запрос на прерывание) и запрос не замаскирован, то соответствующий вектор записывается в регистр intr.   

После проверки регистра IRR осуществляется проверка регистра intr. В регистре intr помимо вектора внешних прерываний, устанавливаются вектора запросов внутренних прерываний. Регистр intr анализируется на предмет наличия незамаскированных прерываний и, в случае наличия хотя-бы одного запроса на прерывания, функция CheckIrqs возвращает значение вектора прерывания.

Регистр IRR доступен извне класса эмулятора. Таким образом, эмуляторы внешних устройств могут посылать запросы ядру посредством установки бит IRR.  

 

 

Кэш-память команд

Кэш-память команд моделируется классом InsCache. Класс InsCache реализует интерфейс iMemInterface. При чтении инструкций, ядро процессора вызывает функцию ReadMem экземпляра класса InsCache. В зависимости от режима работы и состояния кэш-памяти инструкция читается либо из внутренней кэш-памяти, либо осуществляется обращение по шине. Задержка (функция SetMemLock) также рассчитывается в зависимости от того, из какой память было осуществлено чтение команды.

 

Назначение модуля

Модуль позволяет ПО Nero Matrix (далее NM) работать с файлами на хосте, на котором запускается эмулятор. Данный модуль позволяет реализовать библиотеку stdio, с помощью которой приложения для NM, запускаемые на эмуляторе, могут открывать файлы на чтение и на запись, читать из файлов, записывать в файлы, а также работать со стандартными потоками stdin, stdout, stderror.

 

Исполнение модуля

С точки зрения программиста модуль выполнен в качестве периферийного устройства, регистры которого доступны как ячейки памяти по заданному адресу. Начальный адрес регистров модуля (адрес первого регистра) может быть определён в конфигурационном файле. Адрес модуля по умолчанию равен 0xFF000000.

 

Регистры и команды

Модуль управляется посредством последовательной записи в его регистры. Все регистры имеют размер 32 бита. Список регистров приведён в таблице 7.3.1:

Таблица 7.3.1 ‑ Список регистров

Смещение регистра Описание Примечание
0x0 Регистр команды 1
0x1 Первый аргумент команды  
0x2 Второй аргумент команды  
0x3 Третий аргумент команды  
0x4 Четвёртый аргумент  

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

За исключением команды fclose все функции модуля возвращают значение. Возвращаемое значение находится в регистре команд.

Список доступных команд с описанием аргументов приведен в таблице 7.3.2.

Таблица 7.3.2 ‑ Список доступных команд

Код команды 0x1 Примечание
Описание команды semi_fopen – открытие файла  
Аргумент 1 Адрес строки –имени файла  
Аргумент 2 способ открытия файла 1- чтение бинарного файла 2- чтение текстового файла 3- запись бинарного файла 4- запись текстового файла  
Аргумент 3 -  
Аргумент 4 -  
Возвращаемое значение Дескриптор файла  
Код команды 0x2  
Описание команды semi_fclose  
Аргумент 1 Дескриптор файла  
Аргумент 2    
Аргумент 3    
Аргумент 4    
Возвращаемое значение Нет  
Код команды 0x3  
Описание команды semi_fread – чтение данных из файла  
Аргумент 1 Указатель на буфер памяти для чтения  
Аргумент 2 Размер элемента для чтения 1
Аргумент 3 Кол-во элемента для чтения 1
Аргумент 4 Дескриптор файлов  
Возвращаемое значение Количество прочитанных байтов  

 

 

Продолжение таблицы 7.3.2

Код команды 0x4  
Описание команды semi_fwrite – запись данных в файл  
Аргумент 1 Указатель на буфер памяти для записи  
Аргумент 2 Размер элемента для записи 1
Аргумент 3 Кол-во элементов для записи 1
Аргумент 4 Дескриптор файлов  
Возвращаемое значение Количество записанных байтов  
Код команды 0x5  
Описание команды semi_fseek – смещение позиции в файле  
Аргумент 1 Дескриптор файла  
Аргумент 2 Смещение (значение интерпретируется как знаковое)  
Аргумент 3 Позиция, относительно которой вычисляется смещение 1 – Относительно начала файла 2 – Относительно текущей позиции 3 – Относительно конца файла  
Аргумент 4    
Возвращаемое значение 0 – в случае успешного смещения 1 – в случае ошибки  
Код команды 0xA  
Описание команды exit– окончание работы программы и выход из симулятора  
Аргумент 1 Возвращаемое значение  
Возвращаемое значение Значение, переданное в качестве аргумента в функцию exit. Если трассировщик вызван с функцией –rv то данное значение будет передано в виде результата работы трассировщика  

 

Примечание 1 ‑ понятие «размер элемента» и «количество элементов» определяются как в описании соответствующих функций в stdio.

 

 


Трассировщик-профилировщик

Назначение программы

Трассировщик-профилировщик предназначен для:

- исполнения программ для процессоров семейства NeroMatrix с выдачей информации о ходе исполнения программы (трассы) в стандартное устройство вывода (stdout);

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

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

 

Настройка программы

Данный раздел содержит методические рекомендации по применению программы симулятор.

Бинарный файл библиотеки эмулятора может быть загружен динамически посредством вызова стандартной функции ОС Windows LoadLibrary(«имя библиотеки»). В случае успешного выполнения данная функция возвращает дескриптор загруженной библиотеки. Затем необходимо получить адрес функции InitSys, которая создаст класс эмулятора и, в случае успеха, вернет указатель на класс TDbgInterface. Для получения адреса функций можно использовать стандартную функцию GetProcAddress, которая по имени функции возвращает ее адрес. Ниже приведен пример загрузки и инициализации эмулятора на языке С++:

// декларация типа функции CreateDevice

typedef TDbgInterface* (*tInitSys)();

// код инициализации эмулятора

HANDLE lib_handle; // дескриптор библиотеки

TDbgInterface* processor;

tInitSys    InitSystem; // указатель на функцию CreateDevice

// загрузка библиотеки

lib_handle = LoadLibrary(“simdll.dll”);

// получения адреса функции InitSys

InitSystem = (tInitSys)GetProcAddress(lib_handle,"InitSys");

// инициализация эмулятора

processor = InitSystem ();

После исполнения данного кода переменная processor будет содержать указатель на класс типа TDbgInterface, с помощью которого можно будет управлять процессом загрузки и исполнения программ на эмуляторе. Ниже приводиться пример загрузки бинарного файла test.abs в эмулятор, исполнения программы и получения результата работы программы, содержащегося в регистре gr0 процессора:

//

#define OUT_TEST_REG     0

#define OUT_TEST_REG_ARR 0 // gr[0]

TDbgInterface * processor;

// инициализация эмулятора

// запуск программы

uint 32 pc _ count;

// загрузка исполняемого файла

tDisAsmArea* elf_res = aCntr->LoadElf(“test.abs”);

// в случае ошибки загрузки файла – выходим

if(elf_res==NULL) exit(-1);

// предполагаем, что программа заканчивается по адресу pc + PC _ START _ OFFSET

pc _ count = aCntr -> GetPc (0);

// устанавливаем начальное значение регистра gr 0, gr 0 = 1

aCntr->SetReg(OUT_TEST_REG,OUT_TEST_REG_ARR,1);

// дабы избежать бесконечного цикла в случае ошибки,

// устанавливаем максимальное кол-во тактов

int num _ cycles =100000;

// цикл исполнения программы

while (num _ cycles >0)

{

     // проверка точки останова

uint 32 cur _ pc = aCntr -> GetPc (0);

     // если пришли к концу программы - выходим

if((pc_count + PC_START_OFFSET)==cur_pc) break;

// выполняем один шаг

aCntr -> StepInto ();

// декрементируем количество оставшихся циклов

num _ cycles --;

}

// получаем значение регистра gr0

int reg_res = aCntr->GetReg(OUT_TEST_REG,OUT_TEST_REG_ARR);

if (reg _ res!= REG _ TEST _ VAL) // если значение регистра не верное

{

     // выдаем сообщение об ошибке и выходим

  printf("error: wrong result: return value %d\n",reg_res);

return reg _ res;

}

// в случае успеха выходим из программы с кодом 0

exit(0);

 

Проверка программы

Назначение тестовой среды

Основное назначение тестовой среды – проверка правильности работы программного эмулятора процессора NM6406 и вспомогательных компонент, в частности трассировщика-профилировщика.

Компоненты тестовой среды

Для тестирования работы эмулятора используются следующие компоненты:

1) трассировщик (см. раздел 6);

2) ассемблер для процессоров семейства NeroMatrix NM6407;

3) линковщик для процессоров семейства NeroMatrix NM6407;

4) набор так называемых «коротких» тестов для проверки работы скалярных и векторных инструкций процессора NM6407. Программы написаны на языке ассемблера. В случае успеха, после исполнения каждого теста значения регистра gr0 будет равно 0. Если значение gr0 после окончания работы программ отлично от нуля, то считается, что тест прошел с ошибкой;

5) файл file_list.txt – содержащий список тестов, которые должны быть запущены;

6) скрипт для тестирования эмулятора под ос Windows (bach-файл);

7) скрипт для тестирования эмулятора под ос Linux (shell-скрипт);

8) программа Excel для сравнения результатов работы потактового эмулятора с эталонным временем работы тестов. Время работы тестов измеряется в тактах;

9) файл эталонных значений времен работы тестов.

 


Сообщения

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

 

 

Введение

Оптимизация по быстродействию моделей процессоров NM6406 и NM6407 выполняется за счет использования при моделировании эмулятора QEMU.

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

 

Сборка эмулятора NM в QEMU

Сборка под ОС Linux:

 

cd qemu

./configure --target-list=ppdl-linux-user // версия RELEASE

./configure --target-list=ppdl-linux-user --enable-debug // версия DEBUG

make clean

make           

 

Запуск эмулятора NM в QEMU

Запуск под ОС Linux:

 

cd qemu

./ppdl-linux-user/nmc-qemu /path/to/binary/file.abs

 

Дополнительные опции запуска:

-rv ‑‑ результат работы программы берется из регистра gr7, а не из gr0, как это по умолчанию;

-nosm ‑‑ эмулятор запускается без поддержки semihosting’а, что даёт небольшой выигрыш в производительности.

АННОТАЦИЯ

Настоящий документ содержит руководство пользователя для программной модели процессора NM6407 (далее – симулятор).

Симулятор реализован на архитектурах x86 и x86-64 под управлением операционных систем Windows 7 Service Pack 1 и CentOS Linux 6.5. В руководстве описаны методы компиляции для каждой программно-аппаратной платформы.

В руководстве описана структура симулятора, алгоритмы работы и интерфейсы взаимодействия с другими программными компонентами.


СОДЕРЖАНИЕ

1    Общие сведения о программе. 5

1.1 Назначение программы.. 5

1.2 Программное окружение. 5

1.3 Взаимодействие с отладчиком. 5

2    Структура программы.. 6

2.1 Структура текста программы.. 6

2.1 Структура текста программы.. 6

2.2 Порядок компиляции и запуска программы – ОС Windows. 8

2.3 Порядок компиляции и запуска программы – ОС Linux. 9

2.4 Структура симулятора на уровне классов. 9

3    Эмуляция памяти. 10

3.1 Интерфейс iMemInterface. 10

3.2 Класс TMemoryBus для эмуляции шины памяти. 11

3.3 Класс TBusSwitcher ‑ коммутатор шин внутри одного адресного пространства 13

3.4 Класс tSimpleMemBlock для эмуляции блока памяти. 13

3.5 TDDramBlock – эмуляция памяти DDRAM.. 15

4    Интерфейс с отладчиком. 17

4.1 Функции создания и уничтожения симулятора. 17

4.2 Интерфейс класса TDbgInterface. 18

4.3 Исключения, возвращаемые функцией StepInto. 28

4.4 Инициализация эмулятора. 34

5    Механизм старта и загрузки симулятора. 38

5.1 Платформо-зависимые макроопределения. 38

5.2 Функция потока симуляции. 40

6    Эмуляция периферийных устройств. 41

6.1 Таймеры.. 41

6.2 Контроллер прерываний. 41

6.3 Байтовые синхронные коммуникационные порты.. 42

6.4 Порты ввода/вывода общего назначения. 42

6.5 Кэш-память команд. 43

6.6 Блок упаковки-распаковки векторов данных. 43

7    Модуль ввода/вывода ‑ SEMIHOSTING.. 44

7.1 Назначение модуля. 44

7.2 Исполнение модуля. 44

7.3 Регистры и команды.. 44

7.4 Предопределённые дескрипторы.. 47

8    Трассировщик-профилировщик. 48

8.1 Назначение программы.. 48

8.2 Правила запуска программы и функции командной строки. 48

8.3 Работа в режиме трассировщика. 49

8.4 Работа в режиме профилировщика. 50

9    Настройка программы.. 53

10 Проверка программы.. 55

10.1 Назначение тестовой среды.. 55

10.2 Компоненты тестовой среды.. 55

10.3 Алгоритм работы скрипта для тестирования эмулятора. 56

11 Сообщения. 57

12 Оптимизация по быстродействию.. 58

12.1 Введение. 58

12.2 Сборка эмулятора NM в QEMU.. 58

12.3 Запуск эмулятора NM в QEMU.. 58

12.4 Структура каталогов эмулятора NM в QEMU.. 58

12.5 Структура файлов эмулятора NM в QEMU.. 59

Перечень ссылочных документов. 62

 

Общие сведения о программе

Назначение программы

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

Программное окружение

Симулятор реализован на архитектурах x86 и x86-64 под управлением операционных систем Windows 7 Service Pack 1 и CentOS Linux 6.5.

Взаимодействие с отладчиком

Управление симулятором осуществляется через интерфейс TDbgInterface, указатель на который передается отладчику после загрузки и инициализации библиотеки. Функции интерфейса TDbgInterface позволяют отладчику выполнять следующие действия:

- загрузить программу на симулятор;

- запустить программу на исполнение;

- остановить выполнение программы;

- исполнить программу в пошаговом режиме;

- просмотреть состояние регистров и памяти;

- установить/снять точку останова.

 

Структура программы

В данном разделе описана структура проекта эмулятора на уровне файлов и каталогов. В документе не упомянуты файлы и каталоги, которые генерируются автоматически программой Visual Studio или программами тестирования эмулятора.

Структура текста программы

Структура текста программы

Структура каталогов проекта:

bins\

htmler\

dbg_interface\

help\

libs\

models\

nm6407\

simulator\

     include\

     bins\

     sources\

     VC8\

libsrc\simlib\

tracer\

peripheral\

     com_port \

     ext_int_controller\

ins_cache\

pu_block\

 

Каталог bins\ содержит исполняемые файлы для компиляции проекта эмулятора.

Каталог bins\htmler\ содержит скрипт makeHTML для генерации отчета профилировщика в виде html-страницы, а также дополнительные необходимые для запуска данного скрипта файлы.

Каталог dbg_interface\ содержит заголовочные файлы, содержащие интерфейс управления эмулятора. В каталоге содержаться следующие файлы:

- datatypes.h – типы данных, используемые в структурах и функциях эмулятора;

- debug_structs.h – декларация структур данных, используемых эмулятором в интерфейсных функциях;

- dbg_interfae.h – описание класса Interface (см. п. 3.2).

Каталог headers\ содержит заголовочные файлы, в которых описаны классы и структуры, используемые эмулятором.

Каталог help\ содержит справочную информацию по программе ppdl. Каталог содержит подкаталог russian\ в котором содержится документация по структуре эмулятора и языку ppdl.

Каталог libs\ содержит статические библиотеки:

- libelf.lib – библиотека для работы с исполняемыми файлами в формате ELF;

- simlib.lib – библиотека содержит набор сервисных функций для управления эмулятором.

Каталог models\ содержит реализацию моделей процессоров.

Каталог models\nm6407\ содержит реализацию процессора nm6407. В частности, каталог содержит следующие файлы и подкаталоги:

- architecture.cpp – файл содержит функцию, в которой создаются остальные элементы модели: процессора, шин памяти, блоков памяти, а также инициализируются связи между процессором и памятью.

- NM6407.hdl – описание процессора на языке ppdl

- simulator\include\NM6407_sim.h – описание процессора на языке С++. Данный файл генерируется автоматически из ppdl описания процессора с помощью компилятора языка ppdl (программа bins\ppdl.exe).

- simulator\include\NM6407_sim.h – описание процессора на языке С++. Данный файл генерируется автоматически из ppdl описания процессора с помощью компилятора языка ppdl (программа bins\ppdl.exe).

- simulator\VC8\ - каталог содержит файлы проекта эмулятора для Visual Studio.NET. 2013

- bins\ - каталог содержит библиотеку симулятора nm6407.dll (только для ОС Windows) 

Каталог libsrc\simlib\ содержит исходные файлы и файлы проекта библиотеки simlib.lib. В частности, в подкаталоге headers\threads_cfg.h содержится набор платформо-зависимых макроопределений, используемых для управлением потоком симуляции (cм. п. 4.1).

Каталог tracer\ содержит файлы исходных кодов программы трассировщика.

Каталог peripheral\ содержит файлы исходных кодов подпрограмм, эмулирующих периферийные устройства:

каталог peripheral\com_port\ содержит файлы исходных кодов эмулятора байтового коммуникационного порта [1, раздел 10];

каталог peripheral\ext_int_controller\ содержит файлы исходных кодов эмулятора контроллера внешних прерываний [1, раздел 15];

каталог peripheral\ins_cache\ содержит файлы исходных кодов эмулятора кэш-памяти программ [1, раздел 9];

каталог peripheral\pu_block\ содержит файлы исходных кодов эмулятора блока упаковки/распаковки векторов данных [2, раздел 4].

 

Пор<


Поделиться с друзьями:

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

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

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.307 с.