Отладка заданий DSP

Предупреждение

Этот документ не является достоверным. Описанные свойства могут не поддерживаться в ПО или поддерживаться не так как описано в документе. Свойства могут измениться при финальной реализации.

Сценарии использования

Общий сценарий работы

  1. Пользователь запускает mgdbserver в системе, в которой запущен или будет запущен отлаживаемый процесс.

  2. Пользователь запускает gdb, которому в команде remote target (или target-extended) передаёт адрес запущенного mgdbserver’а.

  3. Пользователь выполняет команды continue, stop, break итд.

  4. (Опционально) Пользователь отсоединяет отладчик от отлаживаемого процесса.

  5. Пользователь отключается от mgdbserver.

Для каждого job_instance’а запускается собственный mgdbserver.

Выбор job_instance’а для отладки

Отладка инициируется mgdbserver’ом

  1. Пользователь запускает приложение elcorectl ps, которое показывает все запущенные на данный момент экземпляры заданий.

  2. elcorectl обращается к файлам /dev/elcoreX и запрашивает соответствующую информацию.

  3. Приложение выводит на экран список созданных в данный момент экземпляров заданий и информацию о них, которая включает:

    • ID — идентификатор экземпляра задания.

    • PID — идентификатор процесса, создавшего данный экземпляр задания.

    • DEVICE — строковый идентификатор DSP-ядра вида /dev/elcoreX.

    • NAME — наименование функции.

  4. Пользователь запускает mgdbserver и передает ID и DEVICE в качестве параметров.

  5. mgdbserver переводит экземпляр задания в отладочный режим с помощью ELCORE50_IOC_DBG_JOB_ATTACH.

  6. Пользователь передаёт путь к ELF-файлу в gdb и начинает отладку.

Отладка инициируется отлаживаемым приложением

  1. Отлаживаемое приложение загружает ELF-файл, а также создает задание с помощью функций CreateELF() и CreateElcoreJob(), описанных в документе Библиотека elcore.

  2. Отлаживаемое приложение устанавливает флаг debug_enable структуры elcore50_job_instance в true.

  3. Отлаживаемое приложение ставит экземпляр задания в очередь на исполнение с помощью ioctl() ELCORE50_IOC_ENQUEUE_JOB.

  4. Отлаживаемое приложение в отдельном потоке вызывает функцию ElcoreJobInstancePoll() для ожидания завершения работы экземпляра задания и обработки системных вызовов. Функция ElcoreJobInstancePoll() описана в документе Библиотека elcore.

  5. Пользователь запускает mgdbserver.

  6. Пользователь передаёт в 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, то завершение выполнения задания произойдет только после Завершение процесса отладки.