Чтобы улучшить время выполнения, профилируя сгенерированного кода, который работает на детерминированном оборудовании, можно запустить процессор в цикле (PIL) симуляции, которые автоматически фильтруют издержки, сопоставленные с отладкой кода. Можно использовать целевой компьютер, чтобы оценить среднее служебное значение, или можно задать значение вручную.
По умолчанию программное обеспечение фильтрует времена выполнения Среды выполнения AUTOSAR (RTE) код и функции, которые запускают в Simulink®, например, Функциональных блоках Вызывающей стороны.
Когда вы создаете целевую настройку возможности соединения для PIL симуляций через подкласс rtw.connectivity.Config
, можно задать функции, которые оценивают и удаляют издержки инструментирования из измерений времени выполнения. В начале процессора в цикле (PIL) симуляция программное обеспечение запускает эталонную тестовую программу конкретное количество раз и получает среднее значение для издержек инструментирования. Эталонная тестовая программа оценивает издержки для API таймера и для замораживания таймера и размораживания, задачи и функционального кода инструментирования.
Во время симуляции программное обеспечение вычитает среднее значение издержек инструментирования от измерений времени выполнения. Инспектор Данных моделирования и выполнение кода, профилирующее отчет, отображают исправленные значения измерения.
Эти данные показывают, как неисправленные и исправленные значения таймера соответствуют вызовам секций кода.
Исправленное значение таймера исключает время выполнения, сопоставленное с кодом инструментирования, кодом RTE и функциональным кодом, который запускается в Simulink.
Чтобы оценить и удалить издержки инструментирования из измерений времени выполнения, класс 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