主要内容

将生成的C代码部署到外部硬件:覆盆子π例子

使用MATLAB®编码器™生成基本或高级MATLAB算法的C代码,然后将算法部署到外部硬件平台。这些示例展示了Raspberry Pi™平台的部署场景。您可以使用树莓派(Raspberry Pi)等平台来构建更复杂或更大规模的部署工作流原型。树莓派操作系统为32位Linux操作系统®ARM上的操作系统环境®处理器。

该图显示了运行在树莓派上的弹簧质量阻尼器算法的生成代码。该算法的C语言主函数通过使用Linux设备文件接口集成了USB鼠标输入。

先决条件

  • 树莓派Model 3 B+。旧型号的树莓派硬件可能会表现出性能下降。

  • 网络访问或其他文件传输机制,如microSD卡读卡器。

  • 远程桌面连接或外部监视器。

  • 有线USB鼠标低延迟输入。

硬件实现参数

在为外部硬件生成代码时,代码生成器需要了解硬件平台设置,如类所指定的编码器。HardwareImplementation对象。该对象包含影响代码生成器所做假设的实现参数,这些参数对于实现预期行为非常重要。

例如,考虑运行32位Linux和8位Arduino的树莓派®平台。Arduino上的C编译器分配一个int16位,而对于树莓派,C编译器分配32位。如果生成的C代码使用int变量声明,然后在两个平台上运行相同的代码会导致不同的整数溢出行为。

由于这些平台的差异,要专门为您希望在其中运行生成的代码的平台设置硬件实现参数。默认情况下,为MATLAB主机平台设置参数。您可以使用MATLAB编码器app或命令行设置硬件参数,也可以使用硬件支持包。金宝app

通过App和命令行设置参数

通过设置硬件实现参数编码器。HardwareImplementation中打开配置对象MATLAB编码器例如:

CFG = code .config(“自由”);开放cfg

配置树莓派的实现参数。单击硬件窗格,并选择设备供应商作为手臂兼容而且设备类型作为手臂皮层.这个选择相当于输入:

cfg.HardwareImplementation.ProdHWDeviceType =ARM兼容->ARM Cortex

设置ProdHWDeviceType参数触发所有其他参数的适当设置编码器。HardwareImplementation参数。

使用硬件支持包配置参数金宝app

如果你能访问树莓派硬件的M金宝appATLAB支持包,你可以在MATLAB环境中建立到树莓派的连接。您可以设置编码器。HardwareImplementation通过选择覆盆子π硬件板菜单中的MATLAB编码器应用程序,或从命令行输入:

CFG = code .config(“自由”);hwObj = code .hardware(“树莓π”);cfg。硬件= hwObj;

coder.hardware函数创建编码器。硬件对象。当你分配编码器。硬件对象设置为配置对象,则硬件实现参数也相应设置。

Hello World示例

为外部硬件生成C源代码

考虑一个基本的MATLAB Hello World函数。

函数helloworld% # codegen流(“Hello world !”\ n”);

创建一个配置对象并指定源代码生成。设置树莓派的硬件实现参数。

CFG = code .config(“自由”“是”、假);cfg。GenCodeOnly = true;cfg.HardwareImplementation.ProdHWDeviceType =ARM兼容->ARM Cortex

生成代码:

codegen配置cfghelloworld报告

将文件传输到设备

方法可以将生成的代码打包用于文件传输packNGo函数。这个函数创建一个zip文件,其中包含所需生成的代码文件。的packNGo函数不包括生成的可用于将代码编译为可执行文件的示例主文件。分别移动生成的示例主文件或您自己手写的主文件。

控件所在的目录codegen命令,收集部署文件:

myBuildInfoFile =“codegen / lib / helloworld / buildInfo.mat”;负载(myBuildInfoFile);packNGo (buildInfo);移动文件。/ codegen / lib / c / helloworld示例移动文件/ / main.h codegen / lib / helloworld示例

将运行MATLAB的主机上的文件传输到外部硬件目标。您可以为您的平台或直接命令使用文件传输程序,例如scp树莓派的目的IP地址。

在设备上构建代码

将文件从终端传输到某个目录后,运行解压缩在zip文件上。那就使用Linux海湾合作委员会构建工具来创建可执行文件。它的名字helloworld- o选择:

GCC helloworld.c helloworld_initializer .c helloworld_terminate.c main.c -o helloworld.c

要运行可执行文件并验证构建是否成功,输入:

/ helloworld。

终端显示如下信息:

你好世界!

弹簧质量阻尼系统实例

生成弹簧质量阻尼器系统的源代码

这个例子展示了如何为弹簧质量阻尼器系统生成C源代码,然后您可以构建并在树莓派上运行。

弹簧质量阻尼器模型

带阻尼弹簧质量系统是力学和动力学中的一个基本系统。利用运动方程,你可以解出物体在不同初始条件和外力作用下的位移。

这个函数springMassEqns将运动方程编码为两个一阶线性微分方程的形式。的变量dxdt (1)而且dxdt (2)分别是物体的速度和加速度。的变量x (1)表示物体的位置。

函数dxdt = springMassEqns(t,x,x0,k,m,c,F) dxdt =零(2,1);Dxdt (1) = x(2);dxdt(2) = F/m - k/m*(x(1)-x0) - c/m*x(2);

MATLAB算法

为了模拟位移作为时间的函数,函数springMassStep应用ODE求解器数值运动方程。

函数[x] = springMassStep(xi,vi,ti,dt,g)% # codegen设置弹簧平衡位置X0 = 1;设置弹簧,质量,阻尼常数K = 1000;M = 10;C = 25;将加速度比作重力F = m*g;求ti + dt时位移的ODEinitCond = [xi vi];Tspan = [ti ti+dt];(~ x) =数值(@ (t, x) springMassEqns (t, x, x0, k、m c、F), tspan, initCond);

springMassTakeStep函数调用springMassStep函数并返回固定时间间隔结束时的最终位移。

函数[xf, vf] = springmasstackstep (xi,vi,ti,dt,g)% # codegen函数springmasstackstep充当ODE求解函数step的包装器。它接受与springMassStep相同的输入参数,但只输出最终参数位置和速度。x = springMassStep(xi,vi,ti,dt,g);Xf = x(end,1);Vf = x(end,2);

算法的结果

为了理解模型和算法的典型行为,脚本springMassSim在一个典型的参数范围内模拟系统。输出结果显示了质量位移随时间的函数关系。您可以调整初始条件、模型参数和强制函数,以查看模型如何响应。

springMassSim

生成C源代码

在验证MATLAB模型按预期工作后,生成用于部署的C源代码。

Vi = 0;Ti = 0;Dt = .01;G = 0;CFG = code .config(“自由”“是”、假);cfg。GenCodeOnly = true;cfg.HardwareImplementation.ProdHWDeviceType =ARM兼容->ARM Cortex;codegenspringMassTakeSteparg游戏{xi, vi, ti, dt, g}配置cfg报告
代码生成成功:要查看报告,打开('codegen/lib/ springmasstackstep /html/report.mldatx')

将文件传输到设备

生成算法的C源代码后,可以修改示例c而且main.h用于应用程序的文件。对于本例,所附文件springMass_main.c演示如何使用生成的代码。对应的头文件springMass_main.h也附在前一个示例的支持文件中。金宝app

从生成代码的目录中,收集用于部署的文件:

myBuildInfoFile =“codegen / lib / springMassTakeStep / buildInfo.mat”;负载(myBuildInfoFile);packNGo (buildInfo);

传输压缩文件和你的主.c而且.h从运行MATLAB的主机到目标的文件。您可以为您的平台或直接命令使用文件传输程序,例如scp树莓派的目的IP地址。

在设备上构建代码

主要文件。主要功能springMass_main.c执行生成的代码来模拟弹簧质量阻尼器系统随时间的位移。该功能使用树莓派的USB鼠标输入,对物体施加一个力。力的强度与鼠标水平移动的速度成正比。如果不移动鼠标,该示例将模拟非强制动态。为了提供动态的可视化,主文件包括一个例程来打印质量随时间的位置。

设备文件。要使用鼠标输入,必须确定系统上的哪个设备文件与鼠标对应。在Linux平台上,外部USB设备输入记录在存储在/dev/input/文件夹中。的/dev/input/文件夹通常包含多个输入设备的文件。要确定与USB鼠标对应的文件,请使用od命令每个文件,并检查哪个文件更新响应鼠标移动。

od文件名

构建。要从Linux终端构建代码,请导航到传输文件的位置。解压zip文件。使用海湾合作委员会命令并指定所有.cspring质量示例中的文件:

gcc *.c -o springMassSim -lm

- lm标志指示编译器链接到所需的C数学库。要运行可执行文件,指定先前识别的USB鼠标设备文件,这里假定为event0

。/ springMassSim /dev/input/event0

移动鼠标对物体施加一个力,并查看产生的动态。如果质量没有响应鼠标移动,请尝试指定不同的设备文件。输入终止程序CTRL + c在执行期间。

另请参阅

||

相关的话题