LegacyCodeTool之函数声明
根据前面讲过的使用命令 specs = legacy_code('initialize') 生成的结构体变量中specs要定义一系列函数:初始条件函数、输出函数、启动函数、停止函数( InitializeConditionsFcnSpec: '',OutputFcnSpec: '',StartFcnSpec: '',TerminateFcnSpec: '')。
在定义这些函数时要注意:
1、输入参数在函数中不能被改变
2、函数体的返回值不能为指针(可以为指针指向的值)
3、初始条件函数、启动函数、停止函数不能通过输入输出参数来定义。
这些函数的定义方式都是通过带关键字的字符串来定义的,关键字如下:
y1,y2,……,yn用来表示输出变量
u1,u2,……,un用来表示输入变量
p1,p2,……,pn用来表示参数变量
work1,work2,……,workn用来表示工作向量参数
(个人理解:C语言中一般没有p,work的概念,之所以会有这两种形式的函数变量,是因为matlab本身是处理矩阵运算的,一般来说函数都可以理解或翻译为矩阵运算的形式,都可以转换为状态方程,所以有了参数变量和工作向量的概念。个人理解欢迎指正。)
下面列出,C语言中常见的函数形式,对应LegacyCodeTool应该使用的表达方法
C语言 对应字符串
void fuction(void) 'void fuction(void)'
void fuction(TYPE x1,TYPE x2,...) 'void fuction(TYPE u1,TYPE u2,...)'
TYPE fuction(void) 'TYPE y1 = fuction(void)'
TYPE fuction(TYPE x1,TYPE x2,...) 'TYPE y1 = fuction(TYPE u1,TYPE u2,...)'
TYPE fuction(TYPE *x1,TYPE x2[],...) 'TYPE y1 = fuction(TYPE u1[1],TYPE u2[],...)'
void fuction(TYPE *y1,TYPE y2[],...) 'void fuction(TYPE y1[n],TYPE y2[n],...)' %n为实际应返回的值的大小,个数
TYPE fuction(TYPE *y2,TYPE y3[],...) 'TYPE y1 = fuction(TYPE y2[n],TYPE y3[n],...)'
......
其他可以依次类推,其中TYPE为数据类型,一般常见的数据类型,LegacyCodeTool的y,u,p,work都支持,空指针只有work可以支持。
所以使用,LegacyCodeTool的基本过程就是下面三步:
1、初始化一个参数化的结构体变量
2、对结构体变量中的参数及参数表达式进行赋值
3、使用相应的命令集生成sfun或者编译等等
LegacyCodeTool之例2
下面根据之前讲的LegacyCodeTool再举一个例子:
底层在进行通信时常会遇到一些数据解析或分解情况,可能的函数如下:
test.c
#include "test.h" void testcan(unsigned char * phval, unsigned char *sg1,unsigned int *sg2,unsigned int *sg3,unsigned int *sg4,unsigned char *sg5) |
test.h
#ifndef ____testcan_H extern void testcan(unsigned char *phval, unsigned char *sg1,unsigned int *sg2,unsigned int *sg3,unsigned int *sg4,unsigned char *sg5); #endif |
可以编辑如下m脚本或依次在Matlab中输入下列命令:
%% Define Legacy Code Tool options uint16 y3[1],uint16 y4[1],uint8 y5[1])'; %Function to be called during simulation %% Create S-function, TLC file, etc. |
然后,该模块可以正常用于simulink仿真,可以联合模型和底层代码一起进行仿真验证。
另外输入输出可以可以使用结构体的形式,但是需要事先在h头文件中定义好相应的结构体声明。
请登录后评论~