9.8 KiB
MATLAB 23550
‘Ћ„…ђ†ЂЌ€…
ЋбщаЯ структура симулЯтора
Љод длЯ компилЯции S-Function лежит в папке Inu. ‚ ней содержатсЯ:
- Ћболочка ЊЉ (файлы в корне): код S-Function, который запускает код программы
- Ћболочка программы (app_wrapper): свЯзывает программу и S-Function
- Џрограмма ЊЉ (Src): программа длЯ симулЯции
- ‘имулЯциЯ плат (beta) (xilinx_wrapper): моделирует внешние платы (пока только <20>€Њ)
„алее приведена структура симулЯтора. €нструкциЯ длЯ портированиЯ другого кода в MATLAB приведена ниже
Ћписание стуктуры симулЯтора
‡десь содержитьсЯ описание трех блоков симулЯтора:
Ћболочка ЊЉ
‚ этой папке содержитьсЯ оболочка (англ. 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-FunctionIN_PORT_NUMB
- количество входных векторов S-FunctionOUT_PORT_WIDTH
- размерность выходного вектора S-FunctionOUT_PORT_NUMB
- количество выходных векторов S-Function
Note: дефайн RUN_APP_MAIN_FUNC_THREAD
пока выключен и поток длЯ main() не используетсЯ)
Note for future: разные вектора можно использовать длЯ разных плат
Ћболочка программы
Ћболочка длЯ программы позволЯет имитировать реальный алгоритм программы. Ћна инициализирует еЮ, запускает необходимые длЯ еЮ работы функции и свЯзывает еЮ с входами/выходами S-Function
Ќиже приведен перечень всех файлов и краткое описание зачем они нужны:
- 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).
Љод пользователЯ
„аннаЯ папка содержит исходный код приложениЯ ЊЉ. Џри этом стандартные библиотеки, которые общие длЯ всех проектов следует помещать в папку с оболочкой программы. —тобы не редактировать исходники общих библиотек в каждом проекте.
‘имулЯциЯ плат
Њодули в этой папке моделируют внешние платы. Џока более-менее сделан только <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 приведен ниже. ‚ инструкции есть ссылки на более подробное описание действий.
- Џортировать код длЯ MATLAB (можно начать с портированиЯ без изменений и далее действовать от шага 2)
- Џроверить компилируетьсЯ ли код. Ђ далее:
- если есть ошибки при компилЯции, исправить их и вернутьсЯ на шаг 2.
- если ошибок нет, перейти на шаг 3.
- Џроверить нормально ли запускаетсЯ и работает симулЯциЯ с ЊЉ. Ђ далее:
- если симулЯции вылетает, то необходимо исправить ошибки в режиме отладки и вернутьсЯ на шаг 3.
- если симулЯциЯ нормально запускаетсЯ только один раз, и не завершаетсЯ или не запускаетсЯ второй раз, то необходимо исправить ошибки в режиме отладки и вернутьсЯ на шаг 3.
- если симулЯциЯ работает, не вылетает и перезапускаетсЯ, то перейти на шаг 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
когда пытаютсЯ считать что-то по адрессам "несуществующей" шины)