CN104461569B - 一种基于matlab的c/c++程序生成辅助方法 - Google Patents
一种基于matlab的c/c++程序生成辅助方法 Download PDFInfo
- Publication number
- CN104461569B CN104461569B CN201410830514.XA CN201410830514A CN104461569B CN 104461569 B CN104461569 B CN 104461569B CN 201410830514 A CN201410830514 A CN 201410830514A CN 104461569 B CN104461569 B CN 104461569B
- Authority
- CN
- China
- Prior art keywords
- matlab
- function
- codes
- language
- functions
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开一种基于MATLAB的C/C++程序生成辅助方法,该方法能够使得编写的MATLAB函数快速符合代码生成的标准,自动生成正确的可读、可编辑的C/C++语言代码,大幅简化C/C++代码的加工改写工作,当多个生成函数并存时,有效解决了变量、函数名冲突问题,实现了优化管理。在工程应用中,能够大幅提高程序运行率,简化C/C++语言的开发与调试工作,有极大的应用价值。
Description
技术领域
本发明涉及工程软件开发应用领域,具体是一种基于MATLAB的C/C++程序自动生成辅助技术。
背景技术
随着计算机技术水平的发展,当今计算机已成为科学工程领域最基本、最必不可少的工具。在工程实际当中,计算机的实用率越来越高,再加上各个工程环节朝着自动化、智能化的方向发展,各领域对性能强大的专业工程软件平台有着强烈的开发需求。为了实现跨平台高效运行,与工程实际接轨,C/C++语言无疑是首选的开发语言。作为一门非常基础的计算机语言,C/C++运行效率高,可以很方便地在windows、linux、unix、osx等操作系统上运行,但C/C++语言中,要实现工程当中常用矩阵运算、数学运算、优化计算十分复杂,而且调试难度高,编程工作量大。MATLAB可以很好地弥补C/C++的这些缺点,但却不具备运行效率高,跨平台方便等优点。如果,能将MATLAB中编写转换的函数直接转换为C/C++函数,将为工程软件的开发节省大量的时间和精力。从2011年起,MATLAB中的MATLAB Coder工具包开始支持将MATLAB函数,自动生成为C/C++函数。但由于技术的限制,为得到可以自动生成C/C++函数的MATLAB程序,需要进行大量的变量类型定义和修改,工作非常琐碎;MATLAB当中的一些数据结构、算法、编程方式,不支持自动生成;生成的C/C++语言可能会在无提示的情况下,产生错误程序,这些错误很难发现;MATLAB与生成的C/C++函数在多维数组下标的处理上,采用不同的机制,原有参数数据,无法直接使用;所生成的C/C++函数,若想与已有程序对接,需要进行一系列繁琐的处理工作,和代码编写工作,并调用复杂的结构型变量初始化函数进行大量的初始化工作。为了更高效地利用MATLAB Coder工具包,亟需开发一组配套辅助技术,来解决上述问题了困难。
发明内容
发明目的:
本发明为简化MATLAB Coder代码生成应用工作,提出基于MATLAB的C/C++程序自动生成方法的一种辅助技术,将为使用MATLAB Coder所作的代码改写和处理工作大幅简化,可以满足工程软件开发的需求。
技术方案:
本发明提出一种基于MATLAB的C/C++程序生成辅助方法,包括如下步骤:
1)建立可用于C/C++代码生成的MATLAB程序的规范化语言检索机制,并基于该机制开发一种文本分析器,用于分析MATLAB代码,检索出不规范语言;
2)对常用的、不支持自动生成C/C++代码的MATLAB语言、数据结构进行改写;
3)利用以变量类型和变量运行路径为主线、追踪函数转换限制的程序编写流程生成C/C++代码;
4)对由MATLAB生成的C/C++函数及相关的无穷大数据处理函数、变长度数据处理函数按剥离—共用方法进行整合,给出这些函数与C/C++功能平台的衔接标准化代码模板;
5)对由MATLAB生成的多个C/C++函数在同一目录下运行时的冲突变量、函数,通过分离无穷大数据处理函数、变长度数据处理函数,指定公共调用路径,调用相同功能部分,实现优化运行;
6)对生成的C/C++代码进行配置和测试,如果测试结果不正确,文本分析器针对各类运行出错情况给出对应错误提示和MATLAB代码修改方法,实现问题代码段的快速定位并修正;
7)重复步骤6),直到测试结果正确。
本发明能够使得编写的MATLAB函数快速符合代码生成的标准,自动生成正确的可读、可编辑的C/C++语言代码,大幅简化C/C++代码的加工改写工作,当多个生成函数并存时,有效解决了变量、函数名冲突问题,实现了优化管理。在工程应用中,能够大幅提高程序运行率,简化C/C++语言的开发与调试工作,有极大的应用价值。
具体实施方式
本发明的基于MATLAB的C/C++程序自动生成辅助方法,包括如下步骤:
1)建立可用于C/C++代码生成的MATLAB程序的规范化语言检索机制,并基于该机制开发一种文本分析器,用于分析MATLAB代码,检索出不规范语言。
通过研究MATLAB代码生成原则和限制,得到MATLAB程序的规范化语言检索机制,该机制归纳出了各类需修改的不规范语言的常用修改方法和错误提示,给出了不支持函数的典型特征,用该方法可以迅速检索出潜在的不规范语言。
产生错误提示的典型不规范语言的修改方法有:
i.对于一个长度动态增加数组,若要生成C/C++代码,需要在使用该变量之前按照变量的长度进行初始化,例如:
for i=1:N
y(i,i)=N
end
需要被改写为:
其检索特征为:没有初始化大小的数组变量;
ii.对于复数,必须用complex进行初始化:
y=zeros(1,10);
y(1)=1+4i;
需改写为
y=complex(zeros(1,10));
y(1)=1+4i;
其检索特征为:没有事先声明为复数的复数变量;
iii.尽量避免虚数单位与变量i、j的混淆:
y=4*i
改写为:
y=4*1i
其检索特征为:没有系数的虚数单位
iv.变长度数组大小的限定
其中,如果一个数组的大小需要在运行的过程当中才能计算得出,例如y=zeros(2,N)
N,为程序运行过程当中计算出的一个结果。那么,可以通过assert语句来实现(假定最大值为100);
assert(N<100);
y=zeros(2,N);
其检索特征为:数组越界;
v.标量强制转换
对于MATLAB而言,一个标量与一个1*1的矩阵并没有区别。但是当需要生成C/C++代码时,有些情形下,操作只能面向标量而不能面向矩阵。这便会导致代码生成过程当中检测出错。例如
y(1,1)=1;
size(y)=[11]
此时,可使用命令y=y(1,1)将其强制转换为标量。
其检索特征为:标量数组混合定义。
不支持函数(即为MATLAB中不支持自动生成(转换)C/C++代码的函数,等同于不规范语言)的典型特征包括:
i.与稀疏矩阵相关的语句,如
S=sparse(A)
S=vsparse(r,c,s,m,n)
ii.在matlab中有大量重载型式的语句,如:
I=find(X);
I=find(X,K);
I=find(X,K,'first');
I=find(X,K,'last');
[I,J]=find(X,...);
[I,J,V]=find(X,...);
iii.在matlab中变量参数中包括数组,且数组维数可以动态改变的语句,如:
[Y,I]=max(X,[],DIM)
根据上述机制,开发出一种文本分析器,该文本分析器可以按照上述机制分析代码,检索出不规范语言,并给出相应的错误提示和修改方法。
2)对常用的、不支持自动生成C/C++代码的MATLAB语言、数据结构进行改写。
编写MATLAB中稀疏矩阵、单元阵列、递归函数、结构体等典型不可转换算法、数据结构的等效MATLAB程序,使其与被替代内容在功能上完全等效,又可支持C/C++代码代码生成。
本步骤通过建立一个MATLAB源代码库来实现,该库中给出了MATLAB自带函数的替代函数,这些函数包括MATLAB典型不支持函数的替代函数,在编程时,使用这些函数可以顺利完成转换工作。
该源代码库当中的函数命名规则为:在原MATLAB函数名的后方加上后缀_coder,如s=sparse(A);的对应可生成的函数名为s=sparse_coder(A);
3)利用以变量类型和变量运行路径为主线、追踪函数转换限制的程序编写流程生成C/C++代码。
该程序编写流程的特征在于:
①改变MATLAB中变量不需要定义的编写习惯,专门开辟一个代码编写模块,在该模块中完成符合代码生成规范的变量定义。
②MATLAB的代码生成机制会自动检测所有的if语句和switch语句,在所有的语句当中,在任何一种情况下,不能出现未定义的变量,即便在逻辑上,这些未定义变量的情形不会出现,也不会对程序的执行产生任何影响。例如:
该段程序在逻辑上没有任何问题,在MATLAB中也可以顺利运行,但当进行代码生成时,就会检查出错。所以,本编写流程对if与switch语句内部的变量定义进行了限制,确保代码转换的顺利进行。限制规定,if和switch语句中定义和处理(特别是改数组大小的处理)的变量的生命周期必须在本语句内部,如果必须要进行分情况调用处理,则要在if和switch语句前完成定义和初始化。
③对于函数限制,本流程确立了先查询,后调用的原则,在需要使用MATLAB自带函数命令段的时候,先查询限制,完成必要的配置工作,再进行使用的原则。先查询限制是指:查询MATLAB Coder手册,看看该函数是否支持进行C/C++代码生成,如果支持,看它的使用是否有限制。这种限制是MATLAB规定的。配置是指完成相应的维度固化等相关配置,这部分配置可以在函数手册中查到。4)对由MATLAB生成的C/C++函数及相关的无穷大数据处理函数、变长度数据处理函数按剥离—共用方法进行整合,给出其与C/C++功能平台的衔接标准化代码模板;对于生成的C/C++函数,只需修改衔接标准化代码模板中的函数名,即可直接使用。
剥离是指,将本应在函数中完成的部分头文件定义和参数预处理工作从函数文件中删去,独立编写成了一个新的预处理函数。这部分内容的特点是,每个生成的C/C++函数都需要重复,但其内容基本一致。共用是指,所有生成的函数均共用这个新定义的预处理函数,而不再进行重复工作。
该衔接标准化代码模板的具体特征包括:
(1)实现对变长度参数的结构型变量的初始化:
变长度参数结构型变量的初始化通过合理调用emxAPI.h/emxAPI.cpp函数接口来实现。并使用C++模板编程来实现代码的通用性。
(2)实现对MATLAB与C/C++二维数组行、列优先顺序,及多维数组下标顺序差异的处理:
对于二维数组和多位数组的处理方法是使用递归转换的方法,将维度下标作为参数,逆向变换改写,高效正确地完成二维/多维数组变量在MATLAB与其对应生成C++代码中下标不一致的问题,该部分功能实现对其格式的转换工作,简化生成代码的处理工作。
(3)实现对通用头文件、初始终止函数的标准化处理:
该部分功能的特征在于集中处理生成代码所必须的繁杂的配套函数处理工作,这种处理,通过提炼通用的生成函数预处理规则,借助宏定义的方法,将函数名作为参数,编写一套通用的已生成C/C++函数标准化预处理代码。只需要将函数名代入,即可完成对生成函数的预处理操作。标准化预处理代码处理的相关文件包括:
_emxAPI.h/_emxAPI.cpp
_emxutil.h/_emxutil.cpp
_initialize.h/_initialize.cpp
_rtwutil.h/_rtwutil.cpp
_terminate.h/_terminate.cpp
_types.h/_types.cpp
rt_nonfinite.h
rtGetInf.h/rtGetInf.cpp
rtGetNaN.h/rtGetNaN.cpp
rtwtypes.h
通过本步骤处理可以使得函数的调用大幅简化。
5)对由MATLAB生成的C/C++函数在同一目录下运行时的多个冲突变量、函数,通过分离无穷大数据处理函数、变长度数据处理函数,指定公共调用路径,调用相同功能部分,实现优化运行。
该步骤通过分离无穷大数据处理函数、变长度数据处理函数的头文件、函数代码与预处理代码,将它们单独打包,独立放置在一个专用路径文件夹内,设置相应的管理方法,即采用相对路径管理,提升文件夹的层次等级,各个生成的函数均从同一位置调用,降低代码重复率,这样的管理方法解决了一个大型工程的头文件冲突问题,并大幅提升了运行效率。
6)对生成的C/C++代码进行配置和测试,如果测试结果不正确,文本分析器针对各类运行出错情况给出对应错误提示和MATLAB代码修改方法,实现问题代码段的快速定位并修正。
7)重复步骤6),直到测试结果正确。
Claims (3)
1.一种基于MATLAB的C/C++程序生成辅助方法,其特征在于,包括如下步骤:
1)建立可用于C/C++代码生成的MATLAB程序的规范化语言检索机制,并基于该机制开发一种文本分析器,用于分析MATLAB代码,检索出不规范语言;
2)对常用的、不支持自动生成C/C++代码的MATLAB语言、数据结构进行改写;
3)利用以变量类型和变量运行路径为主线、追踪函数转换限制的程序编写流程生成C/C++代码;
4)对由MATLAB生成的C/C++函数及相关的无穷大数据处理函数、变长度数据处理函数按剥离—共用方法进行整合,给出这些函数与C/C++功能平台的衔接标准化代码模板;
5)对由MATLAB生成的多个C/C++函数在同一目录下运行时的冲突变量、函数,通过分离无穷大数据处理函数、变长度数据处理函数,指定公共调用路径,调用相同功能部分,实现优化运行;
6)对生成的C/C++代码进行配置和测试,如果测试结果不正确,文本分析器针对各类运行出错情况给出对应错误提示和MATLAB代码修改方法,实现问题代码段的快速定位并修正;
7)重复6),直到测试结果正确。
2.根据权利要求1所述的一种基于MATLAB的C/C++程序生成辅助方法,其特征在于,所述1)中,MATLAB程序的规范化语言检索机制归纳出了各类需修改语言的常用修改方法和错误提示,给出了不支持函数的典型特征。
3.根据权利要求1所述的一种基于MATLAB的C/C++程序生成辅助方法,其特征在于,所述4)中,衔接标准化代码模板的具体特征包括:
(1)实现对变长度参数的结构型变量的初始化;
(2)实现对MATLAB与C/C++二维数组行、列优先顺利及多维数组下标顺序差异的处理;
(3)实现对通用头文件、初始终止函数的标准化处理。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410830514.XA CN104461569B (zh) | 2014-12-26 | 2014-12-26 | 一种基于matlab的c/c++程序生成辅助方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410830514.XA CN104461569B (zh) | 2014-12-26 | 2014-12-26 | 一种基于matlab的c/c++程序生成辅助方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104461569A CN104461569A (zh) | 2015-03-25 |
CN104461569B true CN104461569B (zh) | 2018-02-27 |
Family
ID=52907680
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410830514.XA Expired - Fee Related CN104461569B (zh) | 2014-12-26 | 2014-12-26 | 一种基于matlab的c/c++程序生成辅助方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104461569B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108829387B (zh) * | 2018-06-07 | 2021-10-08 | 中国电子科技集团公司第四十一研究所 | 一种基于Windows平台的RPC函数生成方法 |
CN113282541B (zh) * | 2021-06-04 | 2023-08-11 | 网易(杭州)网络有限公司 | 文件调用方法、装置和电子设备 |
US12008363B1 (en) | 2021-07-14 | 2024-06-11 | International Business Machines Corporation | Delivering portions of source code based on a stacked-layer framework |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101216769A (zh) * | 2008-01-14 | 2008-07-09 | 浙江大学 | 层次化系统描述语言SmartC到C代码的自动转换方法 |
CN104091006A (zh) * | 2014-07-01 | 2014-10-08 | 中国北方发动机研究所(天津) | Simulink中自适应的仿真和代码生成的控制方法 |
-
2014
- 2014-12-26 CN CN201410830514.XA patent/CN104461569B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101216769A (zh) * | 2008-01-14 | 2008-07-09 | 浙江大学 | 层次化系统描述语言SmartC到C代码的自动转换方法 |
CN104091006A (zh) * | 2014-07-01 | 2014-10-08 | 中国北方发动机研究所(天津) | Simulink中自适应的仿真和代码生成的控制方法 |
Non-Patent Citations (2)
Title |
---|
"Matlab Coder生成C代码的研究与实现";廖灿灿等;《计算机与现代化》;20130331(第3期);第175-178、183页 * |
"Matlab/Simulink模型到C/C++代码的自动实现";张祥等;《重庆工学院学报》;20061130;第20卷(第11期);第111-113页 * |
Also Published As
Publication number | Publication date |
---|---|
CN104461569A (zh) | 2015-03-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104662514B (zh) | 基于模型关联关系的遗产软件系统的现代化 | |
US8533642B1 (en) | Hardware definition language generation for frame-based processing | |
US7334219B2 (en) | Method and system for object level software testing | |
US20040111248A1 (en) | Polymorphic computational system and method | |
CN101216803B (zh) | 基于基路径的测试程序控制流路径集生成方法 | |
CN105022630B (zh) | 一种组件管理系统及组件管理方法 | |
CN102541521B (zh) | 基于结构化查询语言的操作指令自动生成装置及方法 | |
CN104268073A (zh) | 一种批量生成测试用例的方法 | |
US20070061641A1 (en) | Apparatus and method for generating test driver | |
CN104461569B (zh) | 一种基于matlab的c/c++程序生成辅助方法 | |
CN105302719A (zh) | 一种变异测试方法及装置 | |
CN103744684A (zh) | 一种异构软硬件协同开发的方法及系统 | |
CN106970803A (zh) | 一种软件系统演化的分析方法和装置 | |
CN106446064A (zh) | 一种数据转换方法及装置 | |
Macias-Ramos et al. | Extending simulation of asynchronous spiking neural P systems in P–lingua | |
Siol et al. | EggLib 3: A python package for population genetics and genomics | |
Ferrés et al. | Protocol for post-processing of bacterial pangenome data using Pagoo pipeline | |
CN107180193B (zh) | 一种将程序代码转换成数据约束的方法和装置 | |
CN104850015B (zh) | 一种软件封装方法及一种汽车电子控制器 | |
CN113495094A (zh) | 分子质谱模型的训练方法、分子质谱模拟方法和计算机 | |
CN105446788B (zh) | 一种信息处理方法及电子设备 | |
CN106598839A (zh) | 一种面向目标代码的程序静态分析方法 | |
KR20100062787A (ko) | 차량 오픈 시스템 아키텍처에서의 응용 소프트웨어 구조 생성 방법 및 장치 | |
Allen et al. | A novel online simulator for applications requiring a model reference | |
Panyala et al. | On the use of term rewriting for performance optimization of legacy HPC applications |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20180227 Termination date: 20191226 |