Чтобы улучшить время выполнения, профилируя сгенерированного кода, который работает на детерминированном оборудовании, можно запустить процессор в цикле (PIL) симуляции, которые автоматически фильтруют издержки, сопоставленные с отладкой кода. Можно использовать целевой компьютер, чтобы оценить среднее служебное значение, или можно задать значение вручную.
Примечание
По умолчанию программное обеспечение фильтрует времена выполнения Среды выполнения AUTOSAR (RTE) код и функции, которые запускают в Simulink®, например, блоках Function Caller.
Когда вы настраиваете целевую возможность соединения для 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.Configrtw.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 симуляция завершена, можно получить сравнительный тест, следует из переменной, которую вы задаете в поле 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
rtw.connectivity.Config | target | target.ProfilingFreezingOverhead | target.ProfilingFunctionOverhead | target.ProfilingTaskOverhead