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

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

Примечание

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

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

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

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

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

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

Чтобы оценить и удалить издержки инструментирования из измерений времени выполнения, класс 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

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

Похожие темы