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

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

Примечание

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

Подход к оценке и удалению накладных расходов на Инструментирование

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

Вы можете:

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

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

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

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

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

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

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

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

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

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

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

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

Настройка программы бенчмарка

Когда вы настраиваете целевое подключение, реализуйте следующие шаги:

  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

The 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

См. также

| | | |

Похожие темы