Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

       接下来我们来谈论一个这个教程里面最关键的一个问题:如何将Matlab/Simulink生成的代码迁移到其他平台上面运行呢。我们可以看到为什么Matlab公司会不断地嵌入式平台的底层配置直接生成代码,很大程度上底层配置代码生成的灵活性不够,我们看到ST官网出的支持包我们用起来的稳定也是特别差,几乎每次生成都会出现这样那样的问题。所以跨平台是特别好的选择。前面我们已经解决了代码的可读性及其优化的问题,下面就跟着我的脚步去实现如何跨平台迁移代码。

我们打开Simulink与核心板通讯的实验工程,根据之前的实验把数据字典搭好;

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

我们配置一下生成代码的设置:请按照下面的步骤设置,不要多也不要少;

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

设置好了以后我们来生成C代码;

这个文件我们不用管,待会添加C文件到工程当中就不要添加这个就可以了;

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

我们可以看到生成的代码时非常的规范的:

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

生成代码这一步已经全部弄好了,直接而来我们利用ST的软件生成我们所需要的底层;

我们这个工程主要是实现两个功能:1、闪烁灯;2、串口通讯;

 

我们打开STM32cubeMX软件,选择核心板对应的硬件

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

我们来一步步配置我们的底层

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

到此STM32的底层配配置就已经结束了

我们打开对应的MDK文件,我们编译一下生成的代码有没有错误

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

我们生成的FreeRTOS系统,我们直接在这两个任务里面做我们想要的程序就可以了

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

添加包好的头文件对应的文件夹

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

接下来我们来添加对应包含的头文件代码

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

 

直接在我们对应的任务里面添加我们要运行的代码

一定要运行这个函数:Communication_step();只要这个函数被主程序运行起来

我们定义的这这些变量就会被赋予数值数值:

typedef struct UART_In_tag {

  real32_T In_1;

  real32_T In_2;

  real32_T In_3;

  real32_T In_4;

  real32_T In_5;

} UART_In_type;

 

typedef struct UART_OUT_tag {

  real32_T Out_1;

  real32_T Out_2;

  real32_T Out_3;

  real32_T Out_4;

  real32_T Out_5;

  real32_T Out_6;

  real32_T Out_7;

} UART_OUT_type;

 

extern real_T Rate;                    /* '<Root>/LED_Trigger' */

 

下图为一个任务中,运行Communication_step();,并利用Rate数值的变化进行闪烁灯功能的实现,操作的底层对象函数为:

if(Rate==1)

  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);

else

      HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);

 

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

下图为我们调用下面的这些变量进行串口数据的发送

typedef struct UART_In_tag {

  real32_T In_1;

  real32_T In_2;

  real32_T In_3;

  real32_T In_4;

  real32_T In_5;

} UART_In_type;

 

typedef struct UART_OUT_tag {

  real32_T Out_1;

  real32_T Out_2;

  real32_T Out_3;

  real32_T Out_4;

  real32_T Out_5;

  real32_T Out_6;

  real32_T Out_7;

} UART_OUT_type;

只要主函数运行了Communication_step();,我们只需要关心怎么调用我们要电泳的变量就可以了

 

对于串口接受跟发送,操作的底层对象的函数为

HAL_UART_Receive_DMA(&huart1, (uint8_t *)UART1_Temp_Buffer,sizeof(UART1_Temp_Buffer));

 

HAL_UART_Transmit_DMA(&huart1, (uint8_t *)UART1_Tx_Buffer, sizeof(UART1_Tx_Buffer));

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

 

到这里我们回过头来看一下我们的Simulink模型

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

只要定义好我们需要引用的变量,输入是什么,输出是什么,最后在C代码平台上面只要主程序运行了Communication_step();函数,不用管中间经过了什么,只要功能是跟我们仿真阶段是一样的这就可以了,而实验出来的结果完全跟我们仿真的功能是一样的;

 

最后我们编译一下,有没有报错

Matlab/Simulink 自动代码生成 基于模型设计学习教程(17)---- 跨平台代码迁移

 

如需进一步获得Matlab/Simulink 自动代码生成 基于模型设计学习教程的源代码包,请加QQ群:710443158