# DebugTools - Просмотр переменных по указателям ## Содержание 1. [Описание модуля](#программный-модуль-debugtools) 2. [Описание приложения для настройки](#debugvaredit---настройка-переменных) 3. [Описание терминалки для считывания](#debugvarterminal---считывание-переменных-для-tms) 4. [Для разработчиков](#для-разработчиков) # Программный модуль DebugTools Модуль состоит из трех файлов: - **debug_tools.c** - реализация считывания переменных - **debug_tools.h** - объявление всякого для считывания переменных - **debug_vars.c** - определение массива считываемых переменных Этот модуль предоставляет функциональность для чтения значений переменных во встроенной системе, включая работу с IQ-форматами, защиту доступа и проверку диапазонов памяти. Для чтения переменных можно использовать функции: ```c /* Читает значение переменной по индексу */ 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**): ```c // Определение массива с указателями на переменные для отладки 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` для формирования итогового `_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 или новее. --- ## Как использовать приложение 1. Запустите **DebugVarEdit.exe.** 2. Укажите пути и контроллер: - **Путь к XML** — новый или существующий файл настроек переменных; - **Путь к проекту** — путь к корню проека (папка, которая является корнем для проекта в Code Composer); - **Путь к makefile** — путь к `makefile` относительно корня проекта; - **Путь для debug_vars.c** — папка, куда будет сгенерирован файл `debug_vars.c` с переменными. - **МК** — TMS или STM. Они отличаются размером int, и также принятыми кодировками файлов (utf-8/cp1251) 3. Нажмите **Сканировать переменные**: - Программа проанализирует исходники, указанные в makefile, и найдёт все переменные. - Результат сохранится в двух XML-файлах: - `structs.xml` — информация обо всех структурах и typedef; - `<ваш_файл>.xml` — список всех найденных переменных. 4. Нажмите **Добавить переменные**: - В **левой таблице** отображаются все найденные переменные. Для добавления переменной в проект дважды кликните по ней или нажмите кнопку `>`, чтобы переместить в правую таблицу. - В **правой таблице** находятся переменные, выбранные для использования. Чтобы убрать переменную из проекта, переместите её обратно в левую таблицу двойным кликом или кнопкой `<`. - После выбора переменных нажмите **Применить**, чтобы обновить основной список переменных и включить их в проект. 5. Настройте параметры выбранных переменных: - **En** — включение или отключение переменной для генерации; - **Base Type** — базовый тип переменной (например, int8, uint16 и т.д.); - **IQ Type** — формат IQ, если применимо; - **Return Type** — формат возвращаемого значения (IQ-тип или целочисленный); - **Shortname** — короткое имя переменной для для терминалки. Все параметры выбираются из выпадающих списков, которые можно настроить, чтобы отображались только нужные опции. 6. Нажмите **Сгенерировать файл** для создания файла `debug_vars.c` с выбранными переменными. --- ## Возможности - Загрузка и сохранение настроек переменных в XML-файлах. - Автоматическое определение исходных файлов с переменными для удобства работы. - Редактирование переменных: включение, короткого имени и типов через удобные списки. - Подсветка ошибок при вводе (неправильные имена, слишком длинные короткие имена). - Быстрая фильтрация переменных по столбцам. - Автоматическая генерация файла debug_vars.c с выбранными переменными. - Возможность сразу открыть сгенерированный файл в редакторе. - Умное автодополнение имён переменных и полей структур. --- ## Пример XML-файла ```xml true true myv pt_float t_iq24 t_iq24 float Src/main/main.c true false ``` --- # DebugVarTerminal - Считывание переменных (для TMS) **DebugVarTerminal** — терминалка для считывания переменных по RS-232 протоколу RS_Functions. Программа — один исполняемый файл `DebugVarTerminal.exe`, не требующий установки и дополнительных зависимостей. > Требуется Windows 7 или новее. --- ## Как использовать приложение 1. Запустите **DebugVarTerminal.exe.** 2. Выберите COM Port и скорость Baud. Нажмиите **Open** 3. Для считывания переменных заданных в `*debug_vars.c`: - Откройте вкладку **Watch**. - Выберите стартовый индекс переменной и количество переменных для считывания. - Нажмите одну из кнопок: - **Update Service** - считывает информацию об именах и возвращаемых IQ типах переемнных - **Read Value(s)** - считывает и форматирует значения переменных в соответствии с IQ типами - **Start Polling** - начать опрос выбранных переменных с заданным интервалом. При старте опроса, имя и тип переменных считываются автоматически 4. Для считывания переменных по адресам: - Откройте вкладку **LowLevel**. - Выберите `projname_allVars.xml` в папке bin рядом с бинарником. Из него подгрузятся все доступные для считывания переменные - Выберите переменные кнопкной **Выбрать переменные** - Задайте IQ тип и возвращаемый IQ тип если требуется - Нажмите одну из кнопок: - **Read Once** - считывает выбранные переменные один раз - **Start Polling** - начать опрос выбранных переменных с заданным интервалом 5. Запись в CSV: - Можно записывавать считываемые переменные в CSV файл, с разделителем `;` - Нажмите кнопку **Начать запись в CSV** - Когда нужная выборка будет накоплена нажмите **Остаовить запись в CSV** - Нажмите **Выбрать файл CSV** для выбора пути для сохранения файла и нажмите **Сохранить данные в CSV** чтобы сохранить - Генерируется совместимый с LogView `.csv` файл Все параметры выбираются из выпадающих списков, которые можно настроить, чтобы отображались только нужные опции. --- ## Возможности Режим "Watch": - Быстрое и удобное чтение одной или нескольких переменных по их индексу. - Автоматическое получение имен, типов и параметров масштабирования (IQ) переменных. - Запуск постоянного опроса для отслеживания изменений значений в реальном времени. - Наглядное представление данных в таблице с отображением как сырых, так и масштабированных значений. Режим "LowLevel": - Прямое чтение данных из памяти по заданным адресам. - Возможность указания типов указателей, IQ-масштабирования и форматов возвращаемых данных. - Аналогично режиму "Watch", поддерживается постоянный опрос выбранных низкоуровневых переменных. - Умное автодополнение имён переменных и полей структур. Логирование в CSV - Записывайте все полученные значения в файл формата CSV для последующего анализа. - Легкое управление записью: запуск, остановка и сохранение данных в любой момент. --- --- # Для разработчиков ### Структура проекта: ```bash 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__` - `.*` > Все пути, имена файлов, временные папки и выбор между Nuitka и PyInstaller можно настроить в начале файла `build_and_clean.py`. ### Установка зависимостей ```bash pip install clang PySide2 lxml nuitka pyinstaller ```