Чтобы улучшить время выполнения, профилируя сгенерированного кода, который работает на детерминированном оборудовании, можно запустить процессор в цикле (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.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 симуляция завершена, можно получить сравнительный тест, следует из переменной, которую вы задаете в поле 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.ProfilingTaskOverhead
| target.ProfilingFunctionOverhead
| target.ProfilingFreezingOverhead