概述
Simulink应用层模型与手写C语言底层代码打包集成的方式有两种。
方式一是在代码中集成:应用层模型生成代码后,在底层代码中增加接口层,与应用层代码整合编译,autosar就是这种方式。
方式二是在模型中集成:编写c mex s-function底层驱动模块,将代码封装成模型,在simulink库中直接使用。
本文介绍第二种方式。
编写c mex s-function底层驱动模块
1、代开matlab,切换指定工作目录。
2、将当前工作目录添加入工作路径。
3、创建Library模型
命名Library并保存
4、编写slblocks.m,设置自定义库在Simulink Library列表中显示自定义库名称。
function blkStruct = slblocks
% This function specifies that the library should appear
% in the Library Browser
% and be cached in the browser repository
Browser.Library = 'MPC5744_Block_ZYY';
% 'Lotus_SupportPacket' is the name of the library
Browser.Name = 'MPC5744_Block_ZYY';
% 'Lotus_CMEX_SFunction' is the library name that appears
% in the Library Browser
blkStruct.Browser = Browser;
5、编写sl_customization.m文件,用于为自定义库设置排序优先级,-2表示置顶显示。
function sl_customization(cm)
cm.LibraryBrowserCustomizer.applyOrder( {'MPC5744_Block_ZYY', -2} );
end
创建完之后分别运行两个m脚本。
6、打开一个空模型,查看自定义库是否加载到Simulink Library,我已经创建好,所以已经有一个模块在这里。
第一次创建的话,运行完脚本后按如下操作
刷新simulink库列表,快捷键F5。
做完之后如果没有显示,可重起matlab。
7、准备储备文件
创建一个c文件一个h文件
#include "CanSend.h"
void SL_CAN_Write(uint8 index, CAN_MESSAGE*msgAddr)
{
}
#ifndef _MY_TYPES_H_
#define _MY_TYPES_H_
typedef unsigned char uint8;
typedef unsigned int uint32;
typedef struct
{
uint8 Extended;
uint8 Length;
uint8 Remote;
uint8 Error;
uint32 ID;
uint8 Data[8];
} CAN_MESSAGE;
extern void SL_CAN_Write(uint8 index, CAN_MESSAGE*msgAddr);
#endif
8、创建脚本CMEXSFunction.m
clc;
Simulink.importExternalCTypes('CanSend.h');
def1=legacy_code('initialize');
def1.SFunctionName = 'SL_CAN_Write';
def1.OutputFcnSpec = 'void SL_CAN_Write(uint8 u1, CAN_MESSAGE u2[1])';
def1.HeaderFiles = {'CanSend.h'};
def1.SourceFiles = {'CanSend.c'};
legacy_code('sfcn_cmex_generate',def1);
legacy_code('compile',def1);
legacy_code('generate_for_sim', def1);
legacy_code('slblock_generate', def1);
运行脚本。
9、对脚本进行简单封装
10、将封装好的模块加入3创建的模型
保存,关闭模型。
11、打开新的空白模型,点击库浏览器,刷新库浏览器。
新建的块出现在了库浏览器中。
12、更改求解器类型、选择tlc文件。
将变步长改成定步长。
13、搭建模块,生成代码,移植代码。