Отладка заданий DSP
Предупреждение
Этот документ не является достоверным. Описанные свойства могут не поддерживаться в ПО или поддерживаться не так как описано в документе. Свойства могут измениться при финальной реализации.
Сценарии использования
Общий сценарий работы
Пользователь запускает mgdbserver в системе, в которой запущен или будет запущен отлаживаемый процесс.
Пользователь запускает gdb, которому в команде remote target (или target-extended) передаёт адрес запущенного mgdbserver’а.
Пользователь выполняет команды continue, stop, break итд.
(Опционально) Пользователь отсоединяет отладчик от отлаживаемого процесса.
Пользователь отключается от mgdbserver.
Для каждого job_instance’а запускается собственный mgdbserver.
Выбор job_instance’а для отладки
Отладка инициируется mgdbserver’ом
Пользователь запускает приложение elcorectl ps, которое показывает все запущенные на данный момент экземпляры заданий.
elcorectl обращается к файлам
/dev/elcoreX
и запрашивает соответствующую информацию.Приложение выводит на экран список созданных в данный момент экземпляров заданий и информацию о них, которая включает:
ID — идентификатор экземпляра задания.
PID — идентификатор процесса, создавшего данный экземпляр задания.
DEVICE — строковый идентификатор DSP-ядра вида /dev/elcoreX.
NAME — наименование функции.
Пользователь запускает mgdbserver и передает ID и DEVICE в качестве параметров.
mgdbserver переводит экземпляр задания в отладочный режим с помощью ELCORE50_IOC_DBG_JOB_ATTACH.
Пользователь передаёт путь к ELF-файлу в gdb и начинает отладку.
Отладка инициируется отлаживаемым приложением
Отлаживаемое приложение загружает ELF-файл, а также создает задание с помощью функций CreateELF() и CreateElcoreJob(), описанных в документе Библиотека elcore.
Отлаживаемое приложение устанавливает флаг
debug_enable
структурыelcore50_job_instance
в true.Отлаживаемое приложение ставит экземпляр задания в очередь на исполнение с помощью
ioctl()
ELCORE50_IOC_ENQUEUE_JOB.Отлаживаемое приложение в отдельном потоке вызывает функцию ElcoreJobInstancePoll() для ожидания завершения работы экземпляра задания и обработки системных вызовов. Функция ElcoreJobInstancePoll() описана в документе Библиотека elcore.
Пользователь запускает mgdbserver.
Пользователь передаёт в gdb содержимое ELF’а с помощью метода GetBinaryData() класса ElcoreELF и начинает отладку.
Операции над экземпляром задания
Отладочные операции описаны в разделе Описание отладочных IOCTL документа Драйвер elcore50 со следующими особенностями:
Чтение/запись регистров DSP
Важно
Действует соглашение: чтение/запись регистров производится только конечными пользователями, которые запустили gdb. Сам mgdbserver не может обращаться к регистрам ради управляющих воздействий (run/stop/break итд).
Установка/снятие программных точек останова
Данная операция выполняется через операции чтения/записи памяти.
Ожидание останова
Ожидание останова задания осуществляется с помощью вызова функции poll()
применительно к отладочному файловому дескриптору, полученному с помощью
ELCORE50_IOC_DBG_JOB_ATTACH.
При остановке задания по событию отладки драйвер выставляет статус задания
ELCORE50_JOB_STATUS_INTERRUPTED
и посылает событие в пользовательское приложение на CPU
через poll()
с флагами POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM
.
Завершение процесса отладки
Для завершения процесса отладки необходимо вызвать функцию close()
, передав в качестве
аргумента job_instance_dbg_fd
структуры c:type:elcore50_job_instance_dbg.
Согласование действий отладки и системных вызовов
При одновременном срабатывании системных вызовов и отладочных команд первоочередно будет обработан системный вызов.
Штатное завершение job_instance’а с точки зрения отладки и CPU-программы
Предупреждение
Если задание используется для отладки через ioctl()
ELCORE50_IOC_DBG_JOB_ATTACH,
то завершение выполнения задания произойдет только после Завершение процесса отладки.