Начата работа над GUI для симулятора:
- выставление настроек компиляции - задание исходников и путей для компиляции
This commit is contained in:
parent
70e524f041
commit
3a14a5c252
@ -45,8 +45,8 @@
|
|||||||
|
|
||||||
// Parametrs of MCU simulator
|
// Parametrs of MCU simulator
|
||||||
//#define RUN_APP_MAIN_FUNC_THREAD ///< Enable using thread for MCU main() func
|
//#define RUN_APP_MAIN_FUNC_THREAD ///< Enable using thread for MCU main() func
|
||||||
#define DEKSTOP_CYCLES_FOR_MCU_APP 0xFF ///< number of for() cycles after which MCU thread would be suspended
|
//#define DEKSTOP_CYCLES_FOR_MCU_APP 0xFF ///< number of for() cycles after which MCU thread would be suspended
|
||||||
#define MCU_CORE_CLOCK 72000000
|
//#define MCU_CORE_CLOCK 72000000
|
||||||
|
|
||||||
|
|
||||||
//#define DEINITIALIZE_AFTER_SIM ///< Enable deinitializing structures at simulation ends
|
//#define DEINITIALIZE_AFTER_SIM ///< Enable deinitializing structures at simulation ends
|
||||||
|
|||||||
@ -1,23 +1,30 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
:: Получаем аргументы из командной строки
|
||||||
|
:: %1 - includes_USER
|
||||||
|
:: %2 - code_USER
|
||||||
|
:: %3 - режим (например, debug)
|
||||||
|
|
||||||
set defines=-D"STM32F103xB" -D"USE_HAL_DRIVER"^
|
:: Аргументы:
|
||||||
|
:: %1 — includes строка (в кавычках)
|
||||||
|
:: %2 — sources строка
|
||||||
|
:: %3 — defines строка
|
||||||
|
:: %4 — режим компиляции (debug/release)
|
||||||
|
|
||||||
|
:: Сохраняем как переменные
|
||||||
|
set includes_USER=%~1
|
||||||
|
set code_USER=%~2
|
||||||
|
set defines_USER=%~3
|
||||||
|
set compil_mode=%~4
|
||||||
|
|
||||||
|
:: Заменяем __EQ__ на =
|
||||||
|
set defines_USER=%defines_USER:__EQ__==%
|
||||||
|
|
||||||
|
|
||||||
|
set defines_WRAPPER=-D"STM32F103xB" -D"USE_HAL_DRIVER"^
|
||||||
-D"MATLAB"^
|
-D"MATLAB"^
|
||||||
-D"__sizeof_ptr=8"
|
-D"__sizeof_ptr=8"
|
||||||
:: -------------------------USERS PATHS AND CODE---------------------------
|
|
||||||
set includes_USER= -I"..\mcu_project\upp\Core\Inc" -I"..\mcu_project\upp\Core\upp"
|
|
||||||
|
|
||||||
set code_USER=.\App_Wrapper\main.c^
|
:: -------------------------USERS PATHS AND CODE---------------------------
|
||||||
.\App_Wrapper\app_io.c^
|
|
||||||
..\mcu_project\upp\Core\Src\gpio.c^
|
|
||||||
..\mcu_project\upp\Core\Src\adc.c^
|
|
||||||
..\mcu_project\upp\Core\Src\tim.c^
|
|
||||||
..\mcu_project\upp\Core\Src\stm32f1xx_hal_msp.c^
|
|
||||||
..\mcu_project\upp\Core\Src\stm32f1xx_it.c^
|
|
||||||
..\mcu_project\upp\Core\Src\system_stm32f1xx.c^
|
|
||||||
..\mcu_project\upp\Core\upp\upp.c^
|
|
||||||
..\mcu_project\upp\Core\upp\zero_cross.c^
|
|
||||||
..\mcu_project\upp\Core\upp\adc_filter.c^
|
|
||||||
..\mcu_project\upp\Core\upp\tiristor.c
|
|
||||||
::-------------------------------------------------------------------------
|
::-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
@ -70,15 +77,65 @@ set code_WRAPPER= .\MCU_Wrapper\MCU.c^
|
|||||||
:: --------ALL INCLUDES--------
|
:: --------ALL INCLUDES--------
|
||||||
set includes= %includes_USER% %includes_MCU% %includes_WRAPPER%
|
set includes= %includes_USER% %includes_MCU% %includes_WRAPPER%
|
||||||
set codes= %code_WRAPPER% %code_USER% %code_MCU% %code_MCU_Sim%
|
set codes= %code_WRAPPER% %code_USER% %code_MCU% %code_MCU_Sim%
|
||||||
|
set defines= %defines_USER% %defines_WRAPPER%
|
||||||
:: -------OUTPUT FOLDER--------
|
:: -------OUTPUT FOLDER--------
|
||||||
set output= -outdir "."
|
set output= -outdir "."
|
||||||
|
|
||||||
:: если нужен дебаг, до запускаем run mex с припиской debug
|
:: если нужен дебаг, до запускаем run mex с припиской debug
|
||||||
IF [%1]==[debug] (set debug= -g)
|
IF %compil_mode%==[debug] (set debug= -g)
|
||||||
::-------------------------------------------------------------------------
|
::-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
::------START COMPILING-------
|
::------START COMPILING-------
|
||||||
echo Compiling...
|
echo Compiling...
|
||||||
|
|
||||||
|
|
||||||
|
echo ===========================
|
||||||
|
echo INCLUDES:
|
||||||
|
echo USER:
|
||||||
|
for %%f in (%includes_USER%) do (
|
||||||
|
echo %%f
|
||||||
|
)
|
||||||
|
echo INTERNAL:
|
||||||
|
for %%f in (%includes_MCU%) do (
|
||||||
|
echo %%f
|
||||||
|
)
|
||||||
|
for %%f in (%includes_WRAPPER%) do (
|
||||||
|
echo %%f
|
||||||
|
)
|
||||||
|
|
||||||
|
echo ===========================
|
||||||
|
echo SOURCES:
|
||||||
|
echo USER:
|
||||||
|
for %%f in (%code_USER%) do (
|
||||||
|
echo %%f
|
||||||
|
)
|
||||||
|
echo INTERNAL:
|
||||||
|
for %%f in (%code_WRAPPER%) do (
|
||||||
|
echo %%f
|
||||||
|
)
|
||||||
|
for %%f in (%code_MCU_Sim%) do (
|
||||||
|
echo %%f
|
||||||
|
)
|
||||||
|
for %%f in (%code_MCU%) do (
|
||||||
|
echo %%f
|
||||||
|
)
|
||||||
|
|
||||||
|
echo ===========================
|
||||||
|
echo DEFINES:
|
||||||
|
echo USER:
|
||||||
|
for %%d in (%defines_USER%) do (
|
||||||
|
echo %%d
|
||||||
|
)
|
||||||
|
echo INTERNAL:
|
||||||
|
for %%f in (%defines_WRAPPER%) do (
|
||||||
|
echo %%f
|
||||||
|
)
|
||||||
|
echo ===========================
|
||||||
|
echo MODE: %compil_mode%
|
||||||
|
echo ===========================
|
||||||
|
|
||||||
|
|
||||||
|
echo mex %output% %defines% %includes% %codes% %debug%
|
||||||
mex %output% %defines% %includes% %codes% %debug%
|
mex %output% %defines% %includes% %codes% %debug%
|
||||||
echo %DATE% %TIME%
|
echo %DATE% %TIME%
|
||||||
Binary file not shown.
149
mexing.m
149
mexing.m
@ -1,19 +1,152 @@
|
|||||||
% Компилирует S-function
|
% Компилирует S-function
|
||||||
clear, clc,
|
clear, clc
|
||||||
|
|
||||||
set = mex.getCompilerConfigurations('C', 'Selected');
|
|
||||||
|
|
||||||
Ts = 0.00001;
|
Ts = 0.00001;
|
||||||
|
|
||||||
delete("*.mexw64")
|
% Флаг режима отладки
|
||||||
delete("*.mexw64.pdb")
|
definesArg = buildDefinesString();
|
||||||
delete(".\MCU_Wrapper\Outputs\*.*");
|
|
||||||
|
|
||||||
status=system('.\MCU_Wrapper\run_mex.bat debug');
|
maskNames = get_param(gcbh, 'MaskNames');
|
||||||
|
isDebug = find(strcmp(maskNames, 'enableDebug'));
|
||||||
|
if strcmpi(isDebug, 'on')
|
||||||
|
modeArg = "release";
|
||||||
|
else
|
||||||
|
modeArg = "debug";
|
||||||
|
end
|
||||||
|
|
||||||
|
[includesArg, codeArg] = make_mex_arguments('incTable', 'srcTable');
|
||||||
|
|
||||||
|
|
||||||
|
% Вызов батника с двумя параметрами: includes и code
|
||||||
|
cmd = sprintf('.\\MCU_Wrapper\\run_mex.bat "%s" "%s" "%s" %s', includesArg, codeArg, definesArg, modeArg);
|
||||||
|
|
||||||
|
status = system(cmd);
|
||||||
|
|
||||||
if status == 0
|
if status == 0
|
||||||
beep
|
beep
|
||||||
else
|
else
|
||||||
error('Error!');
|
error('Error during compilation');
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function [includesArg, codeArg] = make_mex_arguments(incTableName, srcTableame)
|
||||||
|
%MAKE_MEX_ARGUMENTS Формирует строки аргументов для вызова mex-компиляции через батник
|
||||||
|
%
|
||||||
|
% [includesArg, codeArg] = make_mex_arguments(includesCell, codeCell)
|
||||||
|
%
|
||||||
|
% Вход:
|
||||||
|
% includesCell — ячейковый массив путей к директориям include
|
||||||
|
% codeCell — ячейковый массив исходных файлов
|
||||||
|
%
|
||||||
|
% Выход:
|
||||||
|
% includesArg — строка для передачи в батник, например: "-I"inc1" -I"inc2""
|
||||||
|
% codeArg — строка с исходниками, например: ""src1.c" "src2.cpp""
|
||||||
|
|
||||||
|
|
||||||
|
% Здесь пример получения из маски текущего блока (замени по своему)
|
||||||
|
blockHandle = gcbh; % или замени на нужный блок
|
||||||
|
|
||||||
|
includesCell = parseCellString(get_param(blockHandle, incTableName));
|
||||||
|
codeCell = parseCellString(get_param(blockHandle, srcTableame));
|
||||||
|
|
||||||
|
% Оборачиваем пути в кавычки и добавляем -I
|
||||||
|
includesStr = strjoin(cellfun(@(f) ['-I"' f '"'], includesCell, 'UniformOutput', false), ' ');
|
||||||
|
|
||||||
|
% Оборачиваем имена файлов в кавычки
|
||||||
|
codeStr = strjoin(cellfun(@(f) ['"' f '"'], codeCell, 'UniformOutput', false), ' ');
|
||||||
|
|
||||||
|
% Удаляем символ переноса строки и пробел в конце, если вдруг попал
|
||||||
|
codeStr = strtrim(codeStr);
|
||||||
|
includesStr = strtrim(includesStr);
|
||||||
|
|
||||||
|
% Оборачиваем всю строку в кавычки, чтобы батник корректно понял
|
||||||
|
% includesArg = ['"' includesStr '"'];
|
||||||
|
% codeArg = ['"' codeStr '"'];
|
||||||
|
includesArg = includesStr;
|
||||||
|
codeArg = codeStr;
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function definesArg = buildDefinesString()
|
||||||
|
blockHandle = gcbh;
|
||||||
|
|
||||||
|
% Получаем MaskValues и MaskNames
|
||||||
|
maskValues = get_param(blockHandle, 'MaskValues');
|
||||||
|
paramNames = get_param(blockHandle, 'MaskNames');
|
||||||
|
|
||||||
|
% Индексы параметров
|
||||||
|
idxEnable = find(strcmp(paramNames, 'enableThreading'));
|
||||||
|
idxCycles = find(strcmp(paramNames, 'threadCycles'));
|
||||||
|
idxClk = find(strcmp(paramNames, 'mcuClk'));
|
||||||
|
|
||||||
|
if any([isempty(idxEnable), isempty(idxCycles), isempty(idxClk)])
|
||||||
|
error('Один или несколько параметров не найдены в маске');
|
||||||
|
end
|
||||||
|
|
||||||
|
% Значения
|
||||||
|
enableVal = maskValues{idxEnable};
|
||||||
|
cyclesVal = maskValues{idxCycles};
|
||||||
|
clkMHz = str2double(maskValues{idxClk});
|
||||||
|
clkHz = round(clkMHz * 1e6);
|
||||||
|
|
||||||
|
% Формируем defines в формате: -D"NAME=VALUE"
|
||||||
|
if strcmpi(enableVal, 'on')
|
||||||
|
def1 = ['-D"RUN_APP_MAIN_FUNC_THREAD"'];
|
||||||
|
else
|
||||||
|
def1 = [''];
|
||||||
|
end
|
||||||
|
def2 = ['-D"DEKSTOP_CYCLES_FOR_MCU_APP__EQ__' cyclesVal '"'];
|
||||||
|
def3 = ['-D"MCU_CORE_CLOCK__EQ__' num2str(clkHz) '"'];
|
||||||
|
|
||||||
|
definesArg = strjoin({def1, def2, def3}, ' ');
|
||||||
|
% definesArg = ['"' definesStr ''];
|
||||||
|
% definesArg = definesStr;
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function out = parseCellString(str)
|
||||||
|
str = strtrim(str);
|
||||||
|
if startsWith(str, '{') && endsWith(str, '}')
|
||||||
|
str = str(2:end-1);
|
||||||
|
end
|
||||||
|
|
||||||
|
parts = split(str, ';');
|
||||||
|
out = cell(numel(parts), 1);
|
||||||
|
for i = 1:numel(parts)
|
||||||
|
el = strtrim(parts{i});
|
||||||
|
if startsWith(el, '''') && endsWith(el, '''')
|
||||||
|
el = el(2:end-1);
|
||||||
|
end
|
||||||
|
out{i} = el;
|
||||||
|
end
|
||||||
|
|
||||||
|
if isempty(out) || (numel(out) == 1 && isempty(out{1}))
|
||||||
|
out = {};
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function str = cellArrayToString(cellArray)
|
||||||
|
quoted = cellfun(@(s) ['''' s ''''], cellArray, 'UniformOutput', false);
|
||||||
|
str = ['{' strjoin(quoted, ';') '}'];
|
||||||
|
end
|
||||||
|
|
||||||
|
% % Компилирует S-function
|
||||||
|
% clear, clc,
|
||||||
|
%
|
||||||
|
% set = mex.getCompilerConfigurations('C', 'Selected');
|
||||||
|
%
|
||||||
|
% Ts = 0.00001;
|
||||||
|
%
|
||||||
|
% delete("*.mexw64")
|
||||||
|
% delete("*.mexw64.pdb")
|
||||||
|
% delete(".\MCU_Wrapper\Outputs\*.*");
|
||||||
|
%
|
||||||
|
% status=system('.\MCU_Wrapper\run_mex.bat debug');
|
||||||
|
%
|
||||||
|
% if status==0
|
||||||
|
% beep
|
||||||
|
% else
|
||||||
|
% error('Error!');
|
||||||
|
% end
|
||||||
|
%
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user