Обновить README.md
This commit is contained in:
parent
988b9f8e76
commit
49e4a8a7d6
186
README.md
186
README.md
@ -1,126 +1,126 @@
|
||||
# MATLAB 23550
|
||||
**‘Ћ„…ђ†ЂЌ€…**
|
||||
- [ЋбщаЯ структура симулЯтора](#общаЯ-структура-симулЯтора)
|
||||
- [Ћписание стуктуры симулЯтора](#описание-стуктуры-симулЯтора)
|
||||
- [Ћболочка ЊЉ](#оболочка-мк)
|
||||
- [Ћболочка программы](#оболочка-программы)
|
||||
- [Љод пользователЯ](#код-пользователЯ)
|
||||
- [‘имулЯциЯ плат](#симулЯциЯ-плат)
|
||||
- [€нструкциЯ](#инструкциЯ)
|
||||
- [Џортирование кода](#портирование-кода)
|
||||
- [Љак скомпилировать код](#как-скомпилировать-код)
|
||||
- [Љак запустить отладку](#как-запустить-отладку)
|
||||
- [Ћшибки при портировании](#ошибки)
|
||||
**СОДЕРЖАНИЕ**
|
||||
- [Общая структура симулятора](#общая-структура-симулятора)
|
||||
- [Описание стуктуры симулятора](#описание-стуктуры-симулятора)
|
||||
- [Оболочка МК](#оболочка-мк)
|
||||
- [Оболочка программы](#оболочка-программы)
|
||||
- [Код пользователя](#код-пользователя)
|
||||
- [Симуляция плат](#симуляция-плат)
|
||||
- [Инструкция](#инструкция)
|
||||
- [Портирование кода](#портирование-кода)
|
||||
- [Как скомпилировать код](#как-скомпилировать-код)
|
||||
- [Как запустить отладку](#как-запустить-отладку)
|
||||
- [Ошибки при портировании](#ошибки)
|
||||
|
||||
## ЋбщаЯ структура симулЯтора
|
||||
Љод длЯ компилЯции S-Function лежит в папке ***Inu***. ‚ ней содержатсЯ:
|
||||
- **Ћболочка ЊЉ ([файлы в корне](#оболочка-мк))**: код S-Function, который запускает код программы
|
||||
- **Ћболочка программы ([_app_wrapper_](#оболочка-программы))**: свЯзывает программу и S-Function
|
||||
- **Џрограмма ЊЉ ([_Src_](#код-пользователЯ))**: программа длЯ симулЯции
|
||||
- **‘имулЯциЯ плат (beta) ([_xilinx_wrapper_](#симулЯциЯ-плат))**: моделирует внешние платы (пока только <20>€Њ)
|
||||
## Общая структура симулятора
|
||||
Код для компиляции 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).
|
||||
|
||||
### Љод пользователЯ
|
||||
„аннаЯ папка содержит исходный код приложениЯ ЊЉ. Џри этом стандартные библиотеки, которые общие длЯ всех проектов следует помещать в [папку с оболочкой программы](#оболочка-программы). —тобы не редактировать исходники общих библиотек в каждом проекте.
|
||||
### Код пользователя
|
||||
Данная папка содержит исходный код приложения МК. При этом стандартные библиотеки, которые общие для всех проектов следует помещать в [папку с оболочкой программы](#оболочка-программы). Чтобы не редактировать исходники общих библиотек в каждом проекте.
|
||||
|
||||
### ‘имулЯциЯ плат
|
||||
Њодули в этой папке моделируют внешние платы. Џока более-менее сделан только <20>€Њ, но в будущем планируетсЯ расширение и вывод их в отельные S-Function. —тобы сделать подобие корзины.
|
||||
### Симуляция плат
|
||||
Модули в этой папке моделируют внешние платы. Пока более-менее сделан только ШИМ, но в будущем планируется расширение и вывод их в отельные S-Function. Чтобы сделать подобие корзины.
|
||||
|
||||
###### adc_sim
|
||||
***adc_sim.c/.h*** - симулЯциЯ Ђ–Џ (пока просто заготовка)
|
||||
***adc_sim.c/.h*** - симуляция АЦП (пока просто заготовка)
|
||||
|
||||
###### pwm_sim
|
||||
***pwm_sim.c/.h*** - симулЯциЯ <20>€Њ
|
||||
Џоддерживает два режимы формированиЯ <20>€Њ:
|
||||
- длЯ каждого таймера отдельно (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` когда пытаютсЯ считать что-то по адрессам "несуществующей" шины)
|
||||
Это обычно неинициализированные указатели или некоторые функции (напр. `ReadMemory`/`WriteMemory` когда пытаются считать что-то по адрессам "несуществующей" шины)
|
Loading…
Reference in New Issue
Block a user