Начата работа с документацией

This commit is contained in:
2024-10-11 14:09:52 +03:00
parent ac187eb2d3
commit 6a08b0462d
759 changed files with 370188 additions and 223 deletions

View File

@@ -2,7 +2,6 @@
#define S_FUNCTION_LEVEL 2
#include "mcu_wrapper_conf.h"
double SIM_Sample_Time;
#define MDL_UPDATE
/* Function: mdlUpdate ====================================================
@@ -139,10 +138,10 @@ static void mdlStart(SimStruct *S)
static void mdlInitializeSampleTimes(SimStruct *S)
{
// Шаг дискретизации
SIM_Sample_Time = mxGetPr(ssGetSFcnParam(S,NPARAMS-1))[0];
hmcu.SIM_Sample_Time = mxGetPr(ssGetSFcnParam(S,NPARAMS-1))[0];
// Register one pair for each sample time
ssSetSampleTime(S, 0, SIM_Sample_Time);
ssSetSampleTime(S, 0, hmcu.SIM_Sample_Time);
ssSetOffsetTime(S, 0, 0.0);
}

View File

@@ -1,23 +1,27 @@
/**************************************************************************
Äàííûé ôàéë ñîäåðæèò ôóíêöèè äëÿ ñèìóëÿöèè ÌÊ â Simulink (S-Function).
Данный файл содержит функции для симуляции МК в Simulink (S-Function).
**************************************************************************/
#include "mcu_wrapper_conf.h"
SIM__MCUHandleTypeDef hmcu; // äëÿ óïðàâëåíèÿ êîíòåêñòîì ïðîãðàììû ÌÊ
SIM__MCUHandleTypeDef hmcu; // для управления контекстом программы МК
double SystemClockDouble = 0; // äëÿ ñèìóëÿöèè ñèñòåìíûõ òèêîâ, ïðîêà ïðîñòî ïî ïðèêîëó
double SystemClock_step = 0; // äëÿ ñèìóëÿöèè ñèñòåìíûõ òèêîâ, ïðîêà ïðîñòî ïî ïðèêîëó
uint64_t SystemClock; // äëÿ ñèìóëÿöèè ñèñòåìíûõ òèêîâ, ïðîêà ïðîñòî ïî ïðèêîëó
double SystemClockDouble = 0; // для симуляции системных тиков, прока просто по приколу
double SystemClock_step = 0; // для симуляции системных тиков, прока просто по приколу
uint64_t SystemClock; // для симуляции системных тиков, прока просто по приколу
//-------------------------------------------------------------//
//-----------------CONTROLLER SIMULATE FUNCTIONS---------------//
/** THREAD FOR MCU APP */
/**
* @brief Thread that run MCU code.
* @note Ïîòîê, êîòîðûé çàïóñêàåò è âûïîëíÿåò êîä ÌÊ.
* @brief Main function of MCU app.
* @details Функция с которой начинается выполнение кода МК. Выход из данной функции происходит только в конце симуляции @ref mdlTerminate
*/
extern int main(void); // extern while from main.c
/** THREAD FOR MCU APP */
/**
* @brief Thread that run MCU code.
* @details Поток, который запускает и выполняет код МК (@ref main).
*/
unsigned __stdcall MCU_App_Thread(void) {
main(); // run MCU code
return 0; // end thread
@@ -25,15 +29,15 @@ unsigned __stdcall MCU_App_Thread(void) {
}
/** SIMULATE MCU FOR ONE SIMULATION STEP */
/**
* @brief Read from simulink S-Block Inputs and write to MCU I/O ports.
* @param time - current time of simulation (in second).
* @note Âûçûâàåò ãëàâíóþ ôóíêöèþ main èç ïîëüçîâàòåëüñêîãî êîäà è óïðàâëÿåò å¸ õîäîì:
* Ïðåðûâàåò å¸, åñëè îíà ïîïàëà â áåñêîíå÷íûé while, ñèìóëèðóåò ïåðèôåðèþ
* è âîçâðàùàåò â òî÷êó îñòàíîâêè íà ñëåäóþùåì øàãå.
* @brief Read from simulink S-Block Inputs and write to MCU I/O ports.
* @param time - current time of simulation (in second).
* @details Запускает поток, который выполняет код МК и управляет ходом потока:
* Если прошел таймаут, поток прерывается, симулируется периферия
* и на следующем шаге поток возобнавляется.
*/
void MCU_Step_Simulation(SimStruct* S, time_T time)
{
MCU_readInputs(S); // ñ÷èòûâàíèå ïîðòîâ
MCU_readInputs(S); // считывание портов
MCU_Periph_Simulation(); // simulate peripheral
@@ -43,13 +47,13 @@ void MCU_Step_Simulation(SimStruct* S, time_T time)
}
SuspendThread(hmcu.hMCUThread);
MCU_writeOutputs(S); // çàïèñü ïîðòîâ (ïî ôàêòó çàïèñü â áóôåð. çàïèñü â ïîðòû â mdlOutputs)
MCU_writeOutputs(S); // запись портов (по факту запись в буфер. запись в порты в mdlOutputs)
}
/** SIMULATE MCU PERIPHERAL */
/**
* @brief Simulate peripheral of MCU
* @note Ïîëüçîâàòåëüñêèé êîä, êîòîðûé ñèìóëèðóåò ðàáîòó ïåðèôåðèè ÌÊ.
* @brief Simulate peripheral of MCU
* @details Пользовательский код, который симулирует работу периферии МК.
*/
void MCU_Periph_Simulation(void)
{
@@ -62,8 +66,9 @@ void MCU_Periph_Simulation(void)
/** READ INPUTS S-FUNCTION TO MCU REGS */
/**
* @brief Read from simulink S-Block Inputs and write to MCU I/O ports.
* @note Ïîëüçîâàòåëüñêèé êîä, êîòîðûé çàïèñûâàåò â ïîðòû ââîäà-âûâîäà èç disc.
* @brief Read from simulink S-Block Inputs and write to MCU I/O ports.
* @param in - inputs of S-Function.
* @details Пользовательский код, который записывает в порты ввода-вывода из disc.
*/
void MCU_readInputs(SimStruct* S)
{
@@ -75,8 +80,9 @@ void MCU_readInputs(SimStruct* S)
/** WRITE OUTPUTS BUFFER S-FUNCTION FROM MCU REGS*/
/**
* @brief Read from MCU I/O ports and write to simulink S-Block Outputs Buffer.
* @note Ïîëüçîâàòåëüñêèé êîä, êîòîðûé çàïèñûâàåò â disc ïîðòû ââîäà-âûâîäà.
* @brief Read from MCU I/O ports and write to simulink S-Block Outputs.
* @param disc - discrete array of S-Function. Outputs would be written from disc.
* @details Пользовательский код, который записывает в disc порты ввода-вывода.
*/
void MCU_writeOutputs(SimStruct* S)
{
@@ -94,9 +100,9 @@ void MCU_writeOutputs(SimStruct* S)
//----------------------SIMULINK FUNCTIONS---------------------//
/** WRITE OUTPUTS OF S-BLOCK */
/**
* @brief Write S-Function Output ports to inputs.
* @param disc - discrete array of S-Function. Outputs would be written from disc.
* @note Ïîëüçîâàòåëüñêèé êîä, êîòîðûé çàïèñûâàåò âûõîäû S-Function.
* @brief Write S-Function Output ports to inputs.
* @param disc - discrete array of S-Function. Outputs would be written from disc.
* @details Пользовательский код, который записывает выходы S-Function.
*/
void SIM_writeOutputs(SimStruct* S)
{
@@ -117,8 +123,8 @@ void SIM_writeOutputs(SimStruct* S)
}
/** MCU WRAPPER DEINITIALIZATION */
/**
* @brief Initialize structures and variables for simulating MCU.
* @note Ïîëüçîâàòåëüñêèé êîä, êîòîðûé áóäåò íàñòðàèâàòü âñå ñòðóêòóðû äëÿ ñèìóëÿöèè.
* @brief Initialize structures and variables for simulating MCU.
* @details Пользовательский код, который будет настраивать все структуры для симуляции.
*/
void SIM_Initialize_Simulation(void)
{
@@ -126,14 +132,14 @@ void SIM_Initialize_Simulation(void)
Initialize_Periph_Sim();
/* wrapper initialization */
SystemClock_step = SystemCoreClock * SIM_Sample_Time; // set system clock step
// èíèöèàëèçàöèÿ ïîòîêà, êîòîðûé áóäåò âûïîëíÿòü êîä ÌÊ
SystemClock_step = SystemCoreClock * hmcu.SIM_Sample_Time; // set system clock step
// инициализация потока, который будет выполнять код МК
hmcu.hMCUThread = (HANDLE)CreateThread(NULL, 0, MCU_App_Thread, 0, CREATE_SUSPENDED, &hmcu.idMCUThread);
}
/** MCU WRAPPER DEINITIALIZATION */
/**
* @brief Deinitialize structures and variables for simulating MCU.
* @note Ïîëüçîâàòåëüñêèé êîä, êîòîðûé áóäåò î÷èùàòü âñå ñòðóêòóðû ïîñëå îêîí÷àíèÿ ñèìóëÿöèè.
* @brief Deinitialize structures and variables for simulating MCU.
* @details Пользовательский код, который будет очищать все структуры после окончания симуляции.
*/
void SIM_deInitialize_Simulation(void)
{
@@ -145,10 +151,10 @@ void SIM_deInitialize_Simulation(void)
//-------------------------------------------------------------//
////-----------INIT WRAPPER-----------
//if (hmcu.MCU_Start) // åñëè íàäî ïîëó÷òü óêàçàòåëü íà "íà÷àëî" ñòåêà
//{ // ñáðîñ ôëàøà, ÷òîáû ñþäà áîëüøå íå ïîïàäàòü
//if (hmcu.MCU_Start) // если надо получть указатель на "начало" стека
//{ // сброс флаша, чтобы сюда больше не попадать
// hmcu.MCU_Start = 0;
// // èíèöèàëèçàöèÿ ïîòîêà, êîòîðûé áóäåò âûïîëíÿòü êîä ÌÊ
// // инициализация потока, который будет выполнять код МК
// hmcu.hMCUThread = (HANDLE)_beginthreadex(NULL, 0, MCU_App_Thread, 0, 0x00000004, &hmcu.idMCUThread); /* 0x00000004 - CREATE_SUSPENDED */
//}
////----------------------------------

View File

@@ -1,9 +1,9 @@
/**************************************************************************
Ãëàâíûé çàãîëîâî÷íûé ôàéë äëÿ ìàòëàáà. Âêëþ÷àåò äåéôàéíû äëÿ S-Function,
îáúÿâëÿåò áàçîâûå ôóíêöèè äëÿ ñèìóëÿöèè ÌÊ è ïîäêëþ÷àåò áàçîâûå áèáëèîòåêè:
äëÿ ñèìóëÿöèè "stm32fxxx_matlab_conf.h"
äëÿ S-Function "simstruc.h"
äëÿ ïîòîêîâ <process.h>
Главный заголовочный файл для матлаба. Включает дейфайны для S-Function,
объявляет базовые функции для симуляции МК и подключает базовые библиотеки:
для симуляции "stm32fxxx_matlab_conf.h"
для S-Function "simstruc.h"
для потоков <process.h>
**************************************************************************/
#ifndef _CONTROLLER_H_
@@ -15,69 +15,87 @@
#include <process.h> // For threads
// Parametrs of MCU simulator
#define CREATE_SUSPENDED 0x00000004 // define from WinBase.h
// We dont wanna include "Windows.h" or smth like this, because a lot of redefine errors appear.
/**
* @addtogroup MCU_WRAPPER
* @brief Stuff for running MCU app in MATLAB
*/
#define DEKSTOP_CYCLES_FOR_MCU_APP 0xFFFF // number of for() cycles after which MCU thread would be suspended
#define PORT_WIDTH 16 // width of one port
#define PORT_NUMB 3 // amount of ports
/**
* @addtogroup WRAPPER_CONF
* @ingroup MCU_WRAPPER
* @brief Configurations for wrapper to simulating MCU
* @details Здесь дефайнами задается параметры оболочки, которая управляет кодом МК
* @{
*/
// Parametrs of MCU simulator
#define CREATE_SUSPENDED 0x00000004 ///< define from WinBase.h. We dont wanna include "Windows.h" or smth like this, because of HAL there are a lot of redefine errors.
#define DEKSTOP_CYCLES_FOR_MCU_APP 0xFFFF ///< number of for() cycles after which MCU thread would be suspended
#define PORT_WIDTH 16 ///< width of one port
#define PORT_NUMB 3 ///< amount of ports
// Parameters of S_Function
#define NPARAMS 1 // number of input parametrs (only Ts)
#define IN_PORT_WIDTH (8) // width of input ports
#define IN_PORT_NUMB 1 // number of input ports
#define OUT_PORT_WIDTH PORT_WIDTH // width of output ports
#define OUT_PORT_NUMB PORT_NUMB // number of output ports
#define DISC_STATES_WIDTH PORT_WIDTH*PORT_NUMB // width of discrete states array
#define NPARAMS 1 ///< number of input parametrs (only Ts)
#define IN_PORT_WIDTH (8) ///< width of input ports
#define IN_PORT_NUMB 1 ///< number of input ports
#define OUT_PORT_WIDTH PORT_WIDTH ///< width of output ports
#define OUT_PORT_NUMB PORT_NUMB ///< number of output ports
#define DISC_STATES_WIDTH PORT_WIDTH*PORT_NUMB ///< width of discrete states array
// Externs
extern double SIM_Sample_Time; // sample time
/** MCU HANDLE STRUCTURE */
/**
* @brief MCU handle Structure definition.
* @vars MCU Thread - handle for MCUThread and id of MCUThread (unused).
* @vars Flags and counters - flags and counter that control MCU app.
*
/** WRAPPER_CONF
* @}
*/
typedef void* HANDLE;
typedef struct _DEL_MCUHandleTypeDef {
/**
* @ingroup MCU_WRAPPER
* @{
*/
typedef void* HANDLE; ///< MCU handle typedef
/**
* @brief MCU handle Structure definition.
* @note Prefixes: h - handle, s - settings, f - flag
*/
typedef struct {
// MCU Thread
HANDLE hMCUThread; /* Õåíäë äëÿ ïîòîêà ÌÊ */
uint32_t idMCUThread; /* id ïîòîêà ÌÊ (unused) */
HANDLE hMCUThread; ///< Хендл для потока МК
uint32_t idMCUThread; ///< id потока МК (unused)
// Flags
unsigned MCU_Stop : 1; /* ôëàã äëÿ âûõîäà èç ïîòîêà ïðîãðàììû ÌÊ */
unsigned fMCU_Stop : 1; ///< флаг для выхода из потока программы МК
double SIM_Sample_Time; ///< sample time of simulation
}SIM__MCUHandleTypeDef;
extern SIM__MCUHandleTypeDef hmcu; /* extern äëÿ âèäèìîñòè ïåðåìåííîé âî âñåõ ôàéëàõ */
extern SIM__MCUHandleTypeDef hmcu; ///< extern для видимости переменной во всех файлах
//-------------------------------------------------------------//
//------------------ SIMULINK WHILE DEFINES -----------------//
/** DEFINE TO WHILE WITH SIMULINK WHILE */
/* DEFINE TO WHILE WITH SIMULINK WHILE */
/**
* @brief Redefine C while statement with sim_while() macro.
* @param _expression_ - expression for while.
* @note @ref sim_while äëÿ ïîäðîáíîñòåé.
* @brief Redefine C while statement with sim_while() macro.
* @param _expression_ - expression for while.
* @details Это while который будет использоваться в симулинке @ref sim_while для подробностей.
*/
#define while(_expression_) sim_while(_expression_) /* while êîòîðûé áóäåò èñïîëüçîâàòüñÿ â ñèìóëèíêå */
#define while(_expression_) sim_while(_expression_)
/** SIMULINK WHILE */
/* SIMULINK WHILE */
/**
* @brief While statement for emulate MCU code in Simulink.
* @param _expression_ - expression for while.
* @note Äàííûé while íåîáõîäèì, ÷òîáû â êîíöå ñèìóëÿöèè, çàâåðøèòü ïîòîê ÌÊ:
* Ïðè âûñòàâëåíèè ôëàãà îêîí÷àíèÿ ñèìóëÿöèè, âñå while áóäóò ïðîïóñêàòüñÿ
* è ïîòîê ñìîæåò äîéòè äî êîíöà ñâîåé ôóíêöèè è çàâåðøèòü ñåáÿ.
* @brief While statement for emulate MCU code in Simulink.
* @param _expression_ - expression for while.
* @details Данный while необходим, чтобы в конце симуляции, завершить поток МК:
* При выставлении флага окончания симуляции, все while будут пропускаться
* и поток сможет дойти до конца функции main и завершить себя.
*/
#define sim_while(_expression_) while((_expression_)&&(hmcu.MCU_Stop == 0))
/** DEFAULT WHILE */
/* DEFAULT WHILE */
/**
* @brief Default/Native C while statement.
* @param _expression_ - expression for while.
* @note Äàííûé while - àíàëîã îáû÷íîãî while, áåç äîïîëíèòåëüíîãî ôóíêöèîíàëà.
* @brief Default/Native C while statement.
* @param _expression_ - expression for while.
* @details Данный while - аналог обычного while, без дополнительного функционала.
*/
#define native_while(_expression_) for(; (_expression_); )
/***************************************************************/
@@ -89,59 +107,30 @@ extern SIM__MCUHandleTypeDef hmcu; /* extern
//-------------------------------------------------------------//
//---------------- SIMULATE FUNCTIONS PROTOTYPES -------------//
/** SIMULATE MCU STEP */
/**
* @brief Read from simulink S-Block Inputs and write to MCU I/O ports.
* @param in - inputs of S-Function.
* @param disc - discrete array of S-Function. Outputs would be written from disc.
* @param time - current time of simulation (in second).
* @note Çàïóñêàåò ïîòîê, êîòîðûé âûïîëíÿåò êîä ÌÊ è óïðàâëÿåò õîäîì ïîòîêà:
* Åñëè ïðîøåë òàéìàóò, ïîòîê ïðåðûâàåòñÿ, ñèìóëèðóåòñÿ ïåðèôåðèÿ
* è íà ñëåäóþùåì øàãå ïîòîê âîçîáíàâëÿåòñÿ.
*/
void MCU_Step_Simulation(SimStruct *S, time_T time); /* step simulation */
/* step simulation */
void MCU_Step_Simulation(SimStruct *S, time_T time);
/** SIMULATE MCU PERIPHERAL */
/**
* @brief Simulate peripheral of MCU
* @note Ïîëüçîâàòåëüñêèé êîä, êîòîðûé ñèìóëèðóåò ðàáîòó ïåðèôåðèè ÌÊ.
*/
void MCU_Periph_Simulation(void); /* MCU peripheral simulation */
/* MCU peripheral simulation */
void MCU_Periph_Simulation(void);
/** MCU WRAPPER INITIALIZATION */
/**
* @brief Initialize structures and variables for simulating MCU.
* @note Ïîëüçîâàòåëüñêèé êîä, êîòîðûé áóäåò íàñòðàèâàòü âñå ñòðóêòóðû.
*/
void SIM_Initialize_Simulation(void); /* initialize MCU simulation */
/** MCU WRAPPER DEINITIALIZATION */
/**
* @brief Deinitialize structures and variables for simulating MCU.
* @note Ïîëüçîâàòåëüñêèé êîä, êîòîðûé áóäåò î÷èùàòü âñå ñòðóêòóðû.
*/
void SIM_deInitialize_Simulation(void); /* SIM_deInitialize_Simulation MCU simulation */
/** READ INPUTS S-FUNCTION */
/**
* @brief Read from simulink S-Block Inputs and write to MCU I/O ports.
* @param in - inputs of S-Function.
* @note Ïîëüçîâàòåëüñêèé êîä, êîòîðûé çàïèñûâàåò â ïîðòû ââîäà-âûâîäà èç disc.
*/
/* initialize MCU simulation */
void SIM_Initialize_Simulation(void);
/* deinitialize MCU simulation */
void SIM_deInitialize_Simulation(void);
/* read inputs S-function */
void MCU_readInputs(real_T* in);
/** WRITE OUTPUTS S-FUNCTION */
/**
* @brief Read from MCU I/O ports and write to simulink S-Block Outputs.
* @param disc - discrete array of S-Function. Outputs would be written from disc.
* @note Ïîëüçîâàòåëüñêèé êîä, êîòîðûé çàïèñûâàåò â disc ïîðòû ââîäà-âûâîäà.
*/
/* write outputs S-function (disc states) */
void MCU_writeOutputs(real_T* disc);
/** WRITE OUTPUTS OF S-BLOCK */
/**
* @brief Write S-Function Output ports to inputs.
* @param disc - discrete array of S-Function. Outputs would be written from disc.
* @note Ïîëüçîâàòåëüñêèé êîä, êîòîðûé çàïèñûâàåò âûõîäû S-Function.
*/
/* write outputs of block of S-Function*/
void SIM_writeOutput(SimStruct* S);
//---------------- SIMULATE FUNCTIONS PROTOTYPES -------------//
//-------------------------------------------------------------//
/** MCU_WRAPPER
* @}
*/
#endif // _CONTROLLER_H_

View File

@@ -8,8 +8,9 @@ set defines=-D"STM32F407xx" -D"USE_HAL_DRIVER"^
set includes_USER= -I".\Code\Core\Inc" -I".\Code\GENERAL"^
-I".\Code\Modbus" -I".\Code\PWM"
:: для добавления в переменую новых файлов. иначе будет перезапись
setlocal enabledelayedexpansion
:: исходный код
setlocal enabledelayedexpansion
set code_USER=
for %%f in (.\Code\Core\Src\*.c) do (