将 C 函数参数映射到 Simulink 端口
您可以使用 C
Caller 模块中的 Port specification 表,并通过命令行创建 FunctionPortSpecification 对象,将源代码中的 C 函数参数映射到 Simulink 端口。在源代码中,头文件包含要连接到 Simulink 端口的 C 函数参数。
extern void mean_filter(const unsigned char* src,
unsigned char* dst,
unsigned int width, unsigned int height,
unsigned int filterSize);
Port specification 显示您的参数的详细内容,以及它们如何连接到您在 Simulink 中的 C Caller 模块。

Name - 指定输入和输出参数的名称。Name 是源代码中的 C 函数中定义的函数参数名称。此列仅供参考。
Scope - 指定 C 函数参数如何映射到 Simulink 作用域。您的参数根据函数定义具有默认作用域,并且您可以根据源代码中的函数定义来更改作用域。
Simulink Scope作用域到模块的映射“Input”模块输入端口
“Output”模块输出端口
“InputOutput”模块输入和输出端口
“Global”模块使用的全局变量
“Parameter”模块可调参数
“Constant”常量值
当具有常量限定符定义(如 const double
*u)时,该参数必须为 input 或 parameter 类型。如果没有常量限定符,则该参数默认为 output 类型,您可以将其更改为 “Input”、“InputOutput” 或 “Parameter” 作用域。在这种情况下,请确保 C 函数不会修改指针指向的内存。如果参数是 Output 类型,则在该函数的每次调用中,该指针指向的每个元素都应该重新分配。
C 参数Simulink Scope函数返回“Output”
double u“Input”、“Parameter”、“Constant”
double u[]
double
u[][2]
double u[2][3]“Output”(默认值)、“Input”、“Parameter”
double *u“Output”(默认值)、“InputOutput”、“Input”、“Parameter”
const double *u
const double
u[]
const double
u[][2]
const double
u[2][3]“Input”(默认值)、“Parameter”
使用 “InputOutput” 端口映射 C 函数中指针传递的输入。使用 “InputOutput” 端口创建的端口具有相同的输入和输出端口名称。“InputOutput” 端口允许输入和输出端口重用缓冲区。这可以根据信号大小和模块布局来优化内存的使用。
要将 C 函数参数映射到 “InputOutput” 端口,请在函数定义中将变量定义为指针。
extern void mean_filter(unsigned char* src,
unsigned int width, unsigned int height,
unsigned int filterSize);
然后,在 Port Specification 表中选择 “InputOutput” 作为端口作用域,并将结果函数输出赋给自定义函数中的输入变量。

您可以在自定义代码中使用全局变量,将它们映射到适当的 Simulink 作用域。要在模型中使用全局变量,请从 Model Settings > Configuration Parameters > Simulation Target 中选择 Enable global variables as function interfaces。您可以将全局变量映射到 C Caller 模块上的 “Input”、“Output”、“InputOutput” 或 “Global” 作用域。这些作用域的可用性取决于自定义代码中全局变量的使用情况。
“Global” 作用域使您能够在自定义代码和 C Caller 模块之间传输数据,并允许您在计算期间对模块使用全局变量。使用 “Global” 作用域传输的值在模块接口上不可见。下表显示示例代码段及其默认端口和可用端口。
示例代码Simulink Scopedouble data;
void foo(void)
{
int temp = data;
}全局变量数据只读取变量 data。可用作用域包括:
“Input”(默认值)
“Global”
double data;
void bar(void)
{
data = 0;
}数据写入全局变量。可用作用域包括:
“Output”(默认值)
“Global”
“InputOutput”
double data;
void foo2(void)
{
data = data + 1;
}可对全局变量读写数据。可用作用域包括:
“Global”(默认值)
“InputOutput”
“Output”
Label - 指示 Simulink 模块中对应参数的标签。默认情况下,参数标签与参数名称相同,除非您更改它。
Simulink ScopeSimulink 端口标签“input”、“output”端口名称
“inputoutput”输入和输出端口中的端口名称
“Global”端口名称和全局变量名称
“parameter”参数名称
“constant”常量值的表达式。
使用输入参数名称的 size 表达式,例如 size(in1,1)
Type - 说明 Simulink 数据类型和 C 函数参数数据类型之间的匹配。
C 参数数据类型Simulink 数据类型有符号字符int8
无符号字符uint8
charint8 或 uint8,具体取决于编译器
int*int32
无符号 int*uint32
short *int16
long *int32 或 fixdt(1,64,0),取决于操作系统
float单精度
双精度双精度
int8_t*int8
uint8_t*int8
int16_t*int16
uint16_t*uint16
int32_t*int32
uint32_t*uint32
typedef struct {…} AStruct**总线:AStruct
typedef enum {..} AnEnum**枚举:AnEnum
* 如果 C Caller 采用整数类型,例如 int16_t,您可以将其修改为具有匹配的基类型的定点类型,例如修改为 fixdt(1, 16, 3)。
** C
Caller 同步按钮提示您将 C 函数使用的结构体或枚举类型导入为 Simulink 总线和枚举类型。
Size - 指定参数中的数据维度。
C 参数维度Simulink 端口维度double u标量 (1)
double u[]
double
u[][2]继承 (-1)(默认值)
如果参数用于输出端口,则应指定大小。无法继承输出端口的大小。
double *u继承 (-1)(默认值)
如果参数是针对 “inputoutput” 端口的,则无法继承大小,即使可以继承 “output” 端口的大小也是如此。
对于全局变量,大小是标量 (1)。
double u[2][3]大小为 [2, 3]。
创建 FunctionPortSpecification 对象并编辑 C Caller 模块属性
要以编程方式更改 Port Specification 表属性,您可以创建 FunctionPortSpecification 对象并修改其属性。要为模型中的所选 C
Caller 模块创建 FunctionPortSpecification 对象,请在命令行中键入:
myCCallerConfigObj = get_param(gcb, 'FunctionPortSpecification')
myCCallerConfigObj =
FunctionPortSpecification with properties:
CPrototype: 'real_T add(real_T u1, real_T u2);'
InputArguments: [1×2 Simulink.CustomCode.FunctionArgument]
ReturnArgument: [1×1 Simulink.CustomCode.FunctionArgument]
GlobalArguments: [1×0 Simulink.CustomCode.FunctionArgument]CPrototype 属性是只读属性,它显示 C 函数输入变量的声明。InputArgument 和 ReturnArgument 属性创建了 FunctionArgument 对象,您可以根据上面为 Port Specification 表定义的规则进一步编辑其属性。您可以参考 FunctionPortSpecification 了解详细信息。
要修改 C Caller 模块中的全局参数,请使用 getGlobalArg 创建 GlobalArguments 对象的句柄并修改其属性。