在开发工作过程中,用户为想要知道供应商的开发能力,想要供应商的模型进行测试。面对如此要求,为了能够尽快拿到定点项目,供应商会选择一小块算法或是模型以黑盒的形式供客户测试。Simulink的Model模块除了具有模块引用的功能之外,还具有模型保护的功能。今天主要是以一个简单的实例讲解使用Model模块实现模型保护的功能。
1.Model模块
元件名称 Ports&Subsystems Model
功能:引用另一个模型来创建模型层次结构。
Library:
Simulink / Ports & Subsystems
HDL Coder / Ports & Subsystems
新建mi_add.slx命名的simulink文件,添加一个Model模块:
建立一个Add5.slx命名的simulink文件,包含了一个Add原子系统,实现了三个数相加的简单算法。
add原子系统内部的内容:
使用Model模块选择引用Add5.slx仿真文件:
此时,实现了在mi_add.slx文件中引用Add5.slx文件的功能,具有三个输入一个输出的仿真。
使用constant常数模块测试功能:
(1)右键选择Model模块,点击Subsystem&Model Reference->Create Protected for Selected Model Block。
(2)接着会弹出一个窗口,用于配置被保护模型的封装程度;
其中可以勾选三种行为,并设置密码:
Open read-only view of model
表示可以查看模型,但是无法修改;
Simulate 表示可以仿真;
Use generated code 表示可以生成代码;
(3)这里只勾选Simulate,并设置密码为 5205211314,保持默认路径,然后点击Create。
这里我遇到了报错,显示没有找到支持操作的编译器MinGW-w64,这里需要先安装该编译器。可以注册登录一个mathwork的账号就可以下载安装MinGW-w64,下载网址如下:
https://ww2.mathworks.cn/matlabcentral/fileexchange/52848-matlab-support-for-mingw-w64-c-c-fortran-compiler
下载之后获得mingw.mlpkginstall文件,在MATLAB的环境下打开,登录注册的账号开始在附加功能管理器中下载MinGW-w64编译器。
编译 yprime.c 示例
可以通过编译 yprime.c 示例来测试 MinGW编译器,将源文件复制到可写文件夹。
copyfile(fullfile(matlabroot,'extern','examples','mex','yprime.c'),'.','f')
如果在系统中仅安装了 MinGW 编译器,则 mex 命令会自动选择 MinGW。继续下一步。但如果有多个 C 或 C++ 编译器,请使用 mex -setup 选择 MinGW。
mex -setup
编译该 MEX 文件:
mex yprime.c
MATLAB 将显示“编译工具”消息,其中显示用于编译 MEX 文件的编译器,运行函数:
yprime(1,1:4)
安装好编译器之后,再次点击Creat,即可生成成功。
双击,会出现选择一个路径的对话框,会在选择的路径下生成一个.mlproj的工程格式文件。
这里在当前的路径下生成了Add5_protected的文件夹,其中文件具有Add5_harness.slx、Add5_protected.prj和Add5.slxp文件。
双击模型Add5_harness:
运行该模型,需要提供密码才能运行。
可以简单将输入改成了constant常量模块输入,display模块作为输出,可以发现功能算法实现正常。
双击Add5.xlsp模型,无法看到内部具体逻辑,会弹出一个总结及接口报告对话框,并且能够看到该模型被设置的权限。需要密码才能仿真,不能够读取内部逻辑,不能够生成代码,不能进行并发任务支持。
2.自动生成代码
修改模型的配置,使模型能够自动生成嵌入式代码:
尝试在只选择Simulate时,是否能够生成代码,按住Ctrl+B(自动生成代码的快捷键),发现没有权限,不能够生成代码。
保护模型允许仿真、允许读取内部逻辑,允许生成代码:
content type选为Obfuscated source code,就会生成可读性较差的代码。
前提是,上述操作的完成,需要输入密码。
允许读取内部逻辑:52052113145
允许仿真:5205211314
允许生成代码:52052113146
在这里遇到了错误,需求删除之前生成的文件。
点击Add5_harness.slx,输入上述密码:
双击可以进入受保护的引用仿真文件:
按Ctrl+B,自动生成嵌入式代码快捷键,会在当前的文件夹下生成如下所示的文件:
可以看出,生成的代码更加混乱,可读性非常差。这样,也就从代码的层面上保护了算法。
如果将content type选择成Readable source code,就会生成可读性较好的代码,生成的代码会比较规范的,包含了许多注释,以及合理的变量名和缩进。