# MATLAB 23550 **СОДЕРЖАНИЕ** - [Общая структура симулятора](#общая-структура-симулятора) - [Описание стуктуры симулятора](#описание-стуктуры-симулятора) - [Оболочка МК](#оболочка-мк) - [Оболочка программы](#оболочка-программы) - [Код пользователя](#код-пользователя) - [Симуляция плат](#симуляция-плат) - [Инструкция](#инструкция) - [Портирование кода](#портирование-кода) - [Как скомпилировать код](#как-скомпилировать-код) - [Как запустить отладку](#как-запустить-отладку) - [Ошибки при портировании](#ошибки) ## Общая структура симулятора Код для компиляции S-Function лежит в папке ***Inu***. В ней содержатся: - **Оболочка МК ([файлы в корне](#оболочка-мк))**: код S-Function, который запускает код программы - **Оболочка программы ([_app_wrapper_](#оболочка-программы))**: связывает программу и S-Function - **Программа МК ([_Src_](#код-пользователя))**: программа для симуляции - **Симуляция плат (beta) ([_xilinx_wrapper_](#симуляция-плат))**: моделирует внешние платы (пока только ШИМ) Далее приведена структура симулятора. Инструкция для портирования другого кода в MATLAB приведена [ниже](#инструкция) ## Описание стуктуры симулятора Здесь содержиться описание трех блоков симулятора: - [Оболочка МК](#оболочка-мк) - [Оболочка программы](#оболочка-программы) - [Код пользователя](#код-пользователя) - [Симуляция плат (beta)](#симуляция-плат) ### Оболочка МК В этой папке содержиться оболочка (англ. wrapper) для запуска и контроля симуляции микроконтроллеров в MATLAB (любого МК, не только TMS). Оболочка представляет собой S-Function - блок в Simulink, который работает по скомпилированому коду. Компиляция происходит с помощью MSVC-компилятора. S-Function работает особым образом: на шаге `n` она запускает скомпилированный код и ждет пока этот код выполниться. Только когда завершается выполнение кода, S-Function переходит на следующий шаг `n+1`. Но программа МК это бесконечный цикл, который никогда не завершается. Поэтому есть несколько особенностей в выполнении такого кода в виде 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*** и прописываются дефайны для компиляции. Конфигурации оболочки: - `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 for future: разные вектора можно использовать для разных плат_ ### Оболочка программы Оболочка программы позволяет имитировать ёё реальный алгоритм. Оболочка инициализирует программу, запускает необходимые для её работы функции и связывает её с входами/выходами S-Function Ниже приведен перечень всех файлов и краткое описание зачем они нужны: - ***app_includes.h***     - включает все необходимые для симуляции заголовочные файлы программы - ***app_init.c/.h***      - инициализация программы - ***app_io.c/.h***        - запись/считывание входов/выходов S-Function в программу - ***app_wrapper.c/.h***      - вызов функций из программы и создание заглушек для ненужных функций - ***app_configs.h***      - пользовательские конфигурации программы для симулинка Также в папке ***\app_wrapper\device_support*** находяться стандартные библиотеки для TMS, но переделанные под компилятор MSVC (удален `volatile`, добавлены заглушки для `interrupt`, `asm`, `cregister`, добавлен код для симуляции IQlib). ### Код пользователя Данная папка содержит исходный код приложения МК. При этом стандартные библиотеки, которые общие для всех проектов следует помещать в [папку с оболочкой программы](#оболочка-программы). Чтобы не редактировать исходники общих библиотек в каждом проекте. ### Симуляция плат Модули в этой папке моделируют внешние платы. Пока более-менее сделан ШИМ и АЦП, но в будущем планируется расширение и вывод их в отельные S-Function. Чтобы сделать подобие корзины. ###### Cимуляция АЦП (adc_sim.c/.h) Пока не особо работает. Надо разобраться как конкретно преобразовывать физические величины в АЦПшные значения ###### Cимуляция ШИМ (pwm_sim.c/.h) Настраивает счетчик как в Xilinx и симулирует его работу. Есть главный таймер, каждое прерывание которого вызывается алгоритм управления. Поддерживает два режимы формирования ШИМ: - `PWM_SIMULATION_MODE_REGULAR_PWM` - формирование ШИМ для каждого таймера отдельно - `PWM_SIMULATION_MODE_TK_LINES` - через линии ТК для всей фазы разом ## Инструкция Общий алгоритм портирования кода для симуляции в MATLAB приведен ниже. В инструкции есть ссылки на более подробное описание действий. 1. [Портировать код для MATLAB](#портирование-кода) (можно начать с портирования без изменений и далее действовать от шага 2) 2. Проверить [компилируеться ли код](#как-скомпилировать-код). А далее: - если есть ошибки при компиляции, [исправить их](#ошибки-при-компиляции) и вернуться на шаг 2. - если ошибок нет, перейти на шаг 3. 3. Проверить нормально ли запускается и работает симуляция с МК. А далее: - если симуляции вылетает, то необходимо [исправить ошибки](#ошибки-при-симуляции) в [режиме отладки](#как-запустить-отладку) и вернуться на шаг 3. - если симуляция нормально запускается только один раз, и не завершается или не запускается второй раз, то необходимо [исправить ошибки](#ошибки-при-симуляции) в [режиме отладки](#как-запустить-отладку) и вернуться на шаг 3. - если симуляция работает, не вылетает и перезапускается, то перейти на шаг 4. 4. Оценить результаты симуляции. А далее: - если симуляция сходится с реальностью - то всё работает корректно. - если нет - необходимо разбираться в алгоритме и после исправить его и перейти на шаг 2. #### Портирование кода Для начала необходимо весь пользовательский код портировать в отдельную папку для удобства. Например в "***\Src***". Далее в "[run_bat.mex](#оболочка-мк)" надо прописать пути для заголовочных файлов (***\Includes***) и все необходимые для симуляции программы исходники. Все файлы исходников "***.c***" прописывать не обязательно. Если нужно отладить какой-то отдельный модуль программы, можно попробовать ограничиться им, и при возникновении ошибок подключать новые исходники. #### Как скомпилировать код Для компиляции кода необходимо открыть файл ***mexing.m***. Это MATLAB-скрипт, который запускает скрипт "[***run_bat.mex***](#оболочка-мк)" для компиляции. Есть возможность компиляции кода для [отладки](#как-запустить-отладку) #### Как запустить отладку Для отладки симуляции необходимо приписать в ***mexing.m*** в вызове ***run_mex.bat*** слово `debug`, тогда код скомпилируется для дебага. После этого необходимо открыть Visual Studio, открыть папку проекта (там должны быть все исходники программы и симулятора). И подключиться к ***MATLAB.exe***. Теперь можно поставить точку в исходном коде симулятора или программы МК и запустить симуляцию. Когда MATLAB дойдет до этого места, симуляция остановиться и в Visual Studio можно будет посмотреть все переменные, пройти код по строкам и в общем делать всё то, что можно делать в режиме отладки. Для отладки необходимо сначала подключится к процессу, а потом уже запускать симуляцию. Также отладка рабоатет только один раз. При повторном запуске симуляции остановки не произойдет. Поэтому перед каждой отладкой надо перекомпилировать код. #### Ошибки ##### Ошибки при компиляции Самые распространеные ошибки компилятора при портировании нового кода - это ошибки из-за неподключенных исходных файлов. Для исправления ошибок необходимо подключить требуемые модули или создавать заглушки. Также еще могут быть ошибки связанные с разными компиляторами и отсутствия ключевых слов в MSVC, например, ошибки с `volatile`, `interrupt`, `asm`... в библиотеках DPS. Для исправления ошибок надо или удалять эти ключевые слова или создавать для них заглушки-define ##### Ошибки при симуляции Обычно это исключения при чтении по недоступному адресу. Надо выяснить на какой строке произошло исключение и смотреть по какому адресу произошла попытка чтения и по какому адресу надо на самом деле считывать. И после этого скорректировать код так, чтобы адрес брался корректный. Это обычно неинициализированные указатели или некоторые функции (напр. `ReadMemory`/`WriteMemory` когда пытаются считать что-то по адрессам "несуществующей" шины)