本发明涉及汽车电子控制单元基于模型开发的方法,具体来说,涉及一种利用 Simulink定制单片机的底层驱动进行全自动代码生成的方法。
背景技术:
目前在汽车与航空航天等领域中基于模型设计的方法已经被越来越多的使用。汽车行业通用的汽车电子控制单元的开发大体分为底层软件和应用层软件,底层软件常用的开发方法是手写单片机的底层驱动程序,应用层软件是利用Matlab/Simulink/Stateflow工具以图形化形式建立模型,并以Matlab自带的Embeded Coder工具将图形化形式的模型转为C代码,用户再将手写的底层代码与应用层生成的C代码二者集成到一起后才可以下载到汽车电子控制单元里面。
针对相关技术中的问题,目前尚未提出有效的解决方案。
为了加速汽车电子控制单元中底层驱动的开发流程,本发明将MPC5644A单片机的底层驱动以Simulink模块的形式添加到Simulink模型库中,以图形化形式建立模型,利用 Embeded Coder代码生成机制,实现驱动代码的快速生成。代码生成完毕后自动后台启动 CodeWarrior编译器对模型源代码进行编译链接等操作,全程不需要人为执行任何操作,实现Embeded Coder由系统模型到应用程序下载的一键式操作。
技术实现要素:
针对相关技术中的上述技术问题,本发明提出一种利用Simulink定制MPC5644A的底层驱动进行代码生成的方法,能够提高代码开发效率。
为实现上述技术目的,本发明的技术方案是这样实现的:
一种利用Simulink定制MPC5644A的底层驱动进行代码生成的方法,包括以下步骤:
S1编写模块S-Function:在熟悉S-Function编写的的基础上,编写该款单片机某个功能模块的S-Function,所述的S-Function包含了该功能模块中的输入或输出数量,宽度,数据类型,采样时间以及其他一些信息,所述的S-Function保存在一个特定的文件夹中,其扩展名为“c”;
S2模块S-Function的编译:利用Matlab自带了Lcc编译器对模块S-Function进行编译,但第一次启动Lcc时,需要初始化Lcc编译器,可在Matlab命令窗口下输入mex–setup,回车,让用户选择编译器,选择1,代表Lcc,再回车,确认用户的选择,输入y。
完成这个步骤后,要将Matlab工作路径与步骤1中的文件夹路径保持一致,在 Matlab命令窗口下输入mex xxx.c,xxx表示模块名,此时文件夹中生成一个xxx.mexw32动态链接库文件,表示模块S-Function的编译已完成;
S3模块S-Function与mexw32文件建立联系:将S-Function模块添加到Simulink模型中,双击该模块,在弹出的对话框中第一行输入同所述的模块S-Function文件名一致,在对话框中第二行输入参数信息,点击OK确定,这时,模块S-Function与mexw32文件之间建立了联系;
S4模块封装:对模块进行封装,定制个性化的图标和对话框。右键选中模块的Edit Mask 选项,对模块进行个性化编辑。在Icon&Ports选项卡中输入显示命令,用来个性化定制模块界面的显示内容;在Parameters选项卡中添加模块参数,并给每个参数取一个提示名;在 Documentation选项卡中填写关于该模块的一些说明信息及帮助信息,以便使用户能更快了解该模块及其用法;
S5编写模块tlc(Target Language Compiler)文件:设备驱动模块S-Function封装完毕后,为了将定制的驱动模块程序嵌入到自动生成的模型源代码中,需要编写设备驱动模块的tlc 文件。所述的tlc中包含四个函数:BlockTypeSetup、Start、Outputs、Terminate。
BlockTypeSetup函数只在代码生成过程中执行一次,用来执行给定类型的所有模块的一般性操作,可以将模块中的要用到的#include头文件包含操作,宏声明,函数原型的声明等放在BlockTypeSetup中;Start函数中的代码在经过Embeded Coder代码自动生成之后会存放到模型的初始化函数(initialize)中,可将模块的初始化配置放在Start中;Outputs函数中的代码在经过Embeded Coder代码自动生成之后会存放到模型的step函数中;Terminate函数中的代码在经过Embeded Coder代码自动生成之后会存放到模型的terminate函数中。当定制用户自定义的模块tlc文件时,用户能够通过使用该函数来执行保存数据、清空内存及复位目标硬件等操作。
S6按照步骤1-5将每个模块封装好后保存为MPC5644A_Lib库,然后编写slblocks.m 脚本文件,在Simulink Browser环境界面中将会出现MPC5644A硬件的底层驱动库。
本发明的有益效果:Simulink中搭建的系统模型经过Embeded Coder工具创建过程后,会自动将生成的模型源代码下载到目标板中运行,全程不需要人为对源代码进行任何修改,真正实现了从系统模型到系统应用程序的一键式操作;同时,实验测试结果表明设计的 MPC5644A的底层驱动,功能完全正确。因此,利用这种开发方式可以降低项目的开发成本、提高开发效率、缩短产品的上市周期,同时由于驱动模块程序的接口符合AutoSAR标准,这也大大提高了代码的通用性和移植性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是根据本发明实施例所述的一种利用Simulink定制单片机的底层驱动进行代码生成的方法的S-Function封装过程;
图2是根据本发明实施例所述的一种利用Simulink定制单片机的底层驱动进行代码生成的方法的MPC5644底层驱动S-Function模块示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,根据本发明实施例所述的一种利用Simulink定制单片机的底层驱动进行代码生成的方法,包括:
S1编写模块S-Function;
S2对上述模块S-Function进行编译;
S3建立模块S-Function与mexw32文件之间的联系;
S4对模块S-Function进行封装;
S5编写模块S-Function的tlc文件。
进一步的,该方法进一步包括:S6将每个模块封装好后保存为MPC5644A_Lib库,然后编写slblocks.m脚本文件。
进一步的,S1具体包括:编写该单片机功能模块的S-Function,所述的S-Function包含了该功能模块中的输入或输出数量,宽度,数据类型,采样时间以及其他信息,所述的S- Function保存在一个特定的文件夹中,其扩展名为“c”。
进一步的,S2具体包括:利用Matlab的Lcc编译器对模块S-Function进行编译, Matlab工作路径与S1中的文件夹路径保持一致。
进一步的,S3具体包括:将S-Function模块添加到Simulink模型中,建立模块S- Function与mexw32文件之间的联系。
进一步的,S4具体包括:对模块进行封装,定制个性化的图标和对话框;在 Icon&Ports选项卡中输入显示命令,用来个性化定制模块界面的显示内容;在Parameters选项卡中添加模块参数,给每个参数取一个提示名;在Documentation选项卡中填写关于该模块的说明信息及帮助信息,以便使用户能更快了解该模块及其用。
进一步的,S5具体包括:设备驱动模块S-Function封装完毕后,编写设备驱动模块的tlc文件。
进一步的,所述的tlc中包含四个函数:BlockTypeSetup、Start、Outputs、 Terminate,
其中,BlockTypeSetup函数只在代码生成过程中执行一次,用来执行给定类型的所有模块的一般性操作,用于存放模块中要用到的#include头文件包含操作,宏声明,函数原型的声明;
Start函数中的代码在经过Embeded Coder代码自动生成之后会存放到模型的初始化函数 initialize中,用于存放模块的初始化配置;
Outputs函数中的代码在经过Embeded Coder代码自动生成之后会存放到模型的step函数中;
Terminate函数中的代码在经过Embeded Coder代码自动生成之后会存放到模型的terminate 函数中,用于在定制用户自定义的模块tlc文件时,执行保存数据、清空内存及复位目标硬件操作。
为了方便理解本发明的上述技术方案,以下通过具体使用方式上对本发明的上述技术方案进行详细说明。
在具体使用时,根据本发明所述的利用Simulink定制MPC5644A的底层驱动进行代码生成的方法,包括以下几个步骤:
步骤1)编写模块S-Function:在熟悉S-Function编写的的基础上,编写该款单片机某个功能模块的S-Function,所述的S-Function包含了该功能模块中的输入或输出数量,宽度,数据类型,采样时间以及其他一些信息,所述的S-Function保存在一个特定的文件夹中,其扩展名为“c”;
步骤2)模块S-Function的编译:利用Matlab自带了Lcc编译器对模块S-Function进行编译,但第一次启动Lcc时,需要初始化Lcc编译器,可在Matlab命令窗口下输入mex– setup,回车,让用户选择编译器,选择1,代表Lcc,再回车,确认用户的选择,输入y。
完成这个步骤后,要将Matlab工作路径与步骤1中的文件夹路径保持一致,在 Matlab命令窗口下输入mex xxx.c,xxx表示模块名,此时文件夹中生成一个xxx.mexw32动态链接库文件,表示模块S-Function的编译已完成;
步骤3)模块S-Function与mexw32文件建立联系:将S-Function模块添加到Simulink模型中,双击该模块,在弹出的对话框中第一行输入同所述的模块S-Function文件名一致,在对话框中第二行输入参数信息,点击OK确定,这时,模块S-Function与mexw32文件之间建立了联系;
步骤4)模块封装:对模块进行封装,定制个性化的图标和对话框。右键选中模块的Edit Mask选项,对模块进行个性化编辑。在Icon&Ports选项卡中输入显示命令,用来个性化定制模块界面的显示内容;在Parameters选项卡中添加模块参数,并给每个参数取一个提示名,在Prompt选项栏中输入需要定制的模块S-Function对话框中显示的内容,点击确认后,在所述的Prompt选项栏中输入的文字将会出现在S-Function模块对话框中。在Variable 栏中输入的变量要与S-Function对话框中输入的参数对应。在Type栏中选择参数要表现的形式,Popup表示以下拉菜单的形式供用户枚举,edit表示用户自己编辑参数;在 Documentation选项卡中填写关于该模块的一些说明信息及帮助信息,以便使用户能更快了解该模块及其用法;
步骤5)编写模块tlc(Target Language Compiler)文件:设备驱动模块S-Function封装完毕后,为了将定制的驱动模块程序嵌入到自动生成的模型源代码中,需要编写设备驱动模块的 tlc文件。所述的tlc中包含四个函数:BlockTypeSetup、Start、Outputs、Terminate。
BlockTypeSetup函数只在代码生成过程中执行一次,用来执行给定类型的所有模块的一般性操作,可以将模块中的要用到的#include头文件包含操作,宏声明,函数原型的声明等放在BlockTypeSetup中;Start函数中的代码在经过Embeded Coder代码自动生成之后会存放到模型的初始化函数(initialize)中,可将模块的初始化配置放在Start中;Outputs函数中的代码在经过Embeded Coder代码自动生成之后会存放到模型的step函数中;Terminate函数中的代码在经过Embeded Coder代码自动生成之后会存放到模型的terminate函数中。当定制用户自定义的模块tlc文件时,用户能够通过使用该函数来执行保存数据、清空内存及复位目标硬件等操作。
步骤6)按照步骤1-5将每个模块封装好后保存为MPC5644A_Lib库,然后编写 slblocks.m脚本文件,在Simulink Browser环境界面中将会出现MPC5644A硬件的底层驱动库。在Simulink Browser环境界面中中,双击定制的S-Function模块,会弹出定制的S- Function模块对话框,在所述的对话框中输入相应的参数后按OK确认即可。
综上所述,借助于本发明的上述技术方案,通过Simulink中搭建的系统模型经过 Embeded Coder工具创建过程后,会自动将生成的模型源代码下载到目标板中运行,全程不需要人为对源代码进行任何修改,真正实现了从系统模型到系统应用程序的一键式操作;同时,实验测试结果表明设计的MPC5644A的底层驱动,功能完全正确。因此,利用这种开发方式可以降低项目的开发成本、提高开发效率、缩短产品的上市周期,同时由于驱动模块程序的接口符合AutoSAR标准,这也大大提高了代码的通用性和移植性。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。