переношу проект пока не работает
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
Данный файл содержит функции для симуляции МК в Simulink (S-Function).
|
||||
**************************************************************************/
|
||||
#include "mcu_wrapper_conf.h"
|
||||
#include "app_wrapper.h"
|
||||
|
||||
/**
|
||||
* @addtogroup WRAPPER_CONF
|
||||
@@ -15,6 +16,41 @@
|
||||
|
||||
SIM__MCUHandleTypeDef hmcu; ///< Хендл для управления потоком программы МК
|
||||
|
||||
// INPUT/OUTPUTS AUTO-PARAMS START
|
||||
/**
|
||||
* @brief Таблица длин массивов IN
|
||||
*/
|
||||
const int inLengths[IN_PORT_NUMB] = {
|
||||
IN_PORT_1_WIDTH,
|
||||
IN_PORT_2_WIDTH
|
||||
};
|
||||
/**
|
||||
* @brief Таблица смещений в выходном массиве IN
|
||||
*/
|
||||
const int inOffsets[IN_PORT_NUMB] = {
|
||||
OFFSET_IN_ARRAY_1,
|
||||
OFFSET_IN_ARRAY_2
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Таблица длин массивов OUT
|
||||
*/
|
||||
const int outLengths[OUT_PORT_NUMB] = {
|
||||
OUT_PORT_1_WIDTH,
|
||||
OUT_PORT_2_WIDTH,
|
||||
OUT_PORT_3_WIDTH
|
||||
};
|
||||
/**
|
||||
* @brief Таблица смещений в выходном массиве OUT
|
||||
*/
|
||||
const int outOffsets[OUT_PORT_NUMB] = {
|
||||
OFFSET_OUT_ARRAY_1,
|
||||
OFFSET_OUT_ARRAY_2,
|
||||
OFFSET_OUT_ARRAY_3
|
||||
};
|
||||
|
||||
// INPUT/OUTPUTS AUTO-PARAMS END
|
||||
|
||||
/** MCU_WRAPPER
|
||||
* @}
|
||||
*/
|
||||
@@ -50,13 +86,13 @@ unsigned __stdcall MCU_App_Thread(void) {
|
||||
*/
|
||||
void MCU_Step_Simulation(SimStruct* S, time_T time)
|
||||
{
|
||||
hmcu.SystemClockDouble += hmcu.SystemClock_step; // emulate core clock
|
||||
hmcu.SystemClockDouble += hmcu.sSystemClock_step; // emulate core clock
|
||||
hmcu.SystemClock = hmcu.SystemClockDouble;
|
||||
hmcu.SimTime = time;
|
||||
|
||||
MCU_readInputs(S); // считывание портов
|
||||
|
||||
MCU_Periph_Simulation(); // simulate peripheral
|
||||
MCU_Periph_Simulation(S); // simulate peripheral
|
||||
|
||||
#ifdef RUN_APP_MAIN_FUNC_THREAD
|
||||
ResumeThread(hmcu.hMCUThread);
|
||||
@@ -76,25 +112,26 @@ void MCU_Step_Simulation(SimStruct* S, time_T time)
|
||||
* @brief Симуляция периферии МК
|
||||
* @details Пользовательский код, который симулирует работу периферии МК.
|
||||
*/
|
||||
void MCU_Periph_Simulation(void)
|
||||
void MCU_Periph_Simulation(SimStruct* S)
|
||||
{
|
||||
uwTick = hmcu.SystemClock / (MCU_CORE_CLOCK / 1000);
|
||||
|
||||
Simulate_TIMs();
|
||||
// PERIPH SIM START
|
||||
Simulate_TIMs();
|
||||
Simulate_GPIO_BSRR();
|
||||
// PERIPH SIM END
|
||||
}
|
||||
|
||||
/* READ INPUTS S-FUNCTION TO MCU REGS */
|
||||
/**
|
||||
* @brief Считывание входов S-Function в порты ввода-вывода.
|
||||
* @param S - указатель на структуру S-Function из "simstruc.h"
|
||||
* @details Пользовательский код, который записывает порты ввода-вывода из входов S-Function.
|
||||
* @details Пользовательский код, который записывает входы МК из входов S-Function.
|
||||
*/
|
||||
void MCU_readInputs(SimStruct* S)
|
||||
{
|
||||
/* Get S-Function inputs */
|
||||
real_T* IN = ssGetInputPortRealSignal(S, 0);
|
||||
|
||||
app_readInputs(IN);
|
||||
SIM_readInputs(S);
|
||||
/* Get S-Function descrete array (IO buffer) */
|
||||
real_T* In_Buff = ssGetDiscStates(S);
|
||||
app_readInputs(In_Buff);
|
||||
}
|
||||
|
||||
/* WRITE OUTPUTS BUFFER S-FUNCTION FROM MCU REGS*/
|
||||
@@ -105,10 +142,9 @@ void MCU_readInputs(SimStruct* S)
|
||||
*/
|
||||
void MCU_writeOutputs(SimStruct* S)
|
||||
{
|
||||
/* Get S-Function descrete array */
|
||||
/* Get S-Function descrete array (IO buffer) */
|
||||
real_T* Out_Buff = ssGetDiscStates(S);
|
||||
|
||||
Simulate_GPIO_BSRR();
|
||||
app_writeOutputBuffer(Out_Buff);
|
||||
}
|
||||
//-----------------CONTROLLER SIMULATE FUNCTIONS---------------//
|
||||
@@ -118,65 +154,129 @@ void MCU_writeOutputs(SimStruct* S)
|
||||
|
||||
//-------------------------------------------------------------//
|
||||
//----------------------SIMULINK FUNCTIONS---------------------//
|
||||
/* WRITE OUTPUTS OF S-BLOCK */
|
||||
/**
|
||||
* @brief Формирование выходов S-Function.
|
||||
* @param S - указатель на структуру S-Function из "simstruc.h"
|
||||
* @details Пользовательский код, который записывает выходы S-Function из буфера.
|
||||
*/
|
||||
void SIM_writeOutputs(SimStruct* S)
|
||||
{
|
||||
real_T* GPIO;
|
||||
real_T* Out_Buff = ssGetDiscStates(S);
|
||||
|
||||
//-------------WRITTING GPIOS---------------
|
||||
for (int j = 0; j < PORT_NUMB; j++)
|
||||
{
|
||||
GPIO = ssGetOutputPortRealSignal(S, j);
|
||||
for (int i = 0; i < PORT_WIDTH; i++)
|
||||
{
|
||||
GPIO[i] = Out_Buff[j * PORT_WIDTH + i];
|
||||
Out_Buff[j * PORT_WIDTH + i] = 0;
|
||||
}
|
||||
}
|
||||
//------------------------------------------
|
||||
}
|
||||
/* MCU WRAPPER DEINITIALIZATION */
|
||||
/**
|
||||
* @brief Инициализация симуляции МК.
|
||||
* @details Пользовательский код, который создает поток для приложения МК
|
||||
* @details Пользовательский код, который создает поток для приложения МК
|
||||
и настраивает симулятор МК для симуляции.
|
||||
*/
|
||||
void SIM_Initialize_Simulation(void)
|
||||
void SIM_Initialize_Simulation(SimStruct* S)
|
||||
{
|
||||
#ifdef RUN_APP_MAIN_FUNC_THREAD
|
||||
// инициализация потока, который будет выполнять код МК
|
||||
hmcu.hMCUThread = (HANDLE)CreateThread(NULL, 0, MCU_App_Thread, 0, CREATE_SUSPENDED, &hmcu.idMCUThread);
|
||||
#else
|
||||
extern int app_init(void);
|
||||
app_init();
|
||||
#endif //RUN_APP_MAIN_FUNC_THREAD
|
||||
|
||||
/* user initialization */
|
||||
Initialize_Periph_Sim();
|
||||
|
||||
/* wrapper initialization */
|
||||
hmcu.SystemClock_step = MCU_CORE_CLOCK * hmcu.SIM_Sample_Time; // set system clock step
|
||||
app_init();
|
||||
// PERIPH INIT START
|
||||
Initialize_Periph_Sim();
|
||||
// PERIPH INIT END
|
||||
|
||||
/* clock step initialization */
|
||||
hmcu.sSystemClock_step = MCU_CORE_CLOCK * hmcu.sSimSampleTime; // set system clock step
|
||||
hmcu.fInitDone = 1;
|
||||
}
|
||||
/* MCU WRAPPER DEINITIALIZATION */
|
||||
/**
|
||||
* @brief Деинициализация симуляции МК.
|
||||
* @details Пользовательский код, который будет очищать все структуры после окончания симуляции.
|
||||
*/
|
||||
void SIM_deInitialize_Simulation(void)
|
||||
void SIM_deInitialize_Simulation(SimStruct* S)
|
||||
{
|
||||
//#ifdef DEINITIALIZE_AFTER_SIM
|
||||
#include "upp.h"
|
||||
memset(&Upp, 0, sizeof(Upp));
|
||||
// simulate structures of peripheral deinitialization
|
||||
deInitialize_Periph_Sim();
|
||||
// mcu peripheral memory deinitialization
|
||||
deInitialize_MCU();
|
||||
//#endif
|
||||
#ifdef DEINITIALIZE_AFTER_SIM
|
||||
// deinitialize app
|
||||
app_deinit();
|
||||
// PERIPH DEINIT START
|
||||
deInitialize_Periph_Sim();
|
||||
// PERIPH DEINIT END
|
||||
#endif// DEINITIALIZE_AFTER_SIM
|
||||
}
|
||||
/* WORK WITH IN/OUT BUFFER OF S-BLOCK */
|
||||
|
||||
/**
|
||||
* @brief Функция для записи переменной в буфер выходов в определенный массив
|
||||
* @param xD - указатель на буфер состояний
|
||||
* @param value - значение для записи
|
||||
* @param array_index - индекс выходного массива
|
||||
* @param value_index - индекс внутри массива
|
||||
*/
|
||||
void __WriteOutputArray(real_T* xD, float value, int array_index, int value_index)
|
||||
{
|
||||
if (array_index >= OUT_PORT_NUMB)
|
||||
return;
|
||||
|
||||
if (value_index >= outLengths[array_index])
|
||||
return;
|
||||
|
||||
int global_index = XD_OUTPUT_START + outOffsets[array_index] + value_index;
|
||||
xD[global_index] = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Функция для чтения значения из буфера входов из определенного массива
|
||||
* @param xD - указатель на буфер состояний
|
||||
* @param array_index - индекс входного массива
|
||||
* @param value_index - индекс внутри массива
|
||||
* @return - считанное значение или 0.0 при выходе за границы
|
||||
*/
|
||||
float __ReadInputArray(const real_T* xD, int array_index, int value_index)
|
||||
{
|
||||
if (array_index >= IN_PORT_NUMB)
|
||||
return 0.0f;
|
||||
|
||||
if (value_index >= inLengths[array_index])
|
||||
return 0.0f;
|
||||
|
||||
int global_index = XD_INPUT_START + inOffsets[array_index] + value_index;
|
||||
return xD[global_index];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Формирование выходов S-Function.
|
||||
* @param S - указатель на структуру S-Function из "simstruc.h"
|
||||
* @details Пользовательский код, который записывает выходы S-Function из буфера дискретных состояний.
|
||||
*/
|
||||
void SIM_writeOutputs(SimStruct* S)
|
||||
{
|
||||
real_T* Output = ssGetOutputPortRealSignal(S,0);
|
||||
real_T* Out_Buff = ssGetDiscStates(S);
|
||||
int global_index;
|
||||
|
||||
//-------------WRITTING OUTPUT--------------
|
||||
for (int arr_ind = 0; arr_ind < OUT_PORT_NUMB; arr_ind++)
|
||||
{
|
||||
Output = ssGetOutputPortRealSignal(S, arr_ind);
|
||||
for (int val_ind = 0; val_ind < outLengths[arr_ind]; val_ind++)
|
||||
{
|
||||
global_index = XD_OUTPUT_START + outOffsets[arr_ind] + val_ind;
|
||||
Output[val_ind] = Out_Buff[global_index];
|
||||
Out_Buff[global_index] = 0;
|
||||
}
|
||||
}
|
||||
//------------------------------------------
|
||||
}
|
||||
/**
|
||||
* @brief Формирование входов S-Function.
|
||||
* @param S - указатель на структуру S-Function из "simstruc.h"
|
||||
* @details Пользовательский код, который считывает входы S-Function в буфер дискретных состояний.
|
||||
*/
|
||||
void SIM_readInputs(SimStruct* S)
|
||||
{
|
||||
real_T* Input = ssGetInputPortRealSignal(S, 0);
|
||||
real_T* In_Buff = ssGetDiscStates(S);
|
||||
int global_index;
|
||||
|
||||
//-------------READING INPUTS---------------
|
||||
for (int arr_ind = 0; arr_ind < IN_PORT_NUMB; arr_ind++)
|
||||
{
|
||||
Input = ssGetInputPortRealSignal(S, arr_ind);
|
||||
for (int val_ind = 0; val_ind < inLengths[arr_ind]; val_ind++)
|
||||
{
|
||||
global_index = XD_INPUT_START + inOffsets[arr_ind] + val_ind;
|
||||
In_Buff[global_index] = Input[val_ind];
|
||||
}
|
||||
}
|
||||
//------------------------------------------
|
||||
}
|
||||
//-------------------------------------------------------------//
|
||||
|
||||
Reference in New Issue
Block a user