www.gusucode.com > rtw 工具箱matlab源码程序 > rtw/rtwconfiguremodel.m

    function rtwconfiguremodel(varargin)
% RTWCONFIGUREMODEL - Configure a model for a Simulink Coder
% application.  
% 
% args{1}   - Name or handle of the model
% args{2}   - Operating mode
% args{3:N} - optional argument/value list: acceptable arguments
%  
% fxpMode   - 'fixed'   : configure for fixed-point
%             'floating': configure for floating-point
%             'noop'    : don't change relevant fixed/float settings
% forGRT    - true/false: Configure for GRT
% optimized - true/false: optimized or debug
% forDSP    - true/false: requires DSP support (i.e., complex)
%

% Copyright 1994-2013 The MathWorks, Inc.


  % Sanity check
  if nargin < 2
      DAStudio.error('RTW:utility:invalidArgCount',...
                     'rtwconfiguremodel','at least two');
  end

  model = varargin{1};
  % the first argument must be a valid model
  if ishandle(model)
      if ~isequal(get_param(model, 'Type'), 'block_diagram') || ...
              ~isequal(get_param(model, 'BlockDiagramType'), 'model')
          DAStudio.error('RTW:targetSpecific:rtwconfiguremodelInvalidArgs');
      end
  elseif ischar(model)
      if isempty(find_system(model, 'type', 'block_diagram')) || ...
              ~isequal(get_param(model, 'BlockDiagramType'), 'model')
          DAStudio.error('RTW:targetSpecific:rtwconfiguremodelInvalidArgs');
      end
  else
      DAStudio.error('RTW:targetSpecific:rtwconfiguremodelInvalidArgs');
  end
  
  % default values for other settings
  fxpMode   = 'noop';
  forGRT    = true;
  optimized = true;
  isDSP     = true;
  nonFiniteOption = false;

  mode = varargin{2};
  switch mode
   case 'ERT (optimized for fixed-point)'
    fxpMode = 'fixed';
    forGRT = false;
    optimized = true;
    
   case 'ERT (optimized for floating-point)'
    fxpMode = 'floating';
    forGRT = false;
    optimized = true;
    
   case 'GRT (optimized for fixed/floating-point)'
    fxpMode = 'noop';
    forGRT = true;
    optimized = true;
    
   case 'GRT (debug for fixed/floating-point)'
    fxpMode = 'noop';
    forGRT = true;
    optimized = false;

   case 'Specified'
    i = 3;
    while i < nargin
      var = varargin{i};
      setting = varargin{i+1};
      if isequal(var, 'fxpMode')
        fxpMode = setting;
      elseif isequal(var, 'forGRT')
        forGRT = setting;
      elseif isequal(var, 'optimized')
        optimized = setting;
      elseif isequal(var, 'forDSP')
        isDSP = setting;
      elseif isequal(var, 'nonFinites')
        nonFiniteOption = true;
        nonFinites = setting;
      end
      i = i + 2;
    end
    
    otherwise
     assertMsg = 'Internal error: unrecognized configuration mode'; 
     assert(false,assertMsg); 
  end

  % Obtain the active configuration set
  
  cs = getActiveConfigSet(model);

  % Cache original location for utility files since switching targets resets it to auto
  origUtilityFuncGeneration = get_param(cs,'UtilityFuncGeneration');
  
  % Select appropriate code generation system target file
  
  if forGRT
    stf = 'grt.tlc';
  else
    stf = 'ert.tlc';
  end
      
  % Switch to the appropriate target
  
  switchTarget(cs,stf,[]);

  % turn off 'CheckMdlBeforeBuild' option
  cs.set_param('CheckMdlBeforeBuild', 0);
  
  isERT = strcmp(get_param(cs,'IsERTTarget'),'on');
  
  % TLC command line options
  
  %set_param(cs,'TLCOptions','-p0');
  
  % Solver options
  
  %set_param(cs,'SolverType','Fixed-step');        % Type
  %set_param(cs,'Solver','FixedStepDiscrete');     % Solver
  %set_param(cs,'SolverMode','Auto');              % Tasking mode for periodic sample times
  %set_param(cs,'AutoInsertRateTranBlk','on');     % Automatically handle data transfers
                                                   % between tasks (on Solver page)
  %set_param(cs,'InsertRTBMode', 'Deterministic'); % Specify the mode for auto inserted Rate 
                                                   % Transition blocks 

  % Optimizations

  if optimized
    set_param(cs,'BlockReduction','on');               % Block reduction optimization
    set_param(cs,'ConditionallyExecuteInputs','on');   % Conditional input branch execution
    set_param(cs,'InlineParams','on');                 % Inline parameters
    set_param(cs,'BooleanDataType','on');              % Implement logic signals a boolean data
    set_param(cs,'OptimizeBlockIOStorage','on');       % Signal storage reuse
    set_param(cs,'LocalBlockOutputs','on');            % Enable local block outputs
    set_param(cs,'BufferReuse','on');                  % Reuse block outputs
    set_param(cs,'ExpressionFolding','on');            % Eliminate superfluous temporary variables
    set_param(cs,'RollThreshold',5);                   % Loop unrolling threshold
    set_param(cs,'InlineInvariantSignals','on');       % Compute and inline invariant signals in the
                                                       % code
    set_param(cs,'StateBitsets','on');                 % Use bitsets for storing state configuration
                                                       % (Stateflow)
    set_param(cs,'DataBitsets','on');                  % Use bitsets for storing boolean data
                                                       % (Stateflow)
    set_param(cs,'UseTempVars','on');                  % Minimize array reads using temporary
                                                       % variables (Stateflow)
    set_param(cs,'FoldNonRolledExpr','on');            % Non-UI
    %set_param(cs, 'OptimizeModelRefInitCode', 'on');  % Suppress initialization code of a Model
                                                       % block when initialization code is superfluous
                                                       % in its parent's context.
    set_param(cs,'EfficientMapNaN2IntZero','on');      % check NaN, if it is NaN, set it to zero (R2008b)
    set_param(cs,'EnableMemcpy','on');                 % enable memory copy (R2008b)
    
    if isERT
      set_param(cs,'ZeroExternalMemoryAtStartup','off'); % Remove root level I/O zero initialization
                                                         % (NOTE: inverted logic from UI)
      set_param(cs,'ZeroInternalMemoryAtStartup','off'); % Remove internal state zero initialization
                                                         % (NOTE: inverted logic from UI)
      set_param(cs,'InitFltsAndDblsToZero','off');       % Use memset to initialize floats and double
      set_param(cs,'InlinedParameterPlacement',...       % Parameter structure
                   'NonHierarchical');                   
      set_param(cs,'NoFixptDivByZeroProtection','on');  % Remove code that protects against division 
                                                        % arithmetic exceptions
      set_param(cs, 'IncludeERTFirstTime', 'off');      % Non-UI
    end
    set_param(cs,'EfficientFloat2IntCast','on');        % Remove code from floating-point to integer 
                                                        % conversions that wraps out-of-range values
  else
    set_param(cs,'BlockReduction','off');               % Block reduction optimization
    set_param(cs,'ConditionallyExecuteInputs','off');   % Conditional input branch execution
    set_param(cs,'InlineInvariantSignals','off');       % Inline invariant signals
    set_param(cs,'InlineParams','off');                 % Inline parameters
    set_param(cs,'OptimizeBlockIOStorage','off');       % Signal storage reuse
                                                        % to 0.0 (NOTE: inverted logic from UI)
    set_param(cs,'StateBitsets','off');                 % Use bitsets for storing state configuration
                                                        % (Stateflow)
    set_param(cs,'DataBitsets','off');                  % Use bitsets for storing boolean data
                                                        % (Stateflow)
    set_param(cs,'UseTempVars','off');                  % Minimize array reads using temporary
                                                        % variables (Stateflow)
    set_param(cs,'FoldNonRolledExpr','off');            % Non-UI

    set_param(cs,'EfficientMapNaN2IntZero','off');      % check NaN, if it is NaN, set it to zero (R2008b)
    set_param(cs,'EnableMemcpy','off');                 % enable memory copy (R2008b)
  
    if isERT
      set_param(cs,'ZeroExternalMemoryAtStartup','on'); % Remove root level I/O zero initialization
                                                        % (NOTE: inverted logic from UI)
      set_param(cs,'ZeroInternalMemoryAtStartup','on'); % Remove internal state zero initialization
                                                        % (NOTE: inverted logic from UI)
      set_param(cs,'InitFltsAndDblsToZero','on');       % Use memset to initialize floats and double
      set_param(cs,'InlinedParameterPlacement',...      % Parameter structure
                   'Hierarchical');                   
      set_param(cs,'NoFixptDivByZeroProtection','off')  % Remove code that protects against division 
                                                        % arithmetic exceptions
    end
    set_param(cs,'EfficientFloat2IntCast','off');       % Remove code from floating-point to integer 
                                                        % conversions that wraps out-of-range values
  end

  % Hardware Implementation
  %
  % Use whatever is the default for this point in time, customizing as necessary.
      
  % Report
  
  set_param(cs,'GenerateReport','on');             % Generate HTML report
  set_param(cs,'LaunchReport','on');               % Launch report
  
  if ~strcmpi(get_param(cs,'CPPClassGenCompliant'),'on')
      if strcmpi(get_param(cs,'IsCPPClassGenMode'),'on')
          switch lower(get_param(hModel,'cacheMultiInstanceERTCode'))
            case 'off'
              set_param(model,'CodeInterfacePackaging','Nonreusable function');
            otherwise
              set_param(model,'CodeInterfacePackaging','Reusable function');
          end
      end
  end
  
  if isERT
    set_param(cs,'IncludeHyperlinkInReport','on'); % Code-to-block navigation
    set_param(cs,'GenerateTraceInfo','on');        % Block-to-code navigation
    set_param(cs,'GenerateTraceReport','on');      % Report eliminated / virtual blocks
    set_param(cs,'GenerateTraceReportSl','on');    % Report traceable Simulink blocks
    set_param(cs,'GenerateTraceReportSf','on');    % Report traceable Stateflow objects
    set_param(cs,'GenerateTraceReportEml','on');   % Report Embedded MATLAB functions 
  end
  
  % Comments
  
  set_param(cs,'GenerateComments','on');         % Include comments
  set_param(cs,'SimulinkBlockComments','on');    % Simulink block comments
  set_param(cs,'ShowEliminatedStatement','off'); % Show eliminated statements
  set_param(cs,'ForceParamTrailComments','on');  % Verbose comments for SimulinkGlobal
                                                 % storage class
  if isERT
    set_param(cs,'InsertBlockDesc','on');        % Simulink block descriptions
    set_param(cs,'SimulinkDataObjDesc','on');    % Simulink data object descriptions
    %set_param(cs,'EnableCustomComments','off'); % Custom comments (MPT objects only)
  end
  
  % Symbols
  
  %set_param(cs,'MaxIdLength',31);                     % Maximum identifier length
  if isERT
    set_param(cs,'MangleLength',1);                    % Minimum mangling length for ids
    set_param(cs,'CustomSymbolStrGlobalVar','rt$N$M'); % Symbol format for global variables
    set_param(cs, 'CustomSymbolStrType', '$N$M');      % Symbol format for global types
    set_param(cs, 'CustomSymbolStrField', '$N$M');     % Symbol format for field name of types
    set_param(cs, 'CustomSymbolStrFcn', '$N$M$F');     % Symbol format for subsystem methods
    set_param(cs, 'CustomSymbolStrTmpVar', '$N$M');    % Symbol format for temporary variables
    set_param(cs, 'CustomSymbolStrBlkIO', 'rtb_$N$M'); % Symbol format for local block output variables
    set_param(cs, 'CustomSymbolStrMacro', '$N$M');     % Symbol format for macros
    set_param(cs,'InlinedPrmAccess','Literals');       % Generate scalar inlined parameters as literals
    if ~strcmp(get_param(cs,'IsCPPClassGenMode'),'on')
        set_param(cs,'IgnoreCustomStorageClasses','off');  % Ignore custom storage classes
    end
    %set_param(cs,'DefineNamingRule','None');          % #define naming
    %set_param(cs,'ParamNamingRule','None');           % Parameter naming
    %set_param(cs,'SignalNamingRule','None');          % Signal naming
  end
  
  % Software Environment
  
  %set_param(cs,'CodeReplacementLibrary','ISO_C');  % Code replacement library
  
  if isERT
    if strcmp(fxpMode,'fixed')
      set_param(cs,'PurelyIntegerCode','on');       % Floating point numbers (Note: inverted
                                                    % logic from UI)
    % set_param(cs, 'UseIntDivNetSlope', 'on');     % Use integer division to handle net slopes 
                                                    % that are reciprocals of integers                                                   
    elseif strcmp(fxpMode,'floating')
      set_param(cs,'PurelyIntegerCode','off');      % Floating point numbers (Note: inverted
                                                    % logic from UI)
    end
    if nonFiniteOption
      if nonFinites
        set_param(cs,'SupportNonFinite','on');      % Non-finite numbers
      else
        set_param(cs,'SupportNonFinite','off');
      end
    end
    if isDSP
      set_param(cs,'SupportComplex','on');          % Complex numbers
    else
      set_param(cs,'SupportComplex','off');
    end
    %set_param(cs,'SupportAbsoluteTime','off');       % Absolute time
    %set_param(cs,'SupportContinuousTime','off');     % Continuous time
    %set_param(cs,'SupportNonInlinedSFcns','off');    % Non-inlined S-Functions
    %set_param(cs,'LifeSpan','1');                    % Application lifespan (days)
    
    %set_param(cs,'EnableUserReplacementTypes','on'); % Replace data type
                                                      % names in the generated code                                  
    % replacementName.double  = 'F64';
    % replacementName.single  = 'F32';
    % replacementName.int32   = 'S32';
    % replacementName.int16   = 'S16';
    % replacementName.int8    = 'S8';
    % replacementName.uint32  = 'US32';
    % replacementName.uint16  = 'U16';
    % replacementName.uint8   = 'US8';
    % replacementName.boolean = 'US8';
    % replacementName.int     = 'S32';
    % replacementName.uint    = 'US32';
    % replacementName.char    = 'CHAR';
    %set_param(cs,'ReplacementTypes', replacementName); % Replacement Name 
      
  end

  % Code interface
  
  if isERT
    set_param(cs,'IncludeMdlTerminateFcn','off');        % Terminate function required
    %set_param(cs,'MultiInstanceERTCode','off');         % Generate reusable code
    %set_param(cs,'MultiInstanceErrorCode','Error');     % Reusable code error diagnostic
    %set_param(cs,'RootIOFormat','Structure Reference'); % Pass root-level I/O as
    %set_param(cs,'SuppressErrorStatus','on');           % Remove error status field in real-time model
                                                         % data structure
    set_param(cs,'GRTInterface','off');                  % GRT compatible call interface
    set_param(cs,'CombineOutputUpdateFcns','on');        % Single output update
    set_param(cs,'CombineSignalStateStructs','on');      % Combine block signal and state structures
  end

  % Data exchange
  
  %set_param(cs,'RTWCAPIParams','off');    % Generate C-API for signals
  %set_param(cs,'RTWCAPISignals','off');   % Generate C-API for parameters
  %set_param(cs,'RTWCAPIStates','off');    % Generate C-API for states
  %set_param(cs,'RTWCAPIRootIO','off');    % Generate C-API for root-level inputs and outputs 
  %set_param(cs,'GenerateASAP2','off');    % Generate ASAP2 file
  %set_param(cs,'ExtMode','off');          % Generate External Mode interface

  % Code style
  
  if isERT
      %set_param(cs, 'ParenthesesLevel', 'Nominal'); % Control parentheses style
      if optimized
          set_param(cs, 'PreserveExpressionOrder', 'off'); % Always fold expressions left
                                                           % recursively to reduce stack
                                                           % memory usage
          set_param(cs, 'PreserveIfCondition', 'off');     % Negate if-else statement to 
                                                           % remove empty conditions
      else
          set_param(cs, 'PreserveExpressionOrder', 'on');  % Fold expressions to best match
                                                           % model specification 
          set_param(cs, 'PreserveIfCondition', 'on');      % Preserve empty else conditions
                                                           % to best match model specification
      end
  end
  
  % Templates

  if isERT
    set_param(cs,'ERTCustomFileTemplate',...
                 'example_file_process.tlc');   % File customization template
    set_param(cs,'GenerateSampleERTMain',...    
                 'on');                         % Generate an example main program
    %set_param(cs,'TargetOS',...                 
    %             'BareBoardExample');          % Target operating system
    set_param(cs,'ERTSrcFileBannerTemplate',... 
                 'ert_code_template.cgt');      % Source file (*.c) template (code)
    set_param(cs,'ERTHdrFileBannerTemplate',...
                 'ert_code_template.cgt');      % Source file (*.h) template (code)
    set_param(cs,'ERTDataSrcFileTemplate',...
                 'ert_code_template.cgt');      % Source file (*.c) template (data)
    set_param(cs,'ERTDataHdrFileTemplate',...
                 'ert_code_template.cgt');      % Source file (*.h) template (data)
  end
  
  % Code Placement
  %if isERT
    %set_param(cs, 'ERTFilePackagingFormat', ...
    %              'CompactWithDataFile');       % Compact with separate data file format
  %end
  
  % Verification

  %if isERT
    %set_param(cs,'CreateSILPILBlock','None');  % Create SIL block
    %set_param(cs, 'PortableWordSizes', 'on');    % Enable platform portable word size
                                                  % for SIL testing
  %end
  set_param(cs,'MatFileLogging','off');  % MAT-file logging
  set_param(cs,'SaveTime','off');        %   o Time
  set_param(cs,'SaveOutput','off');      %   o States
  set_param(cs,'SaveState','off');       %   o Output
  set_param(cs,'SaveFinalState','off');  %   o File states

  % Build environment
  
  if optimized
    set_param(cs,'RTWVerbose','off');      % Verbose build 
    set_param(cs,'RetainRTWFile','off');   % Delete the .rtw file
    %set_param(cs,'GenCodeOnly','on');     % Generate code only
  else
    set_param(cs,'RTWVerbose','on');       % Verbose build 
    set_param(cs,'RetainRTWFile','on');    % Delete the .rtw file
    %set_param(cs,'GenCodeOnly','on');     % Generate code only
  end
  
  % Memory sections
  if isERT
      %set_param(cs,'MemSecPackage', '--- None ---');   % Package containing memory section
                                                        % definition
      %set_param(cs, 'MemSecFuncInitTerm', 'Default');  % Memory section for initialize and
                                                        % terminate function
      %set_param(cs, 'MemSecFuncExecute', 'Default');   % Memory section for other functions
      %set_param(cs, 'MemSecDataConstants', 'Default'); % Memory section for constant data
      %set_param(cs, 'MemSecDataIO', 'Default');        % Memory section for root input/output
                                                        % Data
      %set_param(cs, 'MemSecDataInternal', 'Default');  % Memory section for internal data
      %set_param(cs, 'MemSecDataParameters', 'Default');% Memory section for parameters
  end
 
  %
  % Optional section:
  %
  % It is often desirable to maximize the bi-directional traceability between the model and
  % the generated code.  In some cases, you can maximize code traceability without adversely
  % impacting code efficiency, however there are a several exceptions to consider carefully.
  % In particular:
  %
  % Block reduction
  % Expression folding
  % Inline invariant signals
  % Buffer reuse
  % Conditional branch execution
  % Preserve expression order
  % Preserve empty if-else conditions
  %
  % Uncomment the following section to maximize traceability between the model and code.
  % Depending on your code verification needs, you may only wish to uncomment them
  % selectively as they greatly impact code efficiency.
  
  % Report (no impact on code efficiency)
  
  %set_param(cs,'GenerateReport','on');             % Generate HTML report
  %set_param(cs,'LaunchReport','on');               % Launch report
  if isERT
      %set_param(cs,'IncludeHyperlinkInReport','on'); % Code-to-block navigation
      %set_param(cs,'GenerateTraceInfo','on');        % Block-to-code navigation
      %set_param(cs,'GenerateTraceReport','on');      % Report eliminated / virtual blocks
      %set_param(cs,'GenerateTraceReportSl','on');    % Report traceable Simulink blocks
      %set_param(cs,'GenerateTraceReportSf','on');    % Report traceable Stateflow objects
      %set_param(cs,'GenerateTraceReportEml','on');   % Report Embedded MATLAB functions 
  end

  % Comments (no impact on code efficiency)
  
  %set_param(cs,'GenerateComments','on');         % Include comments
  %set_param(cs,'SimulinkBlockComments','on');    % Simulink block comments
  %set_param(cs,'ShowEliminatedStatement','on');  % Show eliminated statements
  %set_param(cs,'ForceParamTrailComments','on');  % Verbose comments for SimulinkGlobal
                                                  % storage class
  if isERT
      %set_param(cs,'InsertBlockDesc','on');        % Simulink block descriptions
      %set_param(cs,'SimulinkDataObjDesc','on');    % Simulink data object descriptions
      %set_param(cs,'EnableCustomComments','on');   % Custom comments (MPT objects only)
  end

  % Symbols (no impact on code efficiency)
  
  if isERT
      %set_param(cs,'MangleLength',1);                    % Minimum mangling length for ids
      %set_param(cs,'CustomSymbolStrGlobalVar','rt$N$M'); % Symbol format for global variables
      %set_param(cs, 'CustomSymbolStrType', '$N$M');      % Symbol format for global types
      %set_param(cs, 'CustomSymbolStrField', '$N$M');     % Symbol format for field name of types
      %set_param(cs, 'CustomSymbolStrFcn', '$N$M$F');     % Symbol format for subsystem methods
      %set_param(cs, 'CustomSymbolStrTmpVar', '$N$M');    % Symbol format for temporary variables
      %set_param(cs, 'CustomSymbolStrBlkIO', 'rtb_$N$M'); % Symbol format for local block output variables
      %set_param(cs, 'CustomSymbolStrMacro', '$N$M');     % Symbol format for macros
      %set_param(cs, 'InlinedPrmAccess', 'Macros');       % Generate scalar inlined parameters as macros
  end

  % Optimizations (degrades code efficiency)
  
  %set_param(cs,'BlockReduction','off');               % Block reduction optimization
  %set_param(cs,'ConditionallyExecuteInputs','off');   % Conditional input branch execution
  %set_param(cs,'BufferReuse','off');                  % Reuse block outputs
  %set_param(cs,'ExpressionFolding','off');            % Eliminate superfluous temporary variables
  %set_param(cs,'InlineInvariantSignals','off');       % Compute and inline invariant signals in the
                                                       % code

  % Code Style (degrades code efficiency)
  
  if isERT
      %set_param(cs, 'PreserveExpressionOrder', 'on');  % Fold expressions to best match
                                                        % model specification 
      %set_param(cs, 'PreserveIfCondition', 'on');      % Preserve empty else conditions
                                                        % to best match model specification
  end
 
  % Restore original location for utility files since switching targets resets it to auto
  set_param(cs,'UtilityFuncGeneration', origUtilityFuncGeneration);         % Utility function generation

% LocalWords:  noop Finites Func RTB Bitsets bitsets Flts Dbls Tmp rtb RTWCAPI
% LocalWords:  cgt Hdr