exponenta event banner

Удаление накладных расходов КИПиА из измерений времени выполнения

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

Примечание

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

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

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

См. также

| | | |

Связанные темы