gusucode.com > private工具箱matlab源码程序 > private/code_machine_source_file_sfun.m

    function code_machine_source_file_sfun(fileNameInfo)
% CODE_MACHINE_SOURCE_FILE(FILENAMEINFO,MACHINE,TARGET)

%   Copyright 1995-2015 The MathWorks, Inc.
%     


    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%  GLOBAL VARIABLES
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    global gMachineInfo  gTargetInfo

   machine = gMachineInfo.machineId;

    fileName = fullfile(fileNameInfo.targetDirName,fileNameInfo.machineSourceFile);
   sf_echo_generating('Coder',fileName);

   file = fopen(fileName,'Wt');
   if file<3
     construct_coder_error([],sprintf('Failed to create file: %s.',fileName),1);
     return;
   end

fprintf(file,'/* Include files */\n');
    customCodeSettings = get_custom_code_settings(gMachineInfo.target,gMachineInfo.parentTarget);
    customCodeString = customCodeSettings.customCode;
    if(~isempty(customCodeString))
fprintf(file,'#define IN_SF_MACHINE_SOURCE 1\n');
    end
fprintf(file,'#include "%s"\n',fileNameInfo.machineHeaderFile);
   if gTargetInfo.codingDebug
       % macros.h needed here for functions such as sf_debug_set_machine_data_value_ptr
fprintf(file,'#include "%s"\n',fileNameInfo.sfDebugMacrosFile);
   end
    for i = 1:length(fileNameInfo.chartHeaderFiles)
        for j = 1:length(fileNameInfo.chartHeaderFiles{i})
            if ~gMachineInfo.codingLLVM{i}(j)
fprintf(file,'#include "%s"\n',fileNameInfo.chartHeaderFiles{i}{j});
            end
        end
    end

    if ~gMachineInfo.ctxInfo.sfcnTgtCustomCodeInfo.hasExtraCustomCodeFiles && ~isempty(customCodeSettings.customSourceCode)
        % No extra file then emit the custom code in the machine's source file
fprintf(file,'/* Custom Source Code */\n');
fprintf(file,'%s\n',customCodeSettings.customSourceCode);
    end

    file = dump_module(fileName,file,machine,'source');
    if file < 3
      return;
    end

    fclose(file);

   machineInfo.fileName = fileName;
   machineInfo.targetId = gMachineInfo.target;
   machineInfo.machineId = gMachineInfo.machineId;
   machineInfo.charts = gMachineInfo.charts;
   machineInfo.codingLLVM = gMachineInfo.codingLLVM;
   machineInfo.machineName = gMachineInfo.machineName;
   if(gTargetInfo.codingLibrary)
       machineInfo.codingLibrary = true;
   else
       machineInfo.codingLibrary = false;
   end
   
   if gTargetInfo.codingExtMode
       machineInfo.codingExtMode = true;
   else
       machineInfo.codingExtMode = false;
   end
   
   if gTargetInfo.codingDebug
       machineInfo.codingDebug = true;
   else
       machineInfo.codingDebug = false;
   end
   
   sf('Cg', 'dump_machine_source_file_sfun', machineInfo);

   file = fopen(fileName,'a');
   if file<3
     construct_coder_error([],sprintf('Failed to create file: %s.',fileName),1);
     return;
   end

   if gTargetInfo.codingSFunction && gMachineInfo.ctxInfo.sfcnTgtCustomCodeInfo.supportCoverage

       if ~isempty(gMachineInfo.ctxInfo.sfcnTgtCustomCodeInfo.instrumenter)
fprintf(file,'        %s\n',gMachineInfo.ctxInfo.sfcnTgtCustomCodeInfo.instrumenter.getChartInstrumentationDefStr());
       end
fprintf(file,' unsigned int sf_%s_custom_codecov_info_call(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])\n',gMachineInfo.machineName);
fprintf(file,' {\n');
       if ~isempty(gMachineInfo.ctxInfo.sfcnTgtCustomCodeInfo.instrumenter)
fprintf(file,'        %s\n',gMachineInfo.ctxInfo.sfcnTgtCustomCodeInfo.instrumenter.getMexCommandLineHandlerBodyStr());
       end
fprintf(file,'   return 0;\n');
fprintf(file,' }\n');
   end

if sf('feature', 'FasterRuntimeInstrumentation')
fprintf(file,' int sf_%s_set_debug_var( int nlhs, mxArray * plhs[], int nrhs, const mxArray * prhs[] )\n',gMachineInfo.machineName);
fprintf(file,' {\n');
fprintf(file,'     unsigned int chartFileNumber = (unsigned int) mxGetScalar(prhs[0]);\n');
fprintf(file,'\n');
fprintf(file,'     if (!mxIsLogical(prhs[1])) {\n');
fprintf(file,'         return 0;\n');
fprintf(file,'     }\n');
    if numel(gMachineInfo.charts) > 0 % conditionaly print the switch statement/shall not be empty
fprintf(file,'     switch(chartFileNumber) {\n');
    end
    for ic=1:numel(gMachineInfo.charts)
        if all(gMachineInfo.codingLLVM{ic})
            continue
        end
        numSpecs = length(gMachineInfo.specializations{ic});
        chartFileNumber = sf('get', gMachineInfo.charts(ic), 'chart.chartFileNumber');
fprintf(file,'     case %.17g:\n',chartFileNumber);
fprintf(file,'       {\n');
fprintf(file,'         boolean_T val = *mxGetLogicals(prhs[1]);\n');
fprintf(file,'         real_T instanceHandle = mxGetScalar(prhs[2]);\n');
fprintf(file,'         boolean_T createChartInstanceAndAccess = *mxGetLogicals(prhs[3]);\n');
        for jc=1:numSpecs
            if gMachineInfo.codingLLVM{ic}(jc)
                continue
            end
            thisSpec = gMachineInfo.specializations{ic}{jc};
            chartUniqueName = sf('CodegenNameOf',gMachineInfo.charts(ic),thisSpec);
fprintf(file,'         extern void sf_%s_set_debug_var(boolean_T, real_T, boolean_T);\n',chartUniqueName);
        end
        for jc=1:numSpecs
            if gMachineInfo.codingLLVM{ic}(jc)
                continue
            end
            thisSpec = gMachineInfo.specializations{ic}{jc};
            chartUniqueName = sf('CodegenNameOf',gMachineInfo.charts(ic),thisSpec);
fprintf(file,'         sf_%s_set_debug_var(val, instanceHandle, createChartInstanceAndAccess);\n',chartUniqueName);
        end
fprintf(file,'       return 1;\n');
fprintf(file,'       }\n');
fprintf(file,'       break;\n');
    end
    if numel(gMachineInfo.charts) > 0 % switch statement has been printed
fprintf(file,'     default:\n');
fprintf(file,'         break;\n');
fprintf(file,'     }\n');
    end
fprintf(file,' return 0;\n');
fprintf(file,' }\n');
fprintf(file,'\n');
fprintf(file,' int sf_%s_get_debug_var( int nlhs, mxArray * plhs[], int nrhs, const mxArray * prhs[] )\n',gMachineInfo.machineName);
fprintf(file,' {\n');
fprintf(file,'     unsigned int chartFileNumber = (unsigned int) mxGetScalar(prhs[0]);\n');
fprintf(file,'     plhs[0] = mxCreateDoubleMatrix( 1,1,mxREAL);\n');
    if numel(gMachineInfo.charts) > 0 % conditionaly print the switch statement/shall not be empty
fprintf(file,'     switch(chartFileNumber) {\n');
    end
    for ic=1:numel(gMachineInfo.charts)
        if all(gMachineInfo.codingLLVM{ic})
            continue
        end
        numSpecs = length(gMachineInfo.specializations{ic});
        chartFileNumber = sf('get', gMachineInfo.charts(ic), 'chart.chartFileNumber');
fprintf(file,'     case %.17g:\n',chartFileNumber);
fprintf(file,'       {\n');
        for jc=1:numSpecs
            if gMachineInfo.codingLLVM{ic}(jc)
                continue
            end
            thisSpec = gMachineInfo.specializations{ic}{jc};
            chartUniqueName = sf('CodegenNameOf',gMachineInfo.charts(ic),thisSpec);
fprintf(file,'         extern boolean_T sf_%s_get_debug_var();\n',chartUniqueName);
        end
        for jc=1:numSpecs
            if gMachineInfo.codingLLVM{ic}(jc)
                continue
            end
            thisSpec = gMachineInfo.specializations{ic}{jc};
            chartUniqueName = sf('CodegenNameOf',gMachineInfo.charts(ic),thisSpec);
fprintf(file,'         ((real_T *)mxGetPr((plhs[0])))[0] = (real_T)(sf_%s_get_debug_var());\n',chartUniqueName);
        end
fprintf(file,'       return 1;\n');
fprintf(file,'       }\n');
fprintf(file,'       break;\n');
    end
    if numel(gMachineInfo.charts) > 0 % switch statement has been printed
fprintf(file,'     default:\n');
fprintf(file,'         break;\n');
fprintf(file,'     }\n');
    end
fprintf(file,' return 0;\n');
fprintf(file,' }\n');
fprintf(file,'\n');
end

   if gTargetInfo.codingDebug
fprintf(file,'void  %s_debug_initialize(struct SfDebugInstanceStruct* debugInstance)\n',gMachineInfo.machineName);
fprintf(file,'{\n');
       code_machine_debug_initialization(file);
fprintf(file,'}\n');
    end

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%% Exported data registration
    %%%% We want to generate a function looking like:
    %%%%
    %%%% void machinename_register_exported_symbols(SimStruct* S)
    %%%% {
    %%%%    ssRegMdlInfo(S, "x1", MDL_INFO_ID_MACHINE_EXPORTED, 0, 0, (void*) NULL);     
    %%%%    ssRegMdlInfo(S, "x2", MDL_INFO_ID_MACHINE_EXPORTED, 0, 0, (void*) NULL);     
    %%%%    ssRegMdlInfo(S, "x3", MDL_INFO_ID_MACHINE_EXPORTED, 0, 0, (void*) NULL);     
    %%%%    ssRegMdlInfo(S, "x4", MDL_INFO_ID_MACHINE_EXPORTED, 0, 0, (void*) NULL);     
    %%%% } 
    %%%% 
    %%%% This will register all exported data with simulink and if there is a name
    %%%% clash it will be detected by simulink and an error will be reported
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

fprintf(file,'\n');
fprintf(file,'  void %s_register_exported_symbols(SimStruct* S)\n',gMachineInfo.machineName);
fprintf(file,'  {\n');
       for i=1:length(gMachineInfo.exportedData)
           exportedId = gMachineInfo.exportedData(i);
           exportedDataName = sf('get',exportedId,'data.name');
fprintf(file,'        ssRegMdlInfo(S, "%s", MDL_INFO_ID_MACHINE_EXPORTED, 0, 0, (void*) NULL);   \n',exportedDataName);
       end
fprintf(file,'}\n');

fprintf(file,'static mxArray* sRtwOptimizationInfoStruct=NULL;\n');
fprintf(file,'typedef struct SfOptimizationInfoFlagsTag {\n');
fprintf(file,'     boolean_T isRtwGen;\n');
fprintf(file,'     boolean_T isModelRef;\n');
fprintf(file,'     boolean_T isExternal;\n');
fprintf(file,'} SfOptimizationInfoFlags;\n');
fprintf(file,'static SfOptimizationInfoFlags sOptimizationInfoFlags;\n');
fprintf(file,'void unload_%s_optimization_info(void);\n',gMachineInfo.machineName);
fprintf(file,'mxArray* load_%s_optimization_info(boolean_T isRtwGen, boolean_T isModelRef, boolean_T isExternal)\n',gMachineInfo.machineName);
fprintf(file,'{\n');
       mainMachineName = sf('get',gMachineInfo.mainMachineId,'machine.name');
fprintf(file,'    if(sOptimizationInfoFlags.isRtwGen != isRtwGen || sOptimizationInfoFlags.isModelRef != isModelRef || sOptimizationInfoFlags.isExternal != isExternal) {\n');
fprintf(file,'         unload_%s_optimization_info();\n',gMachineInfo.machineName);
fprintf(file,'    }\n');
fprintf(file,'    sOptimizationInfoFlags.isRtwGen = isRtwGen;\n');
fprintf(file,'    sOptimizationInfoFlags.isModelRef = isModelRef;\n');
fprintf(file,'    sOptimizationInfoFlags.isExternal = isExternal;\n');
fprintf(file,'    if(sRtwOptimizationInfoStruct==NULL) {\n');
fprintf(file,'         sRtwOptimizationInfoStruct = sf_load_rtw_optimization_info("%s", "%s");\n',gMachineInfo.machineName,mainMachineName);
fprintf(file,'         mexMakeArrayPersistent(sRtwOptimizationInfoStruct);\n');
fprintf(file,'    }\n');
fprintf(file,'    return(sRtwOptimizationInfoStruct);\n');
fprintf(file,'        \n');
fprintf(file,'}\n');
fprintf(file,'void unload_%s_optimization_info(void)\n',gMachineInfo.machineName);
fprintf(file,'{\n');
fprintf(file,'    if(sRtwOptimizationInfoStruct!=NULL) {\n');
fprintf(file,'        mxDestroyArray(sRtwOptimizationInfoStruct);\n');
fprintf(file,'        sRtwOptimizationInfoStruct = NULL;\n');
fprintf(file,'    }\n');
fprintf(file,'}\n');
fprintf(file,'\n');

    fclose(file);
    try_indenting_file(fileName);