Удалите издержки инструментирования из измерений времени выполнения

Чтобы улучшить время выполнения, профилируя сгенерированного кода, который работает на детерминированном оборудовании, можно запустить процессор в цикле (PIL) симуляции, которые автоматически фильтруют издержки, сопоставленные с отладкой кода. Можно использовать целевой компьютер, чтобы оценить среднее служебное значение, или можно задать значение вручную.

Примечание

По умолчанию программное обеспечение фильтрует времена выполнения Среды выполнения AUTOSAR (RTE) код и функции, которые запускают в Simulink®, например, блоках Function Caller.

Приблизьтесь для оценки и удаления инструментирования наверху

Когда вы настраиваете целевую возможность соединения для PIL симуляций, можно задать объекты или функции для оценки и удаления издержек инструментирования от измерений времени выполнения.

Вы можете:

  • Настройте эталонную тестовую программу, что Simulink запускает конкретное количество раз в начале PIL симуляции. Эталонная тестовая программа оценивает издержки для API таймера и для замораживания таймера и размораживания, задачи и функционального кода инструментирования. Simulink получает средние значения для издержек инструментирования.

  • Вручную задайте инструментирование служебные значения.

Во время PIL симуляции Simulink вычитает инструментирование служебные значения из измерений времени выполнения. Инспектор Данных моделирования и выполнение кода, профилирующее отчет, отображают откорректированные значения измерения.

Этот рисунок показывает, как неоткорректированные и откорректированные значения таймера соответствуют вызовам секций кода.

Откорректированное значение таймера исключает время выполнения, сопоставленное с кодом инструментирования, кодом RTE и функциональным кодом, который запускается в Simulink.

Оценить и удалить издержки инструментирования из измерений времени выполнения:

  • Если возможность соединения PIL настраивается при помощи target пакет, используйте служебные классы от пакета.

  • Если возможность соединения PIL настраивается при помощи rtw.connectivity.Config класс, используйте функции от класса.

Удалите Издержки Инструментирования при помощи целевого Пакета

Чтобы предоставить программному обеспечению инструментирование служебные значения, используйте один из этих методов:

  • Настройте эталонную тестовую программу, которая оценивает служебные значения.

  • Используя служебные классы, вручную задайте служебные значения.

Настройте эталонную тестовую программу

Когда вы настраиваете целевую возможность соединения, реализуете эти шаги:

  1. Получите target.Processor и target.Timer объекты.

    processor = target.get('Processor', myProcessorObjectId);
    timer = target.get('Timer', myTimerObjectId);

  2. Создайте target.ProfilingTaskOverhead объект.

    taskOverhead = target.create('ProfilingTaskOverhead', ...
                                 'Name', 'Timer Task Overhead');
    taskOverhead.Counter = timer;
    taskOverhead.MinimumBenchmarkIterations = 150;

  3. Сопоставьте служебные значения с процессором.

    processor.Overheads = taskOverhead;

Задайте служебные значения

Когда вы настраиваете целевую возможность соединения, создаете служебные объекты класса и используете Value свойство задать ваше значение для соответствующего инструментирования наверху.

  1. Получите target.Processor и target.Timer объекты.

    processor = target.get('Processor', myProcessorObjectId);
    timer = target.get('Timer', myTimerObjectId);

  2. Создайте target.ProfilingTaskOverhead объект.

    taskOverhead = target.create('ProfilingTaskOverhead',...
                                 'Name', 'Timer Task Overhead');
    taskOverhead.Value = 10;
    taskOverhead.Counter = timer;

  3. Создайте target.ProfilingFunctionOverhead объект.

    functionOverhead = target.create('ProfilingFunctionOverhead',...
                                'Name', 'Timer Function Overhead');
    functionOverhead.Value = 20;
    functionOverhead.Counter = timer;

  4. Создайте target.ProfilingFreezingOverhead объект.

    freezingOverhead = target.create('ProfilingFreezingOverhead',...
                                     'Name', 'Timer Freezing Overhead');
    freezingOverhead.Value = 30;
    freezingOverhead.Counter = timer;

  5. Сопоставьте служебные значения с процессором.

    processor.Overheads = ...
     [taskOverhead, functionOverhead, freezingOverhead];

Удалите издержки инструментирования при помощи функций от rtw.connectivity.Config

rtw.connectivity.Config класс обеспечивает эти функции для удаления издержек инструментирования.

ФункцияОписание

activateOverheadFiltering

obj.activateOverheadFiltering (value); активирует фильтрацию издержек инструментирования, если значением является true. Деактивировал наверху фильтрацию, если значением является false.

isOverheadFilteringActive

obj.isOverheadFilteringActive возвращает true если инструментирование служебная фильтрация активируется. В противном случае, возвращает false.

runOverheadBenchmark

obj.runOverheadBenchmark (value); запускает эталонную тестовую программу, если значением является true. Не запускает эталонную тестовую программу, если значением является false.

isOverheadBenchmarkExecuted

obj.isOverheadBenchmarkExecuted; возвращает true если выполнение эталонной тестовой программы завершено. В противном случае, возвращает false.

setOverheadBenchmarkSteps

obj.setOverheadBenchmarkSteps (steps); задает количество шагов для эталонной тестовой программы.

getOverheadBenchmarkSteps

steps = obj.getOverheadBenchmarkSteps возвращает количество заданных шагов для эталонной тестовой программы.

setOverheads

obj.setOverheads (taskInstrumentationOverhead, functionInstrumentationOverhead, freezingInstrumentation); задает служебные значения для задачи, функции и замораживающегося инструментирования соответственно.

getOverheads

[taskInstrumentationOverhead, functionInstrumentationOverhead, freezingInstrumentation] = obj.getOverheads; возвращает служебные значения для задачи, функции и замораживающегося инструментирования соответственно.

Когда вы настраиваете целевую возможность соединения для PIL симуляций, конфигурируете удаление издержек инструментирования через rtw.connectivity.Config подкласс. Например, этот код показывает, как можно запустить эталонную тестовую программу.

classdef overheadConnectivityConfig < rtw.connectivity.Config
  methods
    function this = customConnectivityConfig(componentArgs)
            
      % Create builder
      targetApplicationFramework = ...
        mypil.TargetApplicationFramework(componentArgs);
      builder = rtw.connectivity.MakefileBuilder(componentArgs, ...
        targetApplicationFramework, '');
            
      % Create launcher
      launcher = mypil.Launcher(componentArgs, builder);
            
      % Set up communication       
      hostCommunicator = rtw.connectivity.RtIOStreamHostCommunicator(...
                         componentArgs, ...
                         launcher, ...
                         rtiostreamLibTCPIP);     

      % Call super class constructor to register components
        this@rtw.connectivity.Config(componentArgs,...
                                     builder,...
                                     launcher,...
                                     hostCommunicator);
            
      % Register hardware-specific timer, which enables
      % code execution profiling. This example uses a 
      % timer for the host platform.
      timer = coder.profile.crlHostTimer();
      this.setTimer(timer);

      % Specify removal of profiling instrumentation overheads
      this.activateOverheadFiltering(true);
      this.runOverheadBenchmark(true);
      this.setOverheadBenchmarkSteps(50);

    end
  end
end

Вместо того, чтобы запустить эталонную тестовую программу, можно использовать setOverheads вводить ваши значения для издержек инструментирования.

    ...

    % Remove instrumentation overhead using manually specified values
    this.activateOverheadFiltering(true);
    this.setOverheads (taskInstrumentationOverhead, ...
      functionInstrumentationOverhead, freezingInstrumentation);

    ...

Получите результаты сравнительного теста

То, когда PIL симуляция завершена, можно получить сравнительный тест, следует из переменной, которую вы задаете в поле Code Generation> Verification> Workspace variable (CodeExecutionProfileVariable), например, myExecutionProfile.

benchmarkResults = myExecutionProfile.getOverheadBenchmarkData();

benchmarkResults структура, которая содержит отладку кода служебные значения.

>> benchmarkResults
 ans = 
 struct with fields:
 TimestampOverhead: [1×1 struct]
 TaskOverhead: [1×1 struct]
 FunctionOverhead: [1×1 struct]
 FreezingOverhead: [1×1 struct]

>> benchmarkResults.TaskOverhead
 ans = 
 struct with fields:
 Data: [1×100 uint64]
 NumSamples: 100
 Average: 45.2800

Смотрите также

| | | |

Похожие темы