From 49e4a8a7d6aafe8e7f97a7ee9602ccfab6c1932b Mon Sep 17 00:00:00 2001 From: Coal56AB <coal56ab@noreply.localhost> Date: Sat, 18 Jan 2025 20:41:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 186 +++++++++++++++++++++++++++--------------------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/README.md b/README.md index 4e71ce6..b1134bb 100644 --- a/README.md +++ b/README.md @@ -1,126 +1,126 @@ # MATLAB 23550 - **����������** -- [����� ��������� ����������](#�����-���������-����������) -- [�������� �������� ����������](#��������-��������-����������) - - [�������� ��](#��������-��) - - [�������� ���������](#��������-���������) - - [��� ������������](#���-������������) - - [��������� ����](#���������-����) -- [����������](#����������) - - [������������ ����](#������������-����) - - [��� �������������� ���](#���-��������������-���) - - [��� ��������� �������](#���-���������-�������) - - [������ ��� ������������](#������) + **СОДЕРЖАНИЕ** +- [Общая структура симулятора](#общая-структура-симулятора) +- [Описание стуктуры симулятора](#описание-стуктуры-симулятора) + - [Оболочка МК](#оболочка-мк) + - [Оболочка программы](#оболочка-программы) + - [Код пользователя](#код-пользователя) + - [Симуляция плат](#симуляция-плат) +- [Инструкция](#инструкция) + - [Портирование кода](#портирование-кода) + - [Как скомпилировать код](#как-скомпилировать-код) + - [Как запустить отладку](#как-запустить-отладку) + - [Ошибки при портировании](#ошибки) -## ����� ��������� ���������� -��� ��� ���������� S-Function ����� � ����� ***Inu***. � ��� ����������: -- **�������� �� ([����� � �����](#��������-��))**: ��� S-Function, ������� ��������� ��� ��������� -- **�������� ��������� ([_app_wrapper_](#��������-���������))**: ��������� ��������� � S-Function -- **��������� �� ([_Src_](#���-������������))**: ��������� ��� ��������� -- **��������� ���� (beta) ([_xilinx_wrapper_](#���������-����))**: ���������� ������� ����� (���� ������ ���) +## Общая структура симулятора +Код для компиляции S-Function лежит в папке ***Inu***. В ней содержатся: +- **Оболочка МК ([файлы в корне](#оболочка-мк))**: код S-Function, который запускает код программы +- **Оболочка программы ([_app_wrapper_](#оболочка-программы))**: связывает программу и S-Function +- **Программа МК ([_Src_](#код-пользователя))**: программа для симуляции +- **Симуляция плат (beta) ([_xilinx_wrapper_](#симуляция-плат))**: моделирует внешние платы (пока только ШИМ) -����� ��������� ��������� ����������. ���������� ��� ������������ ������� ���� � MATLAB ��������� [����](#����������) +Далее приведена структура симулятора. Инструкция для портирования другого кода в MATLAB приведена [ниже](#инструкция) -## �������� �������� ���������� -����� ����������� �������� ���� ������ ����������: -- [�������� ��](#��������-��) -- [�������� ���������](#��������-���������) -- [��� ������������](#���-������������) -- [��������� ���� (beta)](#���������-����) +## Описание стуктуры симулятора +Здесь содержиться описание трех блоков симулятора: +- [Оболочка МК](#оболочка-мк) +- [Оболочка программы](#оболочка-программы) +- [Код пользователя](#код-пользователя) +- [Симуляция плат (beta)](#симуляция-плат) -### �������� �� -� ���� ����� ����������� �������� (����. wrapper) ��� ������� � �������� ��������� ����������������� � MATLAB (������ ��, �� ������ TMS). �������� ������������ ����� S-Function - ���� � Simulink, ������� �������� �� ���������������� ����. ���������� ���������� � ������� MSVC-�����������. +### Оболочка МК +В этой папке содержиться оболочка (англ. wrapper) для запуска и контроля симуляции микроконтроллеров в MATLAB (любого МК, не только TMS). Оболочка представляет собой S-Function - блок в Simulink, который работает по скомпилированому коду. Компиляция происходит с помощью MSVC-компилятора. -S-Function �������� ������ �������: �� ���� `n` ��� ��������� ���������������� ��� � ���� ���� ���� ��� �����������. ������ ����� ����������� ���������� ����, S-Function ��������� �� ��������� ��� `n+1`. +S-Function работает особым образом: на шаге `n` она запускает скомпилированный код и ждет пока этот код выполниться. Только когда завершается выполнение кода, S-Function переходит на следующий шаг `n+1`. -�� ��������� �� ��� ����������� ����, ������� ������� �� �����������. ������� ���� ��������� ������������ � ���������� ������ ���� � ���� S-Function: -- ��� ��������� ��������� ��������� ����� ��� ��������� ��. ���� ����� ����������� � ������ �������� ���� ���������, ����������� �����-�� �����, � ����� ������������������. ��� ��������� ���� S-Function ����������� � ������� �� ��������� ���. -- ���������� ������� ����� ��������� �� � ����� ���������. ��� ����� ������������ ������ ������ ��� while. ���� ������ ������ ������� while, ��������� ������� ��������� ���������. � ���� ��������� ���� ���������, ��� ����������� ����� `while()` ������������ � ����� ������� �� ����� ������� `main()` � ��������� ����. +Но программа МК это бесконечный цикл, который никогда не завершается. Поэтому есть несколько особенностей в выполнении такого кода в виде S-Function: +- Для симуляции создается отдельный поток для программы МК. Этот поток запускается в начале текущего шага симуляции, выполняется какое-то время, а потом приостанавливается. Это позволяет коду S-Function завершиться и перейти на следующий шаг. +- Необходимо закрыть поток программы МК в конце симуляции. Для этого используется особый дефайн для while. Этот дефайн помимо условия while, проверяет условие окончания симуляции. И если симуляцию надо завершить, все бесконечные циклы `while()` пропускаются и поток доходит до конца функции `main()` и завершает себя. -����� �������� �������� 4 �����: -- ***mcu_wrapper.c***     - ���, ������� ��������� ��� �� � ���������� ���������. � ��� ����������� ������� ��� �������/��������� ������ ��������� ��, ���������� ������ � ������ ������ S-Function. -- ***MCU.c***         - ��� ��� ���������� S-Function � MATLAB. �������� ������� �� ***mcu_wrapper.c*** -- ***mcu_wrapper_conf.h***   - ����� ��� ***mcu_wrapper.c*** � ***MCU.c*** ������������ ����. �������� ��������� ��� ����� S-Function, � ����� ������� ��� ���������� ������� ��������� ��. -- ***run_mex.bat***      - ������ ��� ���������� ���� ������������ MSVC. � ��� ������������� ���� ��� ������������ ������ ***.h***, ����������� ����� ��������� ���� ***.c*** � ������������� ������� ��� ����������. +Всего оболочка содержит 4 файла: +- ***mcu_wrapper.c***     - код, который запускает код МК и симулирует периферию. В нем содержаться функции для запуска/остановки потока программы МК, считывании входов и запись входов S-Function. +- ***MCU.c***         - код для компиляции S-Function в MATLAB. Вызывает функции из ***mcu_wrapper.c*** +- ***mcu_wrapper_conf.h***   - общий для ***mcu_wrapper.c*** и ***MCU.c*** заголовочный файл. Содержит настройки для блока S-Function, а также дефайны для управления потоком программы МК. +- ***run_mex.bat***      - скрипт для компиляции кода компилятором MSVC. В нем прописываются пути для заголовочных файлов ***.h***, указываются файлы исходного кода ***.c*** и прописываются дефайны для компиляции. -������������ ��������: -- `RUN_APP_MAIN_FUNC_THREAD` - �������� � ������ ���������� ������ ��� main() -- `DEKSTOP_CYCLES_FOR_MCU_APP` - ���������� ������ ������� for(;;), � ������� �������� ����� �������� ����� main() -- `MCU_CORE_CLOCK` - ������� ������������� ���������� (���� ����� �� ������������) -- `IN_PORT_WIDTH` - ����������� �������� ������� S-Function -- `IN_PORT_NUMB` - ���������� ������� �������� S-Function -- `OUT_PORT_WIDTH` - ����������� ��������� ������� S-Function -- `OUT_PORT_NUMB` - ���������� �������� �������� S-Function +Конфигурации оболочки: +- `RUN_APP_MAIN_FUNC_THREAD` - создание и запуск отдельного потока для main() +- `DEKSTOP_CYCLES_FOR_MCU_APP` - количество циклов пустого for(;;), в течении которого будет работать поток main() +- `MCU_CORE_CLOCK` - частота симулируемого процессора (пока нигде не используется) +- `IN_PORT_WIDTH` - размерность входного вектора S-Function +- `IN_PORT_NUMB` - количество входных векторов S-Function +- `OUT_PORT_WIDTH` - размерность выходного вектора S-Function +- `OUT_PORT_NUMB` - количество выходных векторов S-Function -_Note: ������ `RUN_APP_MAIN_FUNC_THREAD` ���� �������� � ����� ��� main() �� ������������)_ +_Note: дефайн `RUN_APP_MAIN_FUNC_THREAD` пока выключен и поток для main() не используется)_ -_Note for future: ������ ������� ����� ������������ ��� ������ ����_ +_Note for future: разные вектора можно использовать для разных плат_ -### �������� ��������� -�������� ��� ��������� ��������� ����������� �������� �������� ���������. ��� �������������� ��, ��������� ����������� ��� �� ������ ������� � ��������� �� � �������/�������� S-Function +### Оболочка программы +Оболочка для программы позволяет имитировать реальный алгоритм программы. Она инициализирует её, запускает необходимые для её работы функции и связывает её с входами/выходами S-Function -���� �������� �������� ���� ������ � ������� �������� ����� ��� �����: -- ***app_includes.h***     - �������� ARM ������� ��� ���������� � MSVC. -- ***app_init.c/.h***      - ������������� ��������� -- ***app_io.c/.h***       - ������/���������� ������/������� S-Function � ��������� -- ***app_wrapper.c/.h***    - ����� ������� �� ��������� � �������� �������� ��� �������� ������� -- ***def.h***          - ������� ��� ��������� ��������� � ��������� (�������� �� ������������) +Ниже приведен перечень всех файлов и краткое описание зачем они нужны: +- ***app_includes.h***     - Содержит ARM дефайны для компиляции в MSVC. +- ***app_init.c/.h***      - инициализация программы +- ***app_io.c/.h***       - запись/считывание входов/выходов S-Function в программу +- ***app_wrapper.c/.h***    - вызов функций из программы и создание заглушек для ненужных функций +- ***def.h***          - дефайны для симуляции программы в симулинке (осталось от улитковского) -����� � ����� ***\app_wrapper\device_support*** ���������� ����������� ���������� ��� TMS, �� ������������ ��� ���������� MSVC (������ `volatile`, ��������� �������� ��� `interrupt`, `asm`, `cregister`, �������� ��� ��� ��������� IQlib). +Также в папке ***\app_wrapper\device_support*** находяться стандартные библиотеки для TMS, но переделанные под компилятор MSVC (удален `volatile`, добавлены заглушки для `interrupt`, `asm`, `cregister`, добавлен код для симуляции IQlib). -### ��� ������������ -������ ����� �������� �������� ��� ���������� ��. ��� ���� ����������� ����������, ������� ����� ��� ���� �������� ������� �������� � [����� � ��������� ���������](#��������-���������). ����� �� ������������� ��������� ����� ��������� � ������ �������. +### Код пользователя +Данная папка содержит исходный код приложения МК. При этом стандартные библиотеки, которые общие для всех проектов следует помещать в [папку с оболочкой программы](#оболочка-программы). Чтобы не редактировать исходники общих библиотек в каждом проекте. -### ��������� ���� -������ � ���� ����� ���������� ������� �����. ���� �����-����� ������ ������ ���, �� � ������� ����������� ���������� � ����� �� � �������� S-Function. ����� ������� ������� �������. +### Симуляция плат +Модули в этой папке моделируют внешние платы. Пока более-менее сделан только ШИМ, но в будущем планируется расширение и вывод их в отельные S-Function. Чтобы сделать подобие корзины. ###### adc_sim -***adc_sim.c/.h*** - ��������� ��� (���� ������ ���������) +***adc_sim.c/.h*** - симуляция АЦП (пока просто заготовка) ###### pwm_sim -***pwm_sim.c/.h*** - ��������� ��� -������������ ��� ������ ������������ ���: -- ��� ������� ������� �������� (PWM_SIMULATION_MODE_REGULAR_PWM) -- ����� ����� �� ��� ���� ���� ����� (PWM_SIMULATION_MODE_TK_LINES). +***pwm_sim.c/.h*** - симуляция ШИМ +Поддерживает два режимы формирования ШИМ: +- для каждого таймера отдельно (PWM_SIMULATION_MODE_REGULAR_PWM) +- через линии ТК для всей фазы разом (PWM_SIMULATION_MODE_TK_LINES). -## ���������� -����� �������� ������������ ���� ��� ��������� � MATLAB �������� ����. � ���������� ���� ������ �� ����� ��������� �������� ��������. -1. [����������� ��� ��� MATLAB](#������������-����) (����� ������ � ������������ ��� ��������� � ����� ����������� �� ���� 2) -2. ��������� [�������������� �� ���](#���-��������������-���). � �����: - - ���� ���� ������ ��� ����������, [��������� ��](#������-���-����������) � ��������� �� ��� 2. - - ���� ������ ���, ������� �� ��� 3. -3. ��������� ��������� �� ����������� � �������� ��������� � ��. � �����: - - ���� ��������� ��������, �� ���������� [��������� ������](#������-���-���������) � [������ �������](#���-���������-�������) � ��������� �� ��� 3. - - ���� ��������� ��������� ����������� ������ ���� ���, � �� ����������� ��� �� ����������� ������ ���, �� ���������� [��������� ������](#������-���-���������) � [������ �������](#���-���������-�������) � ��������� �� ��� 3. - - ���� ��������� ��������, �� �������� � ���������������, �� ������� �� ��� 4. -4. ������� ���������� ���������. � �����: - - ���� ��������� �������� � ����������� - �� ��� �������� ���������. - - ���� ��� - ���������� ����������� � ��������� � ����� ��������� ��� � ������� �� ��� 2. +## Инструкция +Общий алгоритм портирования кода для симуляции в MATLAB приведен ниже. В инструкции есть ссылки на более подробное описание действий. +1. [Портировать код для MATLAB](#портирование-кода) (можно начать с портирования без изменений и далее действовать от шага 2) +2. Проверить [компилируеться ли код](#как-скомпилировать-код). А далее: + - если есть ошибки при компиляции, [исправить их](#ошибки-при-компиляции) и вернуться на шаг 2. + - если ошибок нет, перейти на шаг 3. +3. Проверить нормально ли запускается и работает симуляция с МК. А далее: + - если симуляции вылетает, то необходимо [исправить ошибки](#ошибки-при-симуляции) в [режиме отладки](#как-запустить-отладку) и вернуться на шаг 3. + - если симуляция нормально запускается только один раз, и не завершается или не запускается второй раз, то необходимо [исправить ошибки](#ошибки-при-симуляции) в [режиме отладки](#как-запустить-отладку) и вернуться на шаг 3. + - если симуляция работает, не вылетает и перезапускается, то перейти на шаг 4. +4. Оценить результаты симуляции. А далее: + - если симуляция сходится с реальностью - то всё работает корректно. + - если нет - необходимо разбираться в алгоритме и после исправить его и перейти на шаг 2. -#### ������������ ���� -��� ������ ���������� ���� ���������������� ��� ����������� � ��������� ����� ��� ��������. �������� � "***\Src***". +#### Портирование кода +Для начала необходимо весь пользовательский код портировать в отдельную папку для удобства. Например в "***\Src***". -����� � "[run_bat.mex](#��������-��)" ���� ��������� ���� ��� ������������ ������ (***\Includes***) � ��� ����������� ��� ��������� ��������� ���������. ��� ����� ���������� "***.c***" ����������� �� �����������. ���� ����� �������� �����-�� ��������� ������ ���������, ����� ����������� ������������ ��, � ��� ������������� ������ ���������� ����� ���������. +Далее в "[run_bat.mex](#оболочка-мк)" надо прописать пути для заголовочных файлов (***\Includes***) и все необходимые для симуляции программы исходники. Все файлы исходников "***.c***" прописывать не обязательно. Если нужно отладить какой-то отдельный модуль программы, можно попробовать ограничиться им, и при возникновении ошибок подключать новые исходники. -#### ��� �������������� ��� -��� ���������� ���� ���������� ������� ���� ***mexing.m***. ��� MATLAB-������, ������� ��������� ������ "[***run_bat.mex***](#��������-��)" ��� ����������. ���� ����������� ���������� ���� ��� [�������](#���-���������-�������) +#### Как скомпилировать код +Для компиляции кода необходимо открыть файл ***mexing.m***. Это MATLAB-скрипт, который запускает скрипт "[***run_bat.mex***](#оболочка-мк)" для компиляции. Есть возможность компиляции кода для [отладки](#как-запустить-отладку) -#### ��� ��������� ������� -��� ������� ��������� ���������� ��������� � ***mexing.m*** � ������ ***run_mex.bat*** ����� `debug`, ����� ��� �������������� ��� ������. ����� ����� ���������� ������� Visual Studio, ������� ����� ������� (��� ������ ���� ��� ��������� ��������� � ����������). � ������������ � ***MATLAB.exe***. +#### Как запустить отладку +Для отладки симуляции необходимо приписать в ***mexing.m*** в вызове ***run_mex.bat*** слово `debug`, тогда код скомпилируется для дебага. После этого необходимо открыть Visual Studio, открыть папку проекта (там должны быть все исходники программы и симулятора). И подключиться к ***MATLAB.exe***. -������ ����� ��������� ����� � �������� ���� ���������� ��� ��������� �� � ��������� ���������. ����� MATLAB ������ �� ����� �����, ��������� ������������ � � Visual Studio ����� ����� ���������� ��� ����������, ������ ��� �� ������� � � ����� ������ ��� ��, ��� ����� ������ � ������ �������. +Теперь можно поставить точку в исходном коде симулятора или программы МК и запустить симуляцию. Когда MATLAB дойдет до этого места, симуляция остановиться и в Visual Studio можно будет посмотреть все переменные, пройти код по строкам и в общем делать всё то, что можно делать в режиме отладки. -��� ������� ���������� ������� ����������� � ��������, � ����� ��� ��������� ���������. ����� ������� �������� ������ ���� ���. ��� ��������� ������� ��������� ��������� �� ����������. ������� ����� ������ �������� ���� ����������������� ���. +Для отладки необходимо сначала подключится к процессу, а потом уже запускать симуляцию. Также отладка рабоатет только один раз. При повторном запуске симуляции остановки не произойдет. Поэтому перед каждой отладкой надо перекомпилировать код. -#### ������ -##### ������ ��� ���������� -����� ��������������� ������ ����������� ��� ������������ ������ ���� - ��� ������ ��-�� �������������� �������� ������. ��� ����������� ������ ���������� ���������� ��������� ������ ��� ��������� ��������. +#### Ошибки +##### Ошибки при компиляции +Самые распространеные ошибки компилятора при портировании нового кода - это ошибки из-за неподключенных исходных файлов. Для исправления ошибок необходимо подключить требуемые модули или создавать заглушки. -����� ��� ����� ���� ������ ��������� � ������� ������������� � ���������� �������� ���� � MSVC, ��������, ������ � `volatile`, `interrupt`, `asm`... � ����������� DPS. ��� ����������� ������ ���� ��� ������� ��� �������� ����� ��� ��������� ��� ��� ��������-define +Также еще могут быть ошибки связанные с разными компиляторами и отсутствия ключевых слов в MSVC, например, ошибки с `volatile`, `interrupt`, `asm`... в библиотеках DPS. Для исправления ошибок надо или удалять эти ключевые слова или создавать для них заглушки-define -##### ������ ��� ��������� -������ ��� ���������� ��� ������ �� ������������ ������. ���� �������� �� ����� ������ ��������� ���������� � �������� �� ������ ������ ��������� ������� ������ � �� ������ ������ ���� �� ����� ���� ���������. � ����� ����� ��������������� ��� ���, ����� ����� ������ ����������. +##### Ошибки при симуляции +Обычно это исключения при чтении по недоступному адресу. Надо выяснить на какой строке произошло исключение и смотреть по какому адресу произошла попытка чтения и по какому адресу надо на самом деле считывать. И после этого скорректировать код так, чтобы адрес брался корректный. -��� ������ �������������������� ��������� ��� ��������� ������� (����. `ReadMemory`/`WriteMemory` ����� �������� ������� ���-�� �� �������� "��������������" ����) \ No newline at end of file +Это обычно неинициализированные указатели или некоторые функции (напр. `ReadMemory`/`WriteMemory` когда пытаются считать что-то по адрессам "несуществующей" шины) \ No newline at end of file