Simulink代码生成学习札记

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Simulink嵌入式代码生成资料第一章代码生成基础一、嵌入式程序的结构嵌入式程序结构包含:mainprogram主函数,modelapplication算法,runtimelibrary库函数,I/Odevicedrivers底层驱动,datalogginginterface数据记录接口,dataexchangeinterface与主机通信接口。MainProgramModelApplicationRun-timeLibraryDataloggingInterfaceDataexchangeInterfaceI/Odevicedrivers二、模型配置设置1.求解器设置模型必须为定步长离散求解器。快捷键Ctr+E。2.系统目标文件配置选择ert.tlc文件配置。3.代码生成报告配置Createcodegenerationreport:创建代码生成报告;Openreportautomatically:代码生成后自动打开报告;Code-to-model:点击代码高亮显示对应的模型;Generatemodelwebview:在同一窗口显示代码以及与之对应的模型;4.代码生成generatecodeonly:仅生成代码,不编译链接生成可执行文件。5.生成的代码模块ert_main.c文件:默认生成的主程序函数。model.c文件:模型算法,包含所有算法的入口。model.h文件:算法头文件,包含数据结构和模型入口点。model_private.h文件:模型和子系统的局部宏与局部数据。model_types.h文件:模型数据结构和参数数据结构预先声明。rtwtypes.h文件:定义数据类型、结构体和宏。model_data.c文件:声明模型参数数据结构和常量模块数据结构,只有在需要时生成此文件。6.生成的函数模块主程序函数,在ert_main.c文件中,main函数包含3个子函数,model_initialize函数,在执行model.c文件前执行,用于错误状态、外部输入/输出以及状态量的初始化,rt_onestep函数,被时间中断调用,并调用model.c文件中的model_step函数,model_terminate函数在执行终止时执行,用于执行有必要的终止任务。main主程序{model_initialize初始化函数{状态初始化代码}定时/中断服务程序代码(非自动代码生成需集成),重复调用rt_onestep函数rt_onestep{检测溢出标志位代码model_step模型算法函数{模型算法代码溢出标志位置零}}model_terminate{终止任务代码}}7.定义与声明信号模型信号,包含外部输入、外部输出以及模型的状态,定义为全局结构体。在model.h文件中定义信号结构体的类型(包含输入、输出、状态3个结构体);并在model.h中声明结构体,在model.c中定义信号所需的结构体。8.定义与声明参数模型参数,在model_types.h中定义参数类型,在model.h中声明参数结构体,也声明外部参数,在model_data.c中定义参数。9.数据结构体符号生成代码默认的数据类型名称与变量名称。ClassicShortenedDatatypenamingVariablenameDatatypenamingVariablenameModelRT_MODEL_modelmodel_MRT_MODEL_modelmodel_mParametersParameters_modelmodel_PP_modelmodel_pExternalInputsExternalnputs_modelmodel_UExtU_modelmodel_UExternalOutputsExteranlOutputs_modelmodel_YExtY_modelmodel_YBlockSignalsBlockIO_modelmodel_BB_modelmodel_BBlockStatesD_Work_modelmodel_DWorkDW_modelmodel_DW10.代码生成过程从模型生成中间过程文件model.rtw,需要计算仿真过程、模块参数,传播信号的宽度和采样时间,确定模块在模型中的执行顺序。从model.rtw生成C代码需要TLC目标语言编译器,加载系统目标文件ert.tlc和模型内模块的目标文件block.tlc。在模型配置中只生成代码(generatecodeonly:仅生成代码,不编译链接生成可执行文件),就不执行一下可执行代码的生成过程。SimulinkmodelCodegenerationinterpreterModel.rtwTargetLanguageCompiler(TLC)Model.cModel.hModel_private.hModel.mkMakemechanismModel.exeRun-timeinterfaceTokenexpansionTemplatemakefileModelComilationCodeGenerationCodeGenerationRetain.rtwfile在代码生成过程中保留中间过程文件model.rtw,该文件ASC文件。第二章外部代码集成外部代码集成两种方法:导入外部代码到生成的代码中,导出生成的代码到其他程序中。1.外部代码集成的进入点外部代码集成,调用代码生成了四个函数:model_inttialize初始化函数、model_step算法入口函数、model_teminate终止任务函数、rt_onestep函数。在手写代码调用该三个函数时,需要在手写代码中加入#includemodel.h指令。2.生成代码在外部IDE中集成Simulink模型生成的代码在外部集成开发环境中集成,不需要生成ert_main.c文件和model.bat文件。若将将模型代码在外部的IDE中集成,则不需要生成ert_main.C文件和model.bat文件。Generateanexamplemainprogram:代码生成过程中生成ert_main.c与model.bat文件。3.生成代码打包Packagecodeandartifacts:自动打包生成代码,生成一个zip格式的压缩文件。在代码生成路径下,并在命令窗口输入loadbuildInfo和packNGo(buildInfo)两个指令,展开查看压缩文件包内的文件。IncludecustomCcodeingenerated:将手写代码(包含源代码sourcefile、头文件headerfile、Initializefunction初始化函数或者Terminatefunction终止任务函数)插入生成的代码前面中。源代码(cfile/cppfile)插入在model.c文件的前端;头文件headerfile中的代码插入到model.h文件的前面;将手写的初始化代码和终止任务代码插入点代码生成相应的函数中。Includelistofadditional:将手写代码与生成的代码集成,用于后期的编译链接生成机器码或者可执行文件。4.使能mat文件数据记录MAT-filelogging:生成记录接口函数文件rt_logging.c,选中此项必须同时选择non-finitenumbers。生成的代码ert_main.c文件中增加调用rt_StopDataLogging函数接口。记录仿真的结构包含仿真时间、状态以及输出信号。故需要在savetoworkspace选项中至少选择一项,或者在至少有一个信号设置了logsignaldata。5.多个模型代码集成将多个模型生成的代码集成到一个project中,通过Sharedcodeplacement选择Sharedlocation将所有模型生成的代码放在同一路径下,即在sllprj\ert\sharedutils路径下生成代码集成所需的共享文件。第三章实时执行任务调度在嵌入式系统开发中,算法被定时或中断服务调度,即Simulink模型生成的算法model_step函数将被定时或中断服务调用。Simulink模型不同的模块计算速率可以不同,即一个model可以分割成多个不同速率的subsystem模块,确保每个subsystem模块按照预期指定的速率执行,需要速率调度实现,同时管理不同速率模块之间的数据交换的正确性和完整性。1.单速率执行Simulink模型中所有的模块计算速率相同,生成的代码按照代码执行的顺序执行以相同的速率计算。在模型窗口选择Display/Sampletime显示模块的计算更新速率,选择Display/Blocks/SortedExecutionorder显示模块执行顺序。整个模型的算法在model_step函数中,所有的模块对应的代码执行速率相同。main主程序{model_initialize初始化函数{状态初始化代码}定时/中断服务程序代码(非自动代码生成需集成),重复调用rt_onestep函数rt_onestep{检测溢出标志位代码model_step模型算法函数{模型算法代码溢出标志位置零}}model_terminate{终止任务代码}}2.多速率单任务执行含有不同速率模块的Simulink模型,根据模块的计算顺序和执行速率进行组合和任务调度。执行分多速率单任务执行和多速率多任务执行。在单任务执行过程中(如图所示B1、B2模块执行速率0.01,B4、B5执行速率0.03,B3执行速率0.05)是单线程执行,即以基速率进行计算(计算最快模块的速率),以相应的次速率更新计算相应的模块。所有模块的速率必须是基速率的整数倍。main主程序{model_initialize初始化函数{状态初始化代码}定时/中断服务程序代码(非自动代码生成需集成),重复调用rt_onestep函数rt_onestep{检测溢出标志位代码与其它错误model_step模型算法函数{执行基速率模块(速率最快的模块)判断Timing.TaskCounters.TID[1]==0{执行相对速率较快的模块}判断Timing.TaskCounters.TID[2]==0{执行相对速率较快的模块}…判断Timing.TaskCounters.TID[n]==0{执行相对速率最慢的模块}rate_scheduler{确定Timing.TaskCounters.TID值}溢出标志位置零}}model_terminate{终止任务代码}}3.多速率多任务执行多速率多任务执行,速率快的优先级高,具有抢占先机机制。将Taskingmodeforperiodicsampletimes设置为MultiTasking多任务模式,且将Automaticallyhandleratetransitionfordatatransfer勾选(或者手动添加速率转换模块),才能生成多任务代码。Higherpriorityvalueindicateshighertaskpriority表示优先级值越大优先级越高,反之值越小,优先级越高。任务标识符tid。main主程序{model_initialize初始化函数{状态初始化代码}定时/中断服务程序代码(非自动代码生成需集成),重复调用rt_onestep函数rt_onestep{检测溢出标志位代码model_step模型算法函数{初始化OverrunFlags、TaskCounter以及eventFlags/*检查基速率任务是否溢出*/if(OverrunFlags[0]){rtmSetErrorStatus(wrapper_mr_M,Overrun);return;}OverrunFlags[0]=true/*其它速率任务n表示任务数*/for(i=1;in;i++){if(taskCounter[i]==0){if(eventFlags[i]){OverrunFlags[0]=falseOverrunFlags[i]=true/*采样速率太快*/rtmSetErrorStatus(

1 / 22
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功