Для улучшения профилирования времени выполнения сгенерированного кода, выполняемого на детерминированном оборудовании, можно выполнить моделирование процессора в цикле (PIL), которое автоматически фильтрует накладные расходы, связанные с инструментарием кода. Можно использовать целевое оборудование для оценки среднего значения накладных расходов или указать значение вручную.
Примечание
По умолчанию программа фильтрует время выполнения кода среды выполнения AUTOSAR (RTE) и функций, которые выполняются в Simulink ®, например, блоков вызова функции.
При настройке целевого соединения для моделирования PIL можно указать объекты или функции для оценки и удаления накладных расходов КИП из измерений времени выполнения.
Вы можете:
Настройте программу тестирования, которую Simulink запускает определенное количество раз в начале моделирования PIL. Программа тестирования оценивает накладные расходы для API таймера и для замораживания и размораживания таймера, задания и кода инструментария функции. Simulink получает средние значения для накладных расходов КИПиА.
Вручную укажите значения накладных расходов КИП.
Во время моделирования PIL Simulink вычитает значения служебных данных КИП из измерений времени выполнения. В инспекторе данных моделирования и отчете по профилированию выполнения кода отображаются скорректированные значения измерений.
На этом рисунке показано, как нескорректированные и скорректированные значения таймера соответствуют вызовам разделов кода.

Скорректированное значение таймера исключает время выполнения, связанное с кодом инструментария, кодом RTE и кодом функции, который выполняется в Simulink.
Оценка и удаление накладных расходов КИПиА из измерений времени выполнения:
Если соединение PIL установлено с помощью target используйте служебные классы из пакета.
Если соединение PIL установлено с помощью rtw.connectivity.Config , используйте функции из класса.
Для обеспечения программного обеспечения значениями накладных расходов КИПиА используйте один из следующих методов:
Настройте программу эталонного тестирования, которая оценивает значения накладных расходов.
Используя классы накладных расходов, вручную укажите значения накладных расходов.
При настройке целевого подключения выполните следующие действия.
Получить target.Processor и target.Timer объекты.
processor = target.get('Processor', myProcessorObjectId); timer = target.get('Timer', myTimerObjectId);
Создать target.ProfilingTaskOverhead объект.
taskOverhead = target.create('ProfilingTaskOverhead', ... 'Name', 'Timer Task Overhead'); taskOverhead.Counter = timer; taskOverhead.MinimumBenchmarkIterations = 150;
Свяжите значения накладных расходов с процессором.
processor.Overheads = taskOverhead;
При настройке целевого соединения создайте объекты класса накладных расходов и используйте Value для указания значения для соответствующих служебных данных КИПиА.
Получить target.Processor и target.Timer объекты.
processor = target.get('Processor', myProcessorObjectId); timer = target.get('Timer', myTimerObjectId);
Создать target.ProfilingTaskOverhead объект.
taskOverhead = target.create('ProfilingTaskOverhead',... 'Name', 'Timer Task Overhead'); taskOverhead.Value = 10; taskOverhead.Counter = timer;
Создать target.ProfilingFunctionOverhead объект.
functionOverhead = target.create('ProfilingFunctionOverhead',... 'Name', 'Timer Function Overhead'); functionOverhead.Value = 20; functionOverhead.Counter = timer;
Создать target.ProfilingFreezingOverhead объект.
freezingOverhead = target.create('ProfilingFreezingOverhead',... 'Name', 'Timer Freezing Overhead'); freezingOverhead.Value = 30; freezingOverhead.Counter = timer;
Свяжите значения накладных расходов с процессором.
processor.Overheads = ...
[taskOverhead, functionOverhead, freezingOverhead];
rtw.connectivity.Config rtw.connectivity.Config класс обеспечивает эти функции для снятия накладных расходов КИПиА.
| Функция | Описание |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
При настройке целевого подключения для моделирования 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
rtw.connectivity.Config | target | target.ProfilingFreezingOverhead | target.ProfilingFunctionOverhead | target.ProfilingTaskOverhead