Simulink code 交换两个变量的值
引言
Simulink 方便建立算法模型,仿真和部署;那么能不能精确控制模型生成的代码,实现和手写代码的高度一致。比如实现交换两个变量的值:
float a;
float b;
void Exchange( float* a, float* b)
{
float c ;
c = *a;
*a = *b;
*b = c;
}
以上代码显示,定义两个浮点型变量,定义函数void Exchange( float* a, float* b);通过传引用的的方式改变两个参数的值。
实现过程如下:
建立simulink 模型
1. 建立一个简单的模型,两个输入,两个输出,输入接口和输出接口交错连接;
生成代码:
/* External inputs (root inport signals with default storage) */
ExtU rtU;
/* External outputs (root outports fed by signals with default storage) */
ExtY rtY;
/* Model step function */
void copy_step(void)
{
/* Outport: '<Root>/Out1' incorporates:
* Inport: '<Root>/In2'
*/
rtY.Out1 = rtU.In2;
/* Outport: '<Root>/Out2' incorporates:
* Inport: '<Root>/In1'
*/
rtY.Out2 = rtU.In1;
}
默认情况下,代码生成的是一个没有参数的函数,数据交互依靠全局变量;同时输入和输出不是同一个变量;不符合要求;
2. 使用代码接口,更改函数名,输入参数;
1代码接口;2默认代码配置;3function;
4点击这个函数;5给函数重新命名;6勾选;7给对应的端口命名a b;8确认。
生成代码
/* Model step function */
void Exchange(float *a, float *b)
{
float b_1_0;
/* Outport: '<Root>/Out2' incorporates:
* Outport: '<Root>/Out1'
*/
b_1_0 = *a;
/* Outport: '<Root>/Out1' incorporates:
* Outport: '<Root>/Out2'
*/
*a = *b;
/* Outport: '<Root>/Out2' */
*b = b_1_0;
}
此时生成的代码已经非常接近我们手写的要求了,但是函数内部变量float b_1_0 不是我们希望的c;
3. 添加数据储存类
修改模型如下:
通过添加数据储存变量,代替默认的中间变量;
代码如下:
/* Model step function */
void Exchange(float *a, float *b)
{
float c;
/* DataStoreWrite: '<Root>/Data Store Write1' */
c = *a;
/* Outport: '<Root>/Out1' incorporates:
* DataStoreRead: '<Root>/Data Store Read'
* DataStoreWrite: '<Root>/Data Store Write'
*/
*a = *b;
/* Outport: '<Root>/Out2' incorporates:
* DataStoreRead: '<Root>/Data Store Read1'
*/
*b = c;
}
此时生成的代码和我们的手写代码完全一致。
调用Exchange函数
下面演示如何调用我们生成的Exchange函数,实现变量值的交换。
未完待续!!!