STM MATLAB Simulator
Loading...
Searching...
No Matches
mcu_wrapper.c
Go to the documentation of this file.
1/**
2**************************************************************************
3* @file mcu_wrapper.c
4* @brief Исходный код оболочки МК.
5**************************************************************************
6@details
7Данный файл содержит функции для симуляции МК в Simulink (S-Function).
8**************************************************************************/
9#include "mcu_wrapper_conf.h"
10
11/**
12 * @addtogroup WRAPPER_CONF
13 * @{
14 */
15
16SIM__MCUHandleTypeDef hmcu; ///< Хендл для управления потоком программы МК
17
18double SystemClockDouble = 0; ///< Счетчик в формате double для точной симуляции системных тиков С промежуточными значений
19uint64_t SystemClock; ///< Счетчик тактов для симуляции системных тиков (в целочисленном формате)
20double SystemClock_step = 0; ///< Шаг тиков для их симуляции, в формате double
21
22/** MCU_WRAPPER
23 * @}
24 */
25//-------------------------------------------------------------//
26//-----------------CONTROLLER SIMULATE FUNCTIONS---------------//
27/* THREAD FOR MCU APP */
28/**
29 * @brief Главная функция приложения МК.
30 * @details Функция с которой начинается выполнение кода МК. Выход из данной функции происходит только в конце симуляции @ref mdlTerminate
31 */
32extern int main(void); // extern while from main.c
33/**
34 * @brief Поток приложения МК.
35 * @details Поток, который запускает и выполняет код МК (@ref main).
36 */
37unsigned __stdcall MCU_App_Thread(void) {
38 main(); // run MCU code
39 return 0; // end thread
40 // note: this return will reached only at the end of simulation, when all whiles will be skipped due to @ref sim_while
41}
42/* SIMULATE MCU FOR ONE SIMULATION STEP */
43/**
44 * @brief Симуляция МК на один такт симуляции.
45 * @param S - указатель на структуру S-Function из "simstruc.h"
46 * @param time - текущее время симуляции.
47 * @details Запускает поток, который выполняет код МК и управляет ходом потока:
48 * Если прошел таймаут, поток прерывается, симулируется периферия
49 * и на следующем шаге поток возобнавляется.
50 *
51 * Вызывается из mdlUpdate()
52 */
53void MCU_Step_Simulation(SimStruct* S, time_T time)
54{
55 MCU_readInputs(S); // считывание портов
56
57 MCU_Periph_Simulation(); // simulate peripheral
58
59 ResumeThread(hmcu.hMCUThread);
60 for (int i = DEKSTOP_CYCLES_FOR_MCU_APP; i > 0; i--)
61 {
62 }
63 SuspendThread(hmcu.hMCUThread);
64
65 MCU_writeOutputs(S); // запись портов (по факту запись в буфер. запись в порты в mdlOutputs)
66}
67
68/* SIMULATE MCU PERIPHERAL */
69/**
70 * @brief Симуляция периферии МК
71 * @details Пользовательский код, который симулирует работу периферии МК.
72 */
74{
75 SystemClockDouble += SystemClock_step; // emulate core clock
77 uwTick = SystemClock / (SystemCoreClock / 1000);
78
80}
81
82/* READ INPUTS S-FUNCTION TO MCU REGS */
83/**
84 * @brief Считывание входов S-Function в порты ввода-вывода.
85 * @param S - указатель на структуру S-Function из "simstruc.h"
86 * @details Пользовательский код, который записывает порты ввода-вывода из входов S-Function.
87 */
88void MCU_readInputs(SimStruct* S)
89{
90 /* Get S-Function inputs */
91 real_T* IN = ssGetInputPortRealSignal(S, 0);
92
93 SFUNC_to_GPIO(IN);
94}
95
96/* WRITE OUTPUTS BUFFER S-FUNCTION FROM MCU REGS*/
97/**
98 * @brief Запись портов ввода-вывода в буфер выхода S-Function
99 * @param S - указатель на структуру S-Function из "simstruc.h"
100 * @details Пользовательский код, который записывает буфер выходов S-Function из портов ввода-вывода.
101 */
102void MCU_writeOutputs(SimStruct* S)
103{
104 /* Get S-Function descrete array */
105 real_T* Out_Buff = ssGetDiscStates(S);
106
107 GPIO_to_SFUNC(Out_Buff);
108}
109//-----------------CONTROLLER SIMULATE FUNCTIONS---------------//
110//-------------------------------------------------------------//
111
112
113
114//-------------------------------------------------------------//
115//----------------------SIMULINK FUNCTIONS---------------------//
116/* WRITE OUTPUTS OF S-BLOCK */
117/**
118 * @brief Формирование выходов S-Function.
119 * @param S - указатель на структуру S-Function из "simstruc.h"
120 * @details Пользовательский код, который записывает выходы S-Function из буфера.
121 */
122void SIM_writeOutputs(SimStruct* S)
123{
124 real_T* GPIO;
125 real_T* Out_Buff = ssGetDiscStates(S);
126
127 //-------------WRITTING GPIOS---------------
128 for (int j = 0; j < PORT_NUMB; j++)
129 {
130 GPIO = ssGetOutputPortRealSignal(S, j);
131 for (int i = 0; i < PORT_WIDTH; i++)
132 {
133 GPIO[i] = Out_Buff[j * PORT_WIDTH + i];
134 Out_Buff[j * PORT_WIDTH + i] = 0;
135 }
136 }
137 //------------------------------------------
138}
139/* MCU WRAPPER DEINITIALIZATION */
140/**
141 * @brief Инициализация симуляции МК.
142 * @details Пользовательский код, который создает поток для приложения МК
143 и настраивает симулятор МК для симуляции.
144 */
146{
147 // инициализация потока, который будет выполнять код МК
148 hmcu.hMCUThread = (HANDLE)CreateThread(NULL, 0, MCU_App_Thread, 0, CREATE_SUSPENDED, &hmcu.idMCUThread);
149
150
151 /* user initialization */
153
154 /* wrapper initialization */
155 SystemClock_step = SystemCoreClock * hmcu.SIM_Sample_Time; // set system clock step
156}
157/* MCU WRAPPER DEINITIALIZATION */
158/**
159 * @brief Деинициализация симуляции МК.
160 * @details Пользовательский код, который будет очищать все структуры после окончания симуляции.
161 */
163{
164 // simulate structures of peripheral deinitialization
166 // mcu peripheral memory deinitialization
168}
169//-------------------------------------------------------------//
void SFUNC_to_GPIO(real_T *in)
Считывание входов S-Function в МК.
void GPIO_to_SFUNC(real_T *out_buff)
Запись буфера выходов S-Function из GPIO.
void Initialize_Periph_Sim(void)
Инициализация периферии симулятора МК.
void MCU_readInputs(SimStruct *S)
Считывание входов S-Function в порты ввода-вывода.
Definition mcu_wrapper.c:88
void SIM_Initialize_Simulation(void)
Инициализация симуляции МК.
void SIM_deInitialize_Simulation(void)
Деинициализация симуляции МК.
void * HANDLE
MCU handle typedef.
void MCU_Periph_Simulation(void)
Симуляция периферии МК
Definition mcu_wrapper.c:73
void MCU_Step_Simulation(SimStruct *S, time_T time)
Симуляция МК на один такт симуляции.
Definition mcu_wrapper.c:53
void MCU_writeOutputs(SimStruct *S)
Запись портов ввода-вывода в буфер выхода S-Function.
void Simulate_TIMs(void)
Симуляция выбранных таймеров.
uint64_t SystemClock
Счетчик тактов для симуляции системных тиков (в целочисленном формате)
Definition mcu_wrapper.c:19
SIM__MCUHandleTypeDef hmcu
Хендл для управления потоком программы МК
Definition mcu_wrapper.c:16
#define PORT_WIDTH
width of one port
#define CREATE_SUSPENDED
define from WinBase.h. We dont wanna include "Windows.h" or smth like this, because of HAL there are ...
#define PORT_NUMB
amount of ports
double SystemClock_step
Шаг тиков для их симуляции, в формате double.
Definition mcu_wrapper.c:20
double SystemClockDouble
Счетчик в формате double для точной симуляции системных тиков С промежуточными значений
Definition mcu_wrapper.c:18
#define DEKSTOP_CYCLES_FOR_MCU_APP
number of for() cycles after which MCU thread would be suspended
unsigned __stdcall MCU_App_Thread(void)
Поток приложения МК.
Definition mcu_wrapper.c:37
void SIM_writeOutputs(SimStruct *S)
Формирование выходов S-Function.
int main(void)
Главная функция приложения МК.
Заголовочный файл для оболочки МК.
void deInitialize_MCU(void)
Деинициализация симулятора МК.
void deInitialize_Periph_Sim(void)
Деинициализация периферии симулятора МК.
MCU handle Structure definition.
uint32_t idMCUThread
id потока МК (unused)
double SIM_Sample_Time
sample time of simulation
HANDLE hMCUThread
Хендл для потока МК