matlab_23550/README.md

126 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# MATLAB 23550
**‘Ћ„…ђ†ЂЌ€…**
- [ЋбщаЯ структура симулЯтора](#общаЯ-структура-симулЯтора)
- [Ћписание стуктуры симулЯтора](#описание-стуктуры-симулЯтора)
- [Ћболочка ЊЉ](#оболочка-мк)
- [Ћболочка программы](#оболочка-программы)
- [Љод пользователЯ](#код-пользователЯ)
- [‘имулЯциЯ плат](#симулЯциЯ-плат)
- [€нструкциЯ](#инструкциЯ)
- [Џортирование кода](#портирование-кода)
- [Љак скомпилировать код](#как-скомпилировать-код)
- [Љак запустить отладку](#как-запустить-отладку)
- [Ћшибки при портировании](#ошибки)
## ЋбщаЯ структура симулЯтора
Љод длЯ компилЯции S-Function лежит в папке ***Inu***. ней содержатсЯ:
- **Ћболочка ЊЉ ([файлы в корне](#оболочка-мк))**: код S-Function, который запускает код программы
- **Ћболочка программы ([_app_wrapper_](#оболочка-программы))**: свЯзывает программу и S-Function
- **Џрограмма ЊЉ ([_Src_](#код-пользователЯ))**: программа длЯ симулЯции
- **‘имулЯциЯ плат (beta) ([_xilinx_wrapper_](#симулЯциЯ-плат))**: моделирует внешние платы (пока только <20>€Њ)
„алее приведена структура симулЯтора. €нструкциЯ длЯ портированиЯ другого кода в 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*** &emsp;&emsp;&emsp; - код, который запускает код ЊЉ и симулирует периферию. нем содержатьсЯ функции длЯ запуска/остановки потока программы ЊЉ, считывании входов и запись входов S-Function.
- ***MCU.c*** &nbsp;&ensp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; - код длЯ компилЯции S-Function в MATLAB. ‚ызывает функции из ***mcu_wrapper.c***
- ***mcu_wrapper_conf.h*** &ensp; - общий длЯ ***mcu_wrapper.c*** и ***MCU.c*** заголовочный файл. ‘одержит настройки длЯ блока S-Function, а также дефайны длЯ управлениЯ потоком программы ЊЉ.
- ***run_mex.bat*** &nbsp;&emsp;&emsp;&emsp;&emsp; - скрипт длЯ компилЯции кода компилЯтором 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*** &emsp;&emsp;&emsp; - ‘одержит ARM дефайны длЯ компилЯции в MSVC.
- ***app_init.c/.h*** &emsp;&emsp;&emsp;&emsp; - инициализациЯ программы
- ***app_io.c/.h*** &nbsp;&ensp;&emsp;&emsp;&emsp;&emsp; - запись/считывание входов/выходов S-Function в программу
- ***app_wrapper.c/.h*** &nbsp;&nbsp;&ensp;&emsp; - вызов функций из программы и создание заглушек длЯ ненужных функций
- ***def.h*** &ensp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; - дефайны длЯ симулЯции программы в симулинке (осталось от улитковского)
’акже в папке ***\app_wrapper\device_support*** находЯтьсЯ стандартные библиотеки длЯ TMS, но переделанные под компилЯтор MSVC (удален `volatile`, добавлены заглушки длЯ `interrupt`, `asm`, `cregister`, добавлен код длЯ симулЯции IQlib).
### Љод пользователЯ
„аннаЯ папка содержит исходный код приложениЯ ЊЉ. Џри этом стандартные библиотеки, которые общие длЯ всех проектов следует помещать в [папку с оболочкой программы](#оболочка-программы). —тобы не редактировать исходники общих библиотек в каждом проекте.
### ‘имулЯциЯ плат
Њодули в этой папке моделируют внешние платы. Џока более-менее сделан только <20>€Њ, но в будущем планируетсЯ расширение и вывод их в отельные S-Function. —тобы сделать подобие корзины.
###### adc_sim
***adc_sim.c/.h*** - симулЯциЯ Ђ–Џ (пока просто заготовка)
###### pwm_sim
***pwm_sim.c/.h*** - симулЯциЯ <20>€Њ
Џоддерживает два режимы формированиЯ <20>€Њ:
- длЯ каждого таймера отдельно (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` когда пытаютсЯ считать что-то по адрессам "несуществующей" шины)