Часть 3. Использование j-scope для расширенной отладки.
Описание
Segger предлагает для отладки приложения в реальном времени утилиту «J-Scope». Эта утилита может работать через JTAG, но также работает через стандартный двухпроводный интерфейс SWD. Таким образом, через один интерфейс можно "прошивать" программу, отлаживать по-шагово и в реальном времени.
Запускаем J-Scope, в данном случае производится описание версии V6.11m. Программа предлагает создать новый проект или загрузить существующий

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

Для примера покажем процесс отладки детектора металлов, который определяет наличие и тип металла с помощью вычисления сдвига фазы сигнала на приемной катушке. Детектор с методом «индуктивного баланса». Программа написана под FreeRtos. Алгоритм работы упрощенно выглядит так:
1. Устройство ПДП c помощью АЦП собирает пакет данных со значениями напряжения на приемной катушке, в непрерывном цикле;
2. Прерывания по половине/окончанию буфера уведомляет задачу обработки о готовности очередной порции данных;
3. Задача обработки складывает, усредняет данные, умножает их на значения SIN/COS для определения наличия сдвига и в дальнейшем вычисляет сдвиг фазы.
4. Результаты обработки выводятся на экран функцией, которая запускается при простое FreeRTOS – vApplicationIdleHook.
По этому описанию понятно, что останавливать программу для просмотра значений переменных не желательно, так как останов испортит данные. Нажимаем «ОК» после выбора типа микроконтроллера и elf файла. Теперь поэтапный просмотр алгоритма
Этап 1
Для примера выбираем последнее значение из буфера ПДП, в начале в столбике «Add Symbol» вводим номер требуемого значения: 127, затем внизу устанавливаем «галочку»

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




Первый провал это пронос цветной цели, провал с выбросом – пронос железной цели.
Данные можно сохранить через меню «File/Export Data» в формате CSV.
Их можно обработать в математическом пакете, например Matlab , чтобы оценить соотношение сигнал шум или оценить уровень помех.
Можно сохранить/восстановить данные сессии через Export/Import Raw в меню File. Но перед этим нужно сохранить проект «File/Save Project». При этом загруженные данные можно оперативно масштабировать для просмотра нужных участков.
Этап 2
На свободном поле списка переменных кликнем правой клавишей мыши и добавим накопленное значение сигнала. В данном случае за 128 выборок.

Трудно понять, что происходит. Увеличиваем разрешение U_RX_buf (стать курсором мыши на строку с переменной и нажимать клавишу «-») . На нижнем графике видим пронос цели возле катушки, на верхнем, слабо выражен второй пик, первый еле угадывается. Очевидно, сказывается частота семплирования – 50Гц. Может быть не зря было окошко с предупреждением о рекомендации использовать более быстрый эмулятор? Отключаем Jetlink9 и подключаем Jetlink Ultra.
Поднимаем частоту выборки до 10кГц (значок шестеренки в верхнем левом углу экрана) получаем следующую картинку

При одинаковом масштабе, на одиночных значениях (U_RX_buf, зеленый график) не различить наличие цели. По накопленному (желтый график) видно прохождение цели и работу DMA двумя порциями.
Этап 3
Просмотр sin/cos составляющих сигнала. В детектировании металлов принято обозначать сигналы X/Y. Удалим ранее наблюдаемые, и по правому щелчку мыши добавим два новых.
Для эксперимента выставим частоту выборки 1МГц (период 1 микросекунда).
Значение int занимает 4 байта, две переменных 8. Рассчитываем требуемую битовую частоту тактирования интерфейса 1000000 * 8 * 8 = 64МГц. Частота тактирования интерфейса отладки в нашем микроконтроллере всего 4 Мгц. Так что при запуске процесса приема данных должны получить сообщение об ограничении. Для переменной типа int максимальное количество выборок за секунду срставит 4000000/4/8=125000. С учетом накладных расходов на организацию обмена можно рассчитывать на 100 кГц. Запускаем и получаем подтверждение расчетов.

Нажимаем «OK» и снимаем сигналы X/Y.

По графику видно, что сигнал имеет ступеньки. Экспортируем данные в csv формат и с помощью табличного редактора смотрим на данные. В первом столбце метка времени (микросекунды), затем сигналы X и Y. Для удобства просмотра вырезана средняя часть данных. Видно, что данные меняются ориентировочно каждые 82 выборки. Рассчитаем по временным меткам время, когда сигнал не меняется 14058-3036 = 11022 микросекунды или 11 миллисекунд.

Расчет X/Y происходит порциями по 64 периода частоты раскачки передающей катушки 5800Гц. То есть частота смены значений 5800/64 = 90 Гц.
Период смены значений 1/90 = 11 миллисекунд. Теория и практика сошлась.
Этап 4
Конечный результат работы алгоритма вычислит сдвиг фазы, получаемый при проносе металлического предмета в поле катушки.

Сверху показано изменения значений X и Y, внизу вычисленное значение сдвига фазы. Алгоритм удаляет постоянную составляющую. При отсутствии цели функция арктангенса от соотношения X/Y постоянно меняется – шумит.
При наличии металла, появляется существенная переменная составляющая и сигнал становиться более устойчивым. Кроме этого для того, чтобы оператор не пропустил короткий сигнал, применяется искусственное расширение. В результате получается широкая полочка, которую можно озвучить для оператора и показать значение сдвига в удобном виде.
Можно подвести небольшой итог.
Программа «J-Scope» с помощью эмулятора позволяет отслеживать обработку данных в реальном времени. При этом не нужно вносить изменения в программу. Отладка не вносит дополнительные возмущения в обработку.
Кроме этого появляется возможность производить профилирование задач и функций. Например, для просмотра механизма переключения задач и профилирование времени можно ввести числовую переменную, в которую заносить число, соответствующее задачи или функции.
Вот, например график 4-х подзадач с номерами от 0 до 3, которые работают в приведенном устройстве.
