Чтобы улучшить профилирование сгенерированного кода во время выполнения, которое запускается на детерминированном оборудовании, можно запустить симуляции процессора в цикле (PIL), которые автоматически фильтруют накладные расходы, связанные с отладкой кода. Можно использовать целевой компьютер, чтобы оценить среднее значение накладных расходов или можно задать значение вручную.
Примечание
По умолчанию программа фильтрует времена выполнения кода AUTOSAR Runtime Окружения (RTE) и функции, которые выполняются в Simulink®для примера Function Caller блоков.
Когда вы настраиваете целевую связность для PIL симуляций, можно задать объекты или функции для оценки и удаления накладных расходов на инструментирование из измерений во время выполнения.
Вы можете:
Настройте программу бенчмарка, которую Simulink запускает конкретное количество раз в начале PIL симуляции. Программа бенчмарка оценивает накладные расходы для API таймера и для зависания и размораживания таймера, кода задачи и функционального инструментирования. Simulink получает средние значения для инструментирования накладных расходов.
Вручную задайте верхние значения инструментирование.
Во время PIL симуляции Simulink вычитает значения накладных расходов инструментирования из измерений во время выполнения. В Данных моделирования Inspector и в отчете о профилировании выполнения кода отображаются скорректированные значения измерений.
Этот рисунок показывает, как некорректированные и исправленные значения таймера соответствуют вызовам секций кода.
Исправленное значение таймера исключает время выполнения, сопоставленное с кодом инструментированием, кодом RTE и кодом функции, который запускается в Simulink.
Оценка и удаление накладных расходов инструментирования из измерений во время выполнения:
Если PIL-подключение настроено при помощи target
упаковать, использовать служебные классы из пакета.
Если PIL-подключение настроено при помощи rtw.connectivity.Config
class, использовать функции из класса.
Чтобы обеспечить программное обеспечение служебными значениями инструментированием, используйте один из следующих методов:
Настройте программу бенчмарка, которая оценивает значения накладных расходов.
Используя классы накладных расходов, вручную задайте значения накладных расходов.
Когда вы настраиваете целевое подключение, реализуйте следующие шаги:
Извлечение 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
The 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.ProfilingFreezingOverhead
| target.ProfilingFunctionOverhead
| target.ProfilingTaskOverhead