首页 Simulink代码生成学习札记

Simulink代码生成学习札记

举报
开通vip

Simulink代码生成学习札记Simulink嵌入式代码生成资料第一章代码生成基础一、嵌入式程序的结构嵌入式程序结构包含:mainprogram主函数,modelapplication算法,runtimelibrary库函数,I/Odevicedrivers底层驱动,datalogginginterface数据记录接口,dataexchangeinterface与主机通信接口。MainProgramModelApplicationRun-timeLibraryDataloggingInterfaceDataexchangeInterfaceI/...

Simulink代码生成学习札记
Simulink嵌入式代码生成资料第一章代码生成基础一、嵌入式程序的结构嵌入式程序结构包含:mainprogram主函数,modelapplication算法,runtimelibrary库函数,I/Odevicedrivers底层驱动,datalogginginterface数据记录接口,dataexchangeinterface与主机通信接口。MainProgramModelApplicationRun-timeLibraryDataloggingInterfaceDataexchangeInterfaceI/Odevicedrivers二、模型配置设置1.求解器设置模型必须为定步长离散求解器。快捷键Ctr+E。2.系统目标文件配置选择ert.tlc文件配置。3.代码生成 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 配置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;i<n;i++){if(taskCounter[i]==0){if(eventFlags[i]){OverrunFlags[0]=falseOverrunFlags[i]=true/*采样速率太快*/rtmSetErrorStatus(wrapper_mr_M,"Overrun");return;}eventFlags[i]=true}}taskCounter[1]++if(taskCounter[1]==3){taskCounter[1]=0}taskCounter[2]++if(taskCounter[2]==5){taskCounter[2]=0}/*设置基速率任务输入*//*计算基速率任务*/wrapper_mr_step0Checkforbase-rateinterruptoverrunEnablert_OneStepinterruptDeterminewhichratesneedtorunthistimesetpCallbase-ratetimestepcode,model_step0Checkforbase-rateinterruptoverrunCallsub-ratetimestepcode,model_stepNCheckforsub-rateoverrun/*获取基速率任务的输出*//*基速率任务完成*/OverrunFlags[0]=false/*计算次任务*/for(i=1;i<n;i++){if(OverrunFlags[i]){return;}if(eventFlags[i]){OverrunFlags[i]=true/*设置次任务i的输入*/switch(i){case1:wrapper_mr_step1/*获取输出*/breakcase2:wrapper_mr_step2/*获取输出*/break;…default:break;}OverrunFlags[i]=falseeventFlags[i]=false}}}}model_terminate{终止任务代码}}4.速率转换操作在多任务调度中,不同速率但相互关联的模块之间数据需要有适当保护,即对模块之间的共享数据通过缓存buffer,并进行保护,防止模块之间的数据发生潜在的错误。优先级高(速率快的)任务计算结果写入buffer,优先级低的任务通过读取buffer的数据,获取优先级高的模块计算结果。Ensuredataintegrityduringdatatransfer:确保数据传递的完整性。若没有此项,优先级低的任务会被优先级高的任务中断,等再计算优先级低的任务时,原buffer中的数据被优先级高的任务计算的新结果覆盖。导致优先级低的任务在一次完整的计算过程中,前后数据不一致。该选项的作用在代码中增加buffer保护,即高优先级任务向buffer写入数后,等到低优先级任务完成之后方可在向buffer写入新的数据。Ensuredeterministicdatatransfer(maximumdelay):在确保数据传递的完整性基础上,确保数据传递的确定性。即高优先级任务的数据写入和低优先级任务的数据读取在一个sample内完成。在代码生成中,除了overrunFlag、eventFlags以及taskCounters三个全局标志外在model_step0、model_step1、…model_step(N-1)(N表示任务数)函数中各一个rateInteraction标志用于向低速率任务计算所需的数据buffer写入数据。1step(t=0)Model_step0();taskCounter[1]=0taskCounter[2]=0eventFlags[1]=TRUE;Model_step1();eventFlags[2]=TRUE;Model_step2();2step(t=0.01)Model_step0();taskCounter[1]=1taskCounter[2]=1eventFlags[1]=FAULSE;eventFlags[2]=FAULSE;3step(t=0.02)Model_step0();taskCounter[1]=2taskCounter[2]=2eventFlags[1]=FAULSE;eventFlags[2]=FAULSE;4step(t=0.03)Model_step0();taskCounter[1]=3taskCounter[2]=3taskCounter[1]=0eventFlags[1]=TRUE;Model_step1();eventFlags[2]=FAULSE;5step(t=0.04)Model_step0();taskCounter[1]=1taskCounter[2]=4eventFlags[1]=FAULSE;eventFlags[2]=FAULSE;6step(t=0.05)Model_step0();taskCounter[1]=2taskCounter[2]=5eventFlags[1]=FAULSE;taskCounter[1]=0eventFlags[2]=TRUE;Model_step2();5.实时执行 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf ModelStepFunctionSingleratevoidmodel_step(void);Multiratesingle-taskingvoidmodel_step(void);Multiratemulti-taskingvoidmodel_stepN(void);TaskIdentifiersRateSchedulingRateInteractionsMultiratesingle-taskingrate_scheduleriscalledfrommodel_steptoincrementtidmodel_stepusestidtorunsubratesmodel_stepusestidtomaintainrateinteractionusingbuffersMultiratemulti-taskingtaskCounterisincrementedinrt_OneStep();rt_OneStepmaintainstaskcountersandcallsmodel_stepNintherightordermodel_stepNusestidtomaintainrateinteractionusingbuffers第四章函数原型控制EmbeddedCoder允许自定义设置ERT-based模型生成的函数原型(针对ERT-based模型),有利于生成的代码集成到其它project中,并且函数名和函数原型与指定要求的一致。默认情况ERT-based模型生成的代码所有的函数原型为:voidfunction_name(void),例如voidmodel_step(void),这种配置导致模型中所有输入和输出信号作为非内联参数,并在生成的函数中以全局数据结构体存储。EmbeddedCoder允许修改model_step和model_initialize函数的函数名称以及model_step函数的输入输出信号传递的方式。1.修改函数原型ConfigureModelFunctions:配置模型的函数,点击弹出新的窗口设置函数接口,默认为Defaultmodelinitializeandstepfunctions,需选择ModelspecificCprototype。GetDefaultConfiguration:激活并初始Initialize函数与modelStep函数的名称,同时显示配置界面。利用该界面修改Initialize函数与modelStep函数的名称,同时配置modelStep函数的输入输出参数的类型与名称。当modelStep函数的输入输出变量不在是全局变量,在model.h文件中不再有extern声明该函数对应模型的输入输出信号。ArgumentName:指定model_step函数输入输出变量的名称,Category:选择输入输出变量的类型,默认情况标量变量为Value,非标量为Pointer。(当输入输出变量为矢量时,必须选择指针型)2.函数原型的局限性函数原型控制只支持modelstep函数和initializatize函数。Singleoutput/updatefunction:表示模型中的模块的output代码与update代码合并model_step函数中,若不勾选生成的代码中将有model_output函数和model_update函数替代model_step函数,因此此项必须勾选。函数原型控制不支持多速率多任务模型,支持多速率单任务模型。更多局限性查阅:EmbeddedCoderCodeGenerationfromSimulinkModelsData,function,andfileDefinitionFunctionandClassInterfacesControlGenerationofFunctionPrototypesFunctionPrototypeControlLimitation.若里哟个函数原型控制实现模型中的subsystem模块进行代码生成和修改,可查阅:EmbeddedCoderCodeGenerationfromSimulinkModelsData,function,andfileDefinitionFunctionandClassInterfacesControlGenerationofFunctionPrototypesConfigureFunctionPrototypesProgrammatically.3.可复用的函数接口在project中,当模型的model_step函数需要多次调用时,model_step函数的输入输出变量将不再为全局变量。可以通过上述ConfigureModelFunction选择ModelspecificCprototype实现,也可以通过Codeinterfacepackaging选择Reusablefunction实现。采用Reusablefunction方式前,需将ConfigureModelFunction设置为Defaultmodelinitializeandstepfunctions。该方式可以取消勾选Singleoutput/updatefunction,若取消,将不再生成model_step函数,而被model_output函数和model_update函数代替。Usedynamicmemoryallocationformodelinitialization:在model.c文件中生成配置函数(memset与memcpy),只有选择了Reusablefunction才可选择。为每一个案例(每一个复用的函数成为一个案例)动态分配数据。Passroot-levelI/Oas:三种方式Individualarguments,Structurereference,Partofmodeldatastructure。4.两种方法的区别ConfigureModelFunction用于无状态模型(该方法函数传递只有输入、输出参数,不能传递状态,故有状态的模型不能通过该方法生成复用函数);Codeinterfacepackaging通常用于有状态模型,除了传递输入、输出参数外,还传递模型的状态。第五章生成代码优化利用EmbeddedCoder开发嵌入式系统程序需要考虑应用程序的调试、回溯、效率(包含RAM、ROM)以及安全。Simulink模型参数配置Sover,DataImport/Export,Optimization,Diagnostics以及CodeGeneration的设置均会影响代码的生成。部分影响如下表,更多设置查看SimulinkCoderConfigurationConfigurationParameterBasicsParamterReference。ConfigurationParamterSettingforBuildingCodeFactroyDefaultDebugingTraceabilityEfficiencySafetyprecutionStandardmathlibraryNoimpactNoimpactValidlibrayNoimpactC89/90(ANSI)CodereplacementlibraryNoimpactNoimpactValidlibraryNoimpactNoneSharedCodeplacemnetSharedlocation(GRT)NoimpactERTSharedlocation(GRT)NoimpactERTNoimpact(execution,RAM)Sharedlocation(ROM)NoimpactAutoSupportnon-finitenumbersNoimpactNoimpactOff(Execution,ROM)Noimpact(RAM)OffOnCodeinterfacepackagingNoimpactNoimpactReusablefunctionorC++classNoimpactNonreusablefunctionifLanguateisSelfC;C++classifLanguageisSelftoC++Multi-instancecodeerrordiagnosticWarningorErrorNoimpactNoneNoimpactError1.静态代码度量Staticcodemetrics:生成代码报告时,生成静态代码度量报告,观察不同的配置选项对生成代码的影响。通过该方式可以对比优化前后的代码长度,全部变量的存储大小、计算堆栈的大小以及输出函数堆栈的大小。2.移除非必须代码移除非必需代码优化代码生成包括:数据的初始化代码、终止任务代码、整数包装代码、算术异常处理以及不必要的模块等代码。2.1移除初始化代码RemoverootlevelI/Ozeroinitialization:移除模型顶层输入、输出初始值为0的初始化代码;Removeinternaldatazeroinitialization:移除模型内部初始值为0的初始化代码。(在绝大多数嵌入式系统中,上电后RAM的值为0,故生成初始值为0的初始化代码是多余的)Usememsettoinitializefloatsanddoubleto0.0:利用memset清除浮点数零,用整数0表示(在编译器和CPU支持用整数0描述浮点数零时,利用该方法提高代码的执行效率和ROM空间)。若不勾选则初始化代码明确指明用0.0存储浮点数零;Optimizeinitializationcodeformodelreference:禁止初始化含有状态模块的初始状态,除非该模块具有重置状态的功能。2.2移除终止任务代码Terminatefunctionrequired:生成终止函数voidmodel_terminate,取消勾选将不再生成该函数。(终止任务在系统掉电时运行,当程序无限运行时,不需要该任务)2.3移除不必要的数据支持默认情况,生成代码支持浮点数、复数以及无穷大数。Float-pointnumbers:支持浮点数,当生成代码只支持整数时,需取消勾选此项;non-finitenumbers:支持无穷大,选择此项必须先选择支持浮点数;absolutetime:模型中,某模块需要绝对时间或经历时间(例如两个时间的时间间隔),默认情况生成代码中提供整数计数器。勾选该项,则支持绝对时间;continoustime:支持连续时间模块,默认情况不勾选此项。若取消勾选此项,且模型中含有连续运算模块,将在代码生成时报错。取消勾选上述项,可提高代码的效率。2.4MAT文件记录MAT-filelogging:控制信号的记录,在嵌入式程序中不支持文件系统,须取消勾选此项。(文件记录需要支持float-pointnumbers和non-finitenumbers)。2.5条件语句条件分支执行Conditionalinputbranchexecution:只对switch模块进行优化。若不勾选则每一个计算部长都需要先计算所有驱动switch模块的输入信号(包含满足条件与不满足条件的信号)。这保证了代码执行时间的一致确定性,但降低了代码的执行效率,勾选此项则只计算满足条件的输入。勾选该选项将影响simulink模块和生成代码的执行顺序。2.6优化数据存储Signalstoragereuse:实现Simulink模型的输出信号存储复用。取消勾选此项,所有模块的输出信号均为全局变量且唯一,这将消耗RAM和ROM。勾选此项,将激活其它5项。Enablelocalblockoutputs:将模块的输出信号在函数内部(例如model_step)定义为局部变量替代全局变量。Reuselocalblockoutputs:在Enablelocalblockoutputs的基础上,将函数内部的局部变量(模块的输出信号)的存储复用,否则每个局部变量的存储时唯一。Eliminatesuperfluouslocalvariables(expression):在Reuselocalblockoutputs的基础上,减少中间计算过程。可将多个计算模块高度简化成一行代码(一句表达式)。Useglobaltoholdtemoraryresults:函数输出的全局变量(函数最终输出信号)替代函数内部的局部变量(计算过程的中间输出信号);Reuseglobalblockoutputs:在用全局变量替代全局变的基础上,并将该全局变量复用。Minimizeglobaldataaccess:与Reuseglobalblockoutputs组合减少全局变量的数量。3.内联参数Inlineparameters:控制数学模块的参数在生成代码中的显示,勾选此项,模型的参数将在代码中以常值替代变量,不可调试(标定)。可通过configuration配置调试(标定)参数。4.减少模块Blockreduction:控制压缩多个模块至一个效率更高的模块,或者删掉。删除无效的数据类型转换模块,排除无用的模块和信号。5.布尔逻辑ImplementlogicsignalsasBooleandata(double):通过逻辑信号存储为布尔型,减小信号存储的开销。取消勾选则逻辑信号以double型存储。6.移除数据类型转换包装代码若模型中还有定点元素,在嵌入式代码生成时,需要有额外的包装代码模拟定点处理器的计算过程,确保发生数据溢出时,确保生成代码运行的结果与模型仿真的结果一致。Removecodefromfloating-pointtointegerconversionsthatwrapsout-ofrangevalues:移除模型中浮点数据向整数或定点数据转化的额外包装代码,缩减代码长度、提高执行效率。当模型中的模块输出或者参数引用了浮点转整数或定点,且模块的Saturateonintegeroverflow取消勾选时,选择该选项有效。(模块的Saturateonintegeroverflow选项优先于全局优化选项)7.异常处理EmbeddedCoder可以生成代码保护dividebyzero错误。即当发生除以0时,定点数据取其最大值作为计算的结果。Removecodethatprotectsagainstdivisionarithmeticexception:勾选移除保护,生成代码的计算结果与仿真的结果将不一致。8.代码生成优化目标配置EmobeddedCoder具有检查模型优化设置,可以通过SetObjectives配置不同的目标:包含执行效率、ROM、RAM、代码安全、调试、MISRA标准、Polyspace代码运行时静态检查。根据选择的目标进行优化代码。可以对优化目标进行优先级排列。CheckModelConfigurationsettingagainstcodegenerationobjectives:检查模型、模块的设置是否与优化的目标一致,并指导修改设置。9.嵌入式代码快速启动在MATLAB2016版本增加了EmbeddedCoderQuickStart功能,可以实现快速配置所有的选项用于生产最优代码。(该功能是一种导航的方式配置)第六章自定义数据特征Simulnk模块的数据包含三大块:信号signals、参数parameters和状态states。数据的特征通过两大属性控制:数据类型和存储方式。数据类型主要:数据的长度、范围和和精度;存储方式:包含外部、内部、全局和局部。1.数据类型分类数据类型分:内嵌浮点型(双精度64bit、单精度32bit);内嵌整型(有符号int32、int16、int8;无符号uint32、uint16、uint8、boolean);定点型(scalablesfix、ufix;fixed-scalesfrac、ufrac)。1.1信号数据类型Simulink模型信号的数据类型可以:指定任何模块输出信号的数据类型;自动通过内部计算 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf 决定;从其它模块信号继承或回传。1.2状态数据类型Simulink状态数据的数据类型只能通过从其它模块信号继承或回传获取。1.3参数数据类型Simulink模型参数的数据类型,可以:指定参数的数据类型;根据内部规则确定;继承或反回传方式获取;继承workspace中变量。模型中信号与参数数据类型传播规则:Inheritviainternalrule:根据内部规则;sameasinput:模块的参数或输出信号的数据类型与输入信号的数据类型一致;Inheritviabackpropagation:与模块输出端口相连的模块类型一致;Inheritfrom‘Constantvalue’:输出信号与MATLAB的workspace中的变量一致。通过菜单DisplaySignals&PortsStorageClass显示信号的数据类型。2.Simulink存储类型在EmbeddedCoder代码生成过程中数据存储方式详细指明了信号、可调参数以及模块状态的声明、存储以及在代码中的表征。下表为不同存储方式的应用范围。StorageClassScopeUsageTemporaryLocalvariableReusedandfoldedifapplicableSimulinkglobalGlobalstructureVisibletoexeternalcodeExportedglobalGlobalvariableSharedwithexternalcodeImportedexternMemoryallocatedexternallyimportedasglobalvariablesImportedexternpointerMemoryallocatedexternallyImportedasglobalpointersCustomCustomizedCustomizedSimulink模型默认的存储数据类型与标识符。默认情况,参数存储在全局变量结构体P,在model_data.c中给出值,输入、输出信号分别存储在全局结构体U与Y中。StorageDefaultStorageClassStructureorPrefixIdentifierField/VariableNamedAfterBlockSignalsTemporaryorSimulinkGlobalrtbiftemporary,BifglobalSignalororiginblockifnosignallabelExternalInputsSimulinkGlobalUSignalorinportblockifnosignallabelExternalOuputsSimulinkGlobalYOutportblockBlockStatesSimulinkGlobalDWorkorDWStateorblockifnostatenameBlockParametersSimulinkGlobalPBlockandparameter3.设置信号的存储方式当模型的输入信号是一个较大的数组时,通常采用指针的方式,通过信号线右击PropertiesCodeGeneration配置代码生成。设置为ImportedExternPointer将在model_private.h文件中声明为外部指针,且变量的名称是独一无二的。在生成函数的外部定义和声明输入数据,将减少代码的存储开始,可以通过staticmetricsreport查看。当手写代码需要利用模型的输出信号监视或其他作用时,将输出信号定义为ExprotedGlobal存储方式,生成的代码在model.h文件中声明,输出信号的名称也是独一无二的。4.信号存储方式总结IntermediateBlockI/OAutoTestpointExprortedGlobalImportedExternCustomLocalSimulinkGlobalSimulinkGlobalLocal:用于Reusableandreduce减少模块和信号复用。ExternalI/OAutoExportedGlobalImportedExternCustomSimulinkGlobal5.设置状态的存储方式默认情况Simulink状态的存储方式为SimulinkGlobal,在生成的代码中,状态封装存储在DWork结构体中。结构体为model_DWork,若没有指明状态的名称则默认为model_DWork.blockname。在指定状态的存储方式时,必须先确定状态的名称。生成的代码名称为model_DWork.statename。6.设置参数的存储方式参数的存储方式,必须通过OptimizationSignalsandParametersConfigure控件设置。设置为可调参数时,可以控制参数是否存储在model_P结构体中,还是一个单独的全局变量。存储方式决定了生成嵌入式代码的声明,Storagetypequalifier包含const和volatile两种,包含在参数的声明中。在生成的代码中,model_private.h文件声明参数为extern变量时,需要提供适当的变量定义和初始化。7.参数存储类型总计ParameterAutoTunableConstantSimulinkGlobalSimulnkGlobalExportedGlobalImportedExternCustomLiteralMacroPooledifapplicable8.存储类型的符号8.1信号StorageClassSymbolTemporaryrtb_ySimulinkGlobalmodel_B.yExportedGlobalyImportedExternyImportedExternPointer(*y)8.2状态StorageClassSymbolSimulinkGlobalmodel_DWork.blockNameDStateExportedGlobalstateNameImportedExternstateNameImportedExternPointer(*stateName)8.3参数StorageClassSymbolNoglobaltunableparameters(default)model_P.a1InlinedparametersonvalueofvaraiableSimulinkGlobal(tuneable)model_p.a1ExportedGlobal(tuneable)a1ImportedExtern(tuneable)a1ImportedExternPointer(tuneable)(*a1)第七章自定义数据对象的数据特征为了增加模型的可读性,将模型与模型的数据属性分开。数据属性包含:名称、数值、数据类型、存储方式、单位以及范围。Simulink模型可以通过模块的参数和信号设置数据属性,也可以通过数据对象设置。1.Simulink数据类型利用simulink数据类型对象创建自定义类型,通过修改数据类型对象修改模型。Simulink包含三种数据类型对象:Simulink.NumerticType指定变量的类型包含定点、浮点、布尔;Simulink.AliasType给嵌入式数据类型提供别名;Simulink.Bus创建结构体。2.信号与参数数据对象的类型可以通过命令创建参数:param=Simulink.Parameter3.自定义数据类型对象EmbeddedCoder支持用户自定义数据类型,在不修改模型的情况下重新配置模型的参数和变量。有两种方式:Simulink.AliasType支持内嵌所有类型,Simulink.NumericType支持定点类型,但不支持内嵌整型。Simulink.AliasType命令创建方式:objectName=Simulink.AliasTypeSimulink.NumericType命令创建方式:IOType=Simulink.NumericTypeIOType.DataTypeMode=‘Fixed-point:binarypoiontscaling’IOType.WordLength=16IOType.FractionLength=9或者IOType=fixdt(1,16,9)必须指明别名在生成的代码中可用IOType.IsAlias=true指定声明的头文件IOType.HeaderFile=’filtertypes.h’4.自定义存储方式EmbeddedCoder提供了写内嵌数据存储方式,也支持自定义存储方式。Ignorecustomstorageclasses:忽略自定义存储方式,在model中设置了自定义存储方式,需要取消此项勾选。在生成的代码中model.h文件声存储方式,在model.c中定义数据。信号:创建信号设置信号,勾选Signalnamemustresolvetosimulinksignalobject,在工作空间或者模型空间创建与信号名称相同的信号数据对象。状态:在模块状态窗口创建状态名称,勾选SstatenamemustresolvetoSimulinksignalobject在工作空间或模型空间创建名称相同的信号数据对象。参数:删除模型中参数对应的matlab变量,在工作空间或模型空间中创建参数数据对象。若减小内存开销可以通过内联或者将参数对象的存储方式设置为Define方式(在生成的model.h文件中利用#define声明)。5.数据对象命名规则NoneForcelowercaseForeuppercaseCustomM-function6.数据类型名称设置内嵌数据类型的别名7.识别符控制$R-rootmodel$N-objectname$M-namemanglingstring$F-methodname(onlyforsubsystem)$H-systemhierarchylevel$A-datatypeacronym8.数据字典利用workspace不便管理多个model的数据(导致覆盖)。利用扩展为sldd文件管理,该文件包含model中的参数、信号以及状态所需的数据对象,也包含model的配置信息。(数据字典只可以替换workspace中数据对象,不可以替换模型空间的数据对象)(1)连接模型与数据字典在模型属性中的data栏中指定或者创建数据字典(2)连接模型配置到数据字典Copy现有的配置放到数据字典内,将模型中的配置转换为reference(利用弹出式菜单选择converttoconfigurationreference)(3)数据字典配置一个model可以配置多个数据字典在modelexplorer中通过文件菜单创建新的数据字典,或者通过copy和paste的方式。然后通过model属性选择不同的数据字典文件实现一个model多个数据字典的切换。
本文档为【Simulink代码生成学习札记】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
绘画的问号
暂无简介~
格式:pdf
大小:1MB
软件:PDF阅读器
页数:0
分类:高中语文
上传时间:2020-03-09
浏览量:0