parse_xml | ||
Src | ||
.gitignore | ||
debug_tools.c | ||
debug_tools.h | ||
DebugVarEdit.exe | ||
DebugVarTerminal.exe | ||
README.md |
DebugTools - Просмотр переменных по указателям
Содержание
- Описание модуля
- Описание приложения для настройки
- Описание терминалки для считывания
- Для разработчиков
Программный модуль DebugTools
Модуль состоит из трех файлов:
- debug_tools.c - реализация считывания переменных
- debug_tools.h - объявление всякого для считывания переменных
- debug_vars.c - определение массива считываемых переменных
Этот модуль предоставляет функциональность для чтения значений переменных во встроенной системе, включая работу с IQ-форматами, защиту доступа и проверку диапазонов памяти.
Для чтения переменных можно использовать функции:
/* Читает значение переменной по индексу */
int Debug_ReadVar(int var_ind, int32_t *return_long);
/* Читает имя переменной по индексу */
int Debug_ReadVarName(int var_ind, DebugVarName_t name_ptr, int *length);
/* Читает возвращаемый тип (IQ) переменной по индексу */
int Debug_ReadVarReturnType(int var_ind, int *vartype);
/* Читает тип переменной по индексу */
int Debug_ReadVarType(int var_ind, int *vartype);
/* Читает значение переменной с нижнего уровня */
int Debug_LowLevel_ReadVar(int32_t *return_long);
/* Инициализирует отладку нижнего уровня */
int Debug_LowLevel_Initialize(DateTime_t *external_date);
/* Читает возвращаемый тип (IQ) низкоуровнено заданной переменной */
int Debug_LowLevel_ReadVarReturnType(int *vartype);
/* Читает тип низкоуровнено заданной переменной.*/
int Debug_LowLevel_ReadVarType(int *vartype);
Переменные доступные для чтения определяются в debug_vars.c (их можно прописывать вручную или генерировать через DebugVarEdit):
// Определение массива с указателями на переменные для отладки
int DebugVar_Qnt = 5;
#pragma DATA_SECTION(dbg_vars,".dbgvar_info")
// pointer_type iq_type return_iq_type short_name
DebugVar_t dbg_vars[] = {\
{(uint8_t *)&freqTerm, pt_float, t_iq_none, t_iq10, "freqT" }, \
{(uint8_t *)&ADC_sf[0][0], pt_int16, t_iq_none, t_iq_none, "ADC_sf00" }, \
{(uint8_t *)&ADC_sf[0][1], pt_int16, t_iq_none, t_iq_none, "ADC_sf01" }, \
{(uint8_t *)&ADC_sf[0][2], pt_int16, t_iq_none, t_iq_none, "ADC_sf02" }, \
{(uint8_t *)&ADC_sf[0][3], pt_int16, t_iq_none, t_iq_none, "ADC_sf03" }, \
{(uint8_t *)&Bender[0].KOhms, pt_uint16, t_iq, t_iq10, "Bend0.KOhm" }, \
{(uint8_t *)&Bender[0].Times, pt_uint16, t_iq_none, t_iq_none, "Bend0.Time" }, \
};
LowLevel - Просмотр абсолютно любых переменных
Также присутствует утилита parse_xml.exe
, которая генерирует .xml
файл с всеми переменными в программе и их адрессами
Для её подключения:
- В Pre-Build Steps добавить следующую команду. Это удаление
debug_tools.obj
файла для его перекомпиялции с актуальной датой компиляции
cmd /c del /Q "${CWD}\Src\DebugTools\debug_tools.obj"
- В Post-Build Steps добавить следующую команду. Это:
- формирование с помощью утилиты компилятора
ofd2000
.xml
файла с полной отладочной информацией. - формирование отладочной информации в текстовом файле (для получения таймштампа)
- запуск утилиты
parse_xml.exe
для формирования итогового<projname>_allVars.xml
с информацией о переменных и адресах
- формирование с помощью утилиты компилятора
"${CG_TOOL_ROOT}/bin/ofd2000" --obj_display=symbols --dwarf --dwarf_display=all --xml --xml_indent=1 --output="${BuildArtifactFileBaseName}_ofd_dump.xml" "${BuildArtifactFilePath}"
"${CG_TOOL_ROOT}/bin/ofd2000" "${BuildArtifactFilePath}" > ${CCS_PROJECT_DIR}/bin/temp.txt
"${CCS_PROJECT_DIR}/Src/DebugTools/parse_xml/parse_xml.exe" ${BuildArtifactFileBaseName}_ofd_dump.xml ${CCS_PROJECT_DIR}/bin/temp.txt ${BuildArtifactFileBaseName}_allVars.xml"
После, с использованием терминалки можно прочитать любые переменные по адресам. (должен совпадать таймштапм в прошивке и .xml
файла, иначе контроллер ответит ошибкой)
DebugVarEdit - Настройка переменных
DebugVarEdit — графическое приложение для Windows, предназначенное для настройки и генерации отладочных переменных (debug_vars.c
) на основе исходного C-проекта. Работает с makefile
проекта, сохраняет изменения в XML и позволяет удобно редактировать переменные и их типы через интерфейс.
Программа — один исполняемый файл DebugVarEdit.exe
, не требующий установки и дополнительных зависимостей.
Требуется Windows 7 или новее.
Как использовать приложение
-
Запустите DebugVarEdit.exe.
-
Укажите пути и контроллер:
- Путь к XML — новый или существующий файл настроек переменных;
- Путь к проекту — путь к корню проека (папка, которая является корнем для проекта в Code Composer);
- Путь к makefile — путь к
makefile
относительно корня проекта; - Путь для debug_vars.c — папка, куда будет сгенерирован файл
debug_vars.c
с переменными. - МК — TMS или STM. Они отличаются размером int, и также принятыми кодировками файлов (utf-8/cp1251)
-
Нажмите Сканировать переменные:
- Программа проанализирует исходники, указанные в makefile, и найдёт все переменные.
- Результат сохранится в двух XML-файлах:
structs.xml
— информация обо всех структурах и typedef;<ваш_файл>.xml
— список всех найденных переменных.
-
Нажмите Добавить переменные:
- В левой таблице отображаются все найденные переменные.
Для добавления переменной в проект дважды кликните по ней или нажмите кнопку>
, чтобы переместить в правую таблицу. - В правой таблице находятся переменные, выбранные для использования.
Чтобы убрать переменную из проекта, переместите её обратно в левую таблицу двойным кликом или кнопкой<
. - После выбора переменных нажмите Применить, чтобы обновить основной список переменных и включить их в проект.
- В левой таблице отображаются все найденные переменные.
-
Настройте параметры выбранных переменных:
- En — включение или отключение переменной для генерации;
- Base Type — базовый тип переменной (например, int8, uint16 и т.д.);
- IQ Type — формат IQ, если применимо;
- Return Type — формат возвращаемого значения (IQ-тип или целочисленный);
- Shortname — короткое имя переменной для для терминалки.
Все параметры выбираются из выпадающих списков, которые можно настроить, чтобы отображались только нужные опции.
-
Нажмите Сгенерировать файл для создания файла
debug_vars.c
с выбранными переменными.
Возможности
- Загрузка и сохранение настроек переменных в XML-файлах.
- Автоматическое определение исходных файлов с переменными для удобства работы.
- Редактирование переменных: включение, короткого имени и типов через удобные списки.
- Подсветка ошибок при вводе (неправильные имена, слишком длинные короткие имена).
- Быстрая фильтрация переменных по столбцам.
- Автоматическая генерация файла debug_vars.c с выбранными переменными.
- Возможность сразу открыть сгенерированный файл в редакторе.
- Умное автодополнение имён переменных и полей структур.
Пример XML-файла
<project proj_path="C:/myproj" makefile_path="Debug/Makefile" structs_path="Src/DebugTools/structs.xml">
<variables>
<var name="g_myvar">
<enable>true</enable>
<show_var>true</show_var>
<shortname>myv</shortname>
<pt_type>pt_float</pt_type>
<iq_type>t_iq24</iq_type>
<return_type>t_iq24</return_type>
<type>float</type>
<file>Src/main/main.c</file>
<extern>true</extern>
<static>false</static>
</var>
</variables>
</project>
DebugVarTerminal - Считывание переменных (для TMS)
DebugVarTerminal — терминалка для считывания переменных по RS-232 протоколу RS_Functions.
Программа — один исполняемый файл DebugVarTerminal.exe
, не требующий установки и дополнительных зависимостей.
Требуется Windows 7 или новее.
Как использовать приложение
-
Запустите DebugVarTerminal.exe.
-
Выберите COM Port и скорость Baud. Нажмиите Open
-
Для считывания переменных заданных в
*debug_vars.c
:- Откройте вкладку Watch.
- Выберите стартовый индекс переменной и количество переменных для считывания.
- Нажмите одну из кнопок:
- Update Service - считывает информацию об именах и возвращаемых IQ типах переемнных
- Read Value(s) - считывает и форматирует значения переменных в соответствии с IQ типами
- Start Polling - начать опрос выбранных переменных с заданным интервалом. При старте опроса, имя и тип переменных считываются автоматически
-
Для считывания переменных по адресам:
- Откройте вкладку LowLevel.
- Выберите
projname_allVars.xml
в папке bin рядом с бинарником. Из него подгрузятся все доступные для считывания переменные - Выберите переменные кнопкной Выбрать переменные
- Задайте IQ тип и возвращаемый IQ тип если требуется
- Нажмите одну из кнопок:
- Read Once - считывает выбранные переменные один раз
- Start Polling - начать опрос выбранных переменных с заданным интервалом
-
Запись в CSV:
- Можно записывавать считываемые переменные в CSV файл, с разделителем
;
- Нажмите кнопку Начать запись в CSV
- Когда нужная выборка будет накоплена нажмите Остаовить запись в CSV
- Нажмите Выбрать файл CSV для выбора пути для сохранения файла и нажмите Сохранить данные в CSV чтобы сохранить
- Генерируется совместимый с LogView
.csv
файл
Все параметры выбираются из выпадающих списков, которые можно настроить, чтобы отображались только нужные опции.
- Можно записывавать считываемые переменные в CSV файл, с разделителем
Возможности
Режим "Watch":
- Быстрое и удобное чтение одной или нескольких переменных по их индексу.
- Автоматическое получение имен, типов и параметров масштабирования (IQ) переменных.
- Запуск постоянного опроса для отслеживания изменений значений в реальном времени.
- Наглядное представление данных в таблице с отображением как сырых, так и масштабированных значений. Режим "LowLevel":
- Прямое чтение данных из памяти по заданным адресам.
- Возможность указания типов указателей, IQ-масштабирования и форматов возвращаемых данных.
- Аналогично режиму "Watch", поддерживается постоянный опрос выбранных низкоуровневых переменных.
- Умное автодополнение имён переменных и полей структур. Логирование в CSV
- Записывайте все полученные значения в файл формата CSV для последующего анализа.
- Легкое управление записью: запуск, остановка и сохранение данных в любой момент.
Для разработчиков
Структура проекта:
Src
├── build/
│ └── build_and_clean.py # Билдинг проекта в .exe (через nuitka или pyinstaller)
├── DebugVarEdit_GUI.py # Главное окно
├── tms_debugvar_term.py # Терминал DebugVarTerminal
├── tms_debugvar_lowlevel.py # Виджет для выбора переменных для LowLevel Watch
├── var_table.py # Таблица выбранных переменных
├── var_selector_window.py # Окно выбора переменных
├── var_selector_table.py # Таблица переменных в окне выбора переменных
├── scan_progress_gui.py # Отображение процесса сканирования переменных
├── scan_vars.py # Сканирование переменных среди .c/.h файлов
├── generate_debug_vars.py # Генерация debug_vars.c
├── allvars_xml_parser.py # Парсинг XML со всеми переменными и структурами
├── csv_logger.py # Логирование переменных в CSV
├── myXML.py # Утилиты для XML
├── makefile_parser.py # Парсинг makefile на .c/.h файлы
├── var_setup.py # Подготовка переменных для окна выбора переменных
├── path_hints.py # Подсказки для автодополнения путей переменных
├── libclang.dll # Бибилиотека clang
├── icon.ico # Иконка
Зависимости
Для запуска приложения:
- Python 3.7+
- clang — используется для парсинга C-кода (требуется
libclang.dll
, лежит в папке Src) - PySide2 — GUI-фреймворк
- lxml — работа с XML
Python 3.7 и PySide2 рекомендуется для совместимости с Windows 7
Для сборки .exe
:
- Nuitka — создает полностью автономный
.exe
без внешних зависимостей - PyInstaller — создает
.exe
с зависимостью отpythonXX.dll
(Python должен быть установлен для запуска.exe
)
Сборка:
Если вы хотите собрать DebugVarEdit.exe
самостоятельно из исходников, используйте скрипт build/build_and_clean.py. Он автоматически собирает проект с помощью Nuitka или PyInstaller:
- Собирает проект в
DebugVarEdit.exe
в корневой папке. - Включает:
- все необходимые
.dll
(например,libclang.dll
), - иконку (
icon.ico
), - плагины PySide2.
- все необходимые
- Очищает временные папки после сборки:
build_temp
__pycache__
<MAIN_SCRIPT_NAME>.*
Все пути, имена файлов, временные папки и выбор между Nuitka и PyInstaller можно настроить в начале файла
build_and_clean.py
.
Установка зависимостей
pip install clang PySide2 lxml nuitka pyinstaller