Интерфейс управления платой или программным эмулятором для подключения к отладчику gdb
Общие соображения
Система отладки на основе программы gdbи универсального стаба состоит из трех компонент:
1. Отладчик nm-gdb, который предоставляет пользователям полноценный функционал для отладки приложений и может работать как самостоятельно, так и в составе IDEEclipse
2. Программа gdb-stub (далее стаб), которая принимает от gdb по протоколу TCP-IP и обрабатывает низкоуровневые команды для эмулятора или платы, такие как запись или чтение из памяти, запись или чтение регистров, запуск, останов программы и т.д. Стаб преобразует команды, поступаемые в виде TCP-IPпакетов в вызов функций управления платой или симуляторов.
3. Библиотека управления – динамически подключаемая библиотека (в формате so), в которой содержаться все функции управления отладочной платой или эмулятором, необходимые стабу.
Для запуска процесса отладки необходимо запустить две программы стаб и gdb в следующей последовательности:
gdb-stub –l control_lib.so –p port_num&
Nm-gdb
т.е в начале в виде отдельного процесса запускается стаб, затем, при запущеномстабе запускается nm-gdb.
Параметрыgdb-stub:
control_lib.so – имябиблиотеки управления. В главе 2 приведен полный список функций, которые должны быть реализованы в библиотеке управления для корректной работы отладчика
port_num – номер TCP-порта, по которому будет nm-gdbбудет связываться со стабом
Интерфейс библиотеки управления платой или эмулятором
Для корректного взаимодействия платы с отладчиком gdb необходимо реализовать ряд функций управления платой или симулятором. Ниже приводится детальное описание интерфейсов и алгоритмов работы всех функций, которые должны быть реализованы в библиотеки управления.
Интерфейс с отладчиком
Интерфейс эмулятора можно условно разделить на две части:
- функции создания и уничтожения эмулятора;
- интерфейсный класс TDbgInterface.
Функции создания и уничтожения эмулятора
В таблицах 4.1.1 ‑ 4.1.2 приведены описания интерфейсов функций относящихся к процессу создания (инициализации) и уничтожения эмулятора.
Таблица 4.1.1 Функция создания эмулятора.
Интерфейс | TDbgInterface* InitSys() |
Описание | Функция выполняет инициализациюотладочной платы или эмулятора. Это первая функции бибиблиотеки управления, которую вызывает gdb-stub |
Аргументы | - |
Возвращаемое значение | В случае успеха: Любое значение, кроме NULL В случае ошибки: NULL |
Примечания | - |
Таблица 4.1.2 Функция уничтожения эмулятора.
Интерфейс | voidSysDestroy() |
Описание | Функция завершения работы с платой или эмулятором |
Аргументы | - |
Возвращаемое значение | - |
Примечания | - |
Функция GetProcCfg.
Интерфейс | tDProcCfg* GetProcCfg() |
Описание | Возвращает указатель на структуру, описывающую элементы процессора (регистры, флаги, шины памяти и т.д) |
Аргументы | - |
Возвращаемое значение | Указатель на структуру, описывающую элементы процессора |
Примечания |
Структура tDProcCfg:
structtDProcCfg
{
intnreg; // кол-во регистров
consttDRegister *regs; // массив дескрипторов регитстров
intnbuses; // кол-во адресных пространств памяти
consttDMemBus *bus; // массив дескрипторов адресных пространств
intnflags; // количество флагов
consttDProcFlags *flags; // массив дескрипторов флагов
intnfifos; // количество FIFO-блоков
consttProcFifo *fifos; // массив дескрипторов FIFO-блоков
};
Структура дескриптора регистров:
structtDRegister
{
constchar *name; // ассемблерное имя
inttype; // размер регистра в байтах
intarrsize; // размер регистрового массива
intflag; // зарезервировано
};
Структура дескриптора шин памяти:
structtDMemBus
{
constchar *name; // ассемблерное имя адресного пространства
intasize; // размер шины адреса в битх
intdsize; // размер шины данных в битах
};
Структура дескриптора флага:
structtDProcFlags
{
char *name; // имяфлага
const int regnum; // индексрегистра
constintreg_arrnum; // индекс регистра в регистровом массиве
intbit; // бит в регистре
};
Структура дескриптора ФИФО:
structtProcFifo
{
constchar *name; // имя
intElemBitSize; // размер одного элемента в битах
intNumElems; // размер ФИФО (макс. Кол-во элементов)
};
Таблица 4.2.2 Функция ProcGetRegIdx.
Интерфейс | int GetRegIdx(char* aRegName) |
Описание | Возвращает индекс регистра по его имени |
Аргументы | char* aRegName – Имя регистра |
Возвращаемое значение | В случае успеха: индекс регистра, по которому можно считать\записать значение регистра функциями GetReg\SetReg; В случае ошибки: -1 – регистра с таким именем не существует |
Примечания | Имена регистровых массивов должны передаваться в функцию так, как они обозначены в PPDL: gr$ - массив регистров gr (gr0…gr7) ar$ - массиврегистров ar (ar0…ar7) |