target
ПакетПрежде чем можно будет запустить процессор в цикле (PIL) симуляции, необходимо настроить возможность соединения между Simulink® и ваш целевой компьютер. Возможность соединения включает PIL симуляцию к:
Создайте целевое приложение.
Загрузите, запустите и остановите приложение на целевом компьютере.
Поддержите связь между Simulink и целевым компьютером.
Используйте один из этих рабочих процессов.
Рабочий процесс | Когда использовать |
---|---|
target пакет с rtiostream API | Используйте этот рабочий процесс, если ваше целевое приложение имеет большие требования ввода-вывода та коммуникация высокой полосы пропускания потребности. Для получения дополнительной информации смотрите Использование rtiostream API для Целевой Возможности соединения PIL. |
target пакет с отладчиком | Используйте этот рабочий процесс если:
Для получения дополнительной информации смотрите Отладчик Использования для Целевой Возможности соединения PIL. |
rtiostream
API для целевой возможности соединения PILЧтобы обеспечить возможность соединения PIL между Simulink и целевым компьютером, можно использовать target Package
с rtiostream API. В этом примере ваш компьютер разработчика является целевым компьютером.
Создайте target.Board
объект, который обеспечивает MATLAB® с описанием вашего целевого компьютера.
hostTarget = target.create('Board', ... 'Name', 'Example Intel Board');
Чтобы поддержать генерацию кода и ввод-вывод данных в PIL симуляциях, сопоставьте объект с процессором, связью и коммуникационными описаниями.
Сопоставьте плату с процессором
Чтобы поддержать генерацию кода, сопоставьте плату с target.Processor
объект, который содержит реализацию языка. В данном примере создайте target.Processor
возразите и снова используйте существующий target.LanguageImplementation
объект. Для получения информации о подготовке пользовательского target.LanguageImplementation
возразите, смотрите Регистр Новые Аппаратные устройства.
processor = target.create('Processor', 'Name', 'ExampleProcessor'); processor.LanguageImplementations = target.get('LanguageImplementation', ... 'Intel-x86-64 (Windows64)');
Сопоставьте target.Board
объект с новым target.Processor
объект при помощи Processors
свойство
hostTarget.Processors = processor;
Укажите информацию выполнения для целевого компьютера
Создайте объект, который содержит детали о выполнении целевого приложения. Объект описывает инструмент, который требуется запустить целевое приложение на целевом компьютере. Чтобы получить системные команды для запуска и остановки целевого приложения, можно использовать HostProcessExecutionTool
или SystemCommandExecutionTool
класс.
applicationExecution = target.create('HostProcessExecutionTool'); applicationExecution.Name = 'Windows Application';
Создайте Command
объект для загрузки и запуска целевого приложения. Присвойте строковую переменную '$(EXE)'
к String
свойство как заполнитель для имени целевого приложения, которое не известно до выполнения.
runCommand = target.create('Command'); runCommand.String = '$(EXE)'; applicationExecution.StartCommand = runCommand; hostTarget.Tools.ExecutionTools = applicationExecution;
Создайте коммуникационный интерфейс для целевого компьютера
Создайте CommunicationInterface
объект, который предоставляет целевому компьютеру детали канала связи и rtiostream реализации API.
Использование:
Поставленный TCP/IP rtiostream
исходный файл реализации.
BuildDependencies
объект задать, для rtiostream
API, исходные файлы, которые скомпилированы с целевым приложением.
MainFunction
возразите, чтобы передать аргументы целевому приложению
comms = target.create('CommunicationInterface'); comms.Name = 'Windows TCP Interface'; comms.Channel = 'TCPChannel'; comms.APIImplementations = target.create('APIImplementation', ... 'Name', 'x86 RTIOStream Implementation'); comms.APIImplementations.API = target.create('API', 'Name', 'RTIO Stream'); comms.APIImplementations.BuildDependencies = target.create('BuildDependencies'); comms.APIImplementations.BuildDependencies.SourceFiles = ... {fullfile('$(MATLABROOT)', ... 'toolbox', ... 'coder', ... 'rtiostream', ... 'src', ... 'rtiostreamtcpip', ... 'rtiostream_tcpip.c')}; comms.APIImplementations.MainFunction = target.create('MainFunction', ... 'Name', 'TCP RtIOStream Main'); comms.APIImplementations.MainFunction.Arguments = {'-blocking', '1', '-port', '0'}; hostTarget.CommunicationInterfaces = comms;
Укажите информацию протокола PIL
Этот шаг является дополнительным. PIL симуляция использует протокол связи для передачи данных между Simulink и целевым компьютером. target.PILProtocol
класс описывает параметры протокола. В данном примере можно улучшать производительность целевой среды выполнения путем увеличения buffer size ввода-вывода, который использует протокол.
Создайте target.PILProtocol
возразите и задайте buffer size ввода-вывода.
pilProtocol = target.create('PILProtocol'); pilProtocol.Name = 'Windows PIL Protocol'; pilProtocol.SendBufferSize = 50000; pilProtocol.ReceiveBufferSize = 50000; hostTarget.CommunicationProtocolStacks = pilProtocol;
Если вы не выполняете этот шаг, target.PILProtocol
по умолчанию значения используются.
Можно сконфигурировать PIL симуляцию, чтобы произвести профили времени выполнения для сгенерированного кода. Чтобы поддержать профилирование выполнения кода, необходимо создать объект - таймер, который описывает извлечение текущего времени от сгенерированного кода, работающего на целевом компьютере. Описание объекта - таймера должно включать описание функции, которая получает время и его реализацию.
Этот пример использует функцию C, timestamp_x86
, который возвращает текущее время как uint64
тип данных.
timerSignature = target.create('Function'); timerSignature.Name = 'timestamp_x86'; timerSignature.ReturnType = 'uint64';
Получите функцию в объекте API.
timerApi = target.create('API'); timerApi.Functions = timerSignature; timerApi.Language = target.Language.C; timerApi.Name = 'Windows Timer API';
Получите зависимости функции, то есть, исходные и заголовочные файлы, которые требуются запустить функцию.
timerDependencies = target.create('BuildDependencies'); timerDependencies.IncludeFiles = {'host_timer_x86.h'}; timerDependencies.IncludePaths = {'$(MATLAB_ROOT)/toolbox/coder/profile/src'}; timerDependencies.SourceFiles = {'host_timer_x86.c'};
Создайте объект, который комбинирует API и зависимости.
timerImplementation = target.create('APIImplementation'); timerImplementation.API = timerApi; timerImplementation.BuildDependencies = timerDependencies; timerImplementation.Name = 'Windows Timer Implementation';
Создайте объект - таймер и сопоставьте его с информацией о таймере.
timer = target.create('Timer'); timer.APIImplementation = timerImplementation; timer.Name = 'Windows Timer';
Присвойте таймер объекту процессора.
processor.Timers = timer;
Задайте связь между компьютером разработчика и целевым компьютером
Предыдущие шаги создали поддержку целевого компьютера коммуникаций и запуска целевого приложения. Теперь настройте связь между своим компьютером разработчика и целевым компьютером путем создания TargetConnection
объект. Задайте:
Канал связи, который является тем же каналом, заданным в коммуникационном интерфейсе целевого компьютера – видит шаг 4.
Свойства связи.
Цель, которая является описанием плат, заданным на предыдущих шагах.
connection = target.create('TargetConnection'); connection.Name = 'Host Process Connection'; connection.Target = hostTarget; connection.CommunicationChannel = target.create('TCPChannel'); connection.CommunicationChannel.Name = 'External Process TCPCommunicationChannel'; connection.CommunicationChannel.IPAddress = 'localhost'; connection.CommunicationChannel.Port = '0';
Сделайте плату, и объекты связи сохраняются через сеансы работы с MATLAB
Чтобы указать возможность соединения в MATLAB, добавьте целевой компьютер и информацию о связи к внутренней базе данных при помощи target.add
функция. По умолчанию информация только доступна для текущего сеанса работы с MATLAB. Чтобы заставить регистрацию сохраниться через сеансы работы с MATLAB, задайте пару "имя-значение" 'UserInstall', true
.
target.add([hostTarget connection], 'UserInstall', true);
Можно теперь задать компьютер разработчика как целевой компьютер для PIL симуляций. Прежде чем вы запустите PIL симуляцию, в диалоговом окне Configuration Parameters, установите Hardware board на Example Intel Board
.
Чтобы обеспечить возможность соединения PIL между Simulink и целевым компьютером, можно использовать target Package
с отладчиком, например, GNU® Отладчик.
Реализуйте target.DebugIOTool
интерфейс абстракции отладчика
Реализуйте интерфейс в классе под названием myImplementationClass
. Для псевдореализации кода в качестве примера смотрите Шаблон DebugIOTool.
classdef myImplementationClass < target.DebugIOTool properties (Access=private) … end methods … end methods (Access=private) … end end
Создайте target.Board
объект, который предоставляет MATLAB описание вашего целевого компьютера.
hostTarget = target.create('Board', ... 'Name', 'GDB Debug PIL IO');
Сопоставьте плату с процессором
Чтобы поддержать генерацию кода, сопоставьте плату с target.Processor
объект, который содержит реализацию языка. В данном примере создайте target.Processor
возразите и снова используйте существующий target.LanguageImplementation
объект. Для получения информации о подготовке пользовательского target.LanguageImplementation
возразите, смотрите Регистр Новые Аппаратные устройства.
hostTarget.Processors = target.get('Processor', ... 'Intel-x86-64 (Linux 64)');
Опишите реализацию услуги выполнения отладчика
Создайте target.ExecutionService
возразите, что ссылки абстракция отладчика взаимодействуют через интерфейс.
matlabExecution = target.create('ExecutionService', ... 'Name', 'GDB Launch'); matlabExecution.APIImplementation = ... target.create('APIImplementation', ... 'Name', 'myServiceImplementation'); matlabExecution.APIImplementation.BuildDependencies = ... target.create('MATLABDependencies'); matlabExecution.APIImplementation.BuildDependencies.Classes = ... {'myImplementationClass'}; matlabExecution.APIImplementation.API = ... target.get('API', ... 'DebugIOTool');
Объединенный сервис выполнения отладчика с платой
Сопоставьте target.ExecutionService
объект с target.Board
объект.
hostTarget.Tools.DebugTools = matlabExecution;
Заставьте объект платы сохраниться через сеансы работы с MATLAB
Добавьте объект платы во внутреннюю базу данных и заставьте объект сохраниться через сеансы работы с MATLAB.
target.add(hostTarget, 'UserInstall', true);
Прежде чем вы запустите PIL симуляцию, в диалоговом окне Configuration Parameters, установите Hardware board на GDB Debug PIL IO
.
Этот раздел обеспечивает псевдопример кода target.DebugIOTool
абстракция отладчика. Используйте target.DebugIOTool
объект к:
Управляйте временем жизни приложения, запускающегося в отладчике.
Автоматизируйте общие действия отладчика. Например, применяя точки останова и продолжая выполнение от приостановленного состояния.
Считайте и запишите в память, что приложение использует.
Для взаимодействий с отладчиком можно использовать MATLAB внешние интерфейсы языка для API, которые предоставляет поставщик отладчика.
target.DebugIOTool
пример абстракции отладчика
classdef DebugIOToolTemplate < target.DebugIOTool % DEBUGIOTOOLTEMPLATE Example implementation of target.DebugIOTool % debugger abstraction. % Copyright 2020 The MathWorks, Inc. properties (Access=private) % Optional % Add any state required to interact with the debugger or % application being run in the debugger as a property of % DebugIOTool. Apply private access so that only this file % can access the state. % % For example, the state could be a handle to the debugger % application provided by the debugger external API. DebuggerHandle; end % Method implementations that perform debugger interactions. % Each method will return a 'withoutError' logical flag indicating % whether the method executed withoutError. Consider also using the % MATLAB error method to report custom error information. methods % Constructor for the target.DebugIOTool. The constructor % creates an instance of the tool allowing its methods to be called % on that instance. Optional. function this = DebugIOToolTemplate() % Basic initialization can be performed here. For example % setting state ready for calls to open end % Open the debugger. Optional. function withoutError = open(this) % Add logic here to open the debugger. Typically, use system % commands or the external API provided by the debugger. % % If you cannot open the debugger without also loading the % application into the debugger, this method should not be % implemented and the logic should be performed in the % 'loadApplication' method. % % If you cannot open the debugger without also starting % execution of the application, this method should not be % implemented and the logic should be performed in the % 'startApplication' method. this.DebuggerHandle = this.callExternalDebugger('open'); withoutError = true; end % Load the application into the debugger. Optional. function withoutError = loadApplication(this) % Add logic here to load the application into the debugger. % This could be loading a project into an IDE debugger or % loading the application executable into the debugger harness. % % Additionally add logic to set breakpoints in the debugger to % break execution. % % The path to the application to load is stored in the % Application property of this class which can be accessed % using this.Application in this method. % % Additional command line arguments to pass to the the % application are stored in % this.ApplicationCommandLineArguments. % % Breakpoints to set are stored in this.Breakpoints % % If you cannot load the application without also starting % execution of the application, this method should not be % implemented and the logic should be performed in the % 'startApplication' method. this.callExternalDebugger('load application', ... this.Application, .... this.ApplicationCommandLineArguments); this.callExternalDebugger('set breakpoints', this.Breakpoints); withoutError = true; end % Start the application execution in the debugger. Required. function withoutError = startApplication(this) % Add logic here to start the application execution in the % debugger. % % The path to the application to load is stored in the % Application property of this class which can be accessed % using this.Application in this method. % % Additional command line arguments to pass to the % application are stored in % this.ApplicationCommandLineArguments. % % Breakpoints to set are stored in this.Breakpoints this.callExternalDebugger('start application'); withoutError = true; end % Stop the application execution in the debugger. Optional. function withoutError = stopApplication(this) % Add logic here to stop the application execution in the % debugger. % If your 'startApplication' method opened the debugger, % perform the opposite action here, i.e. close the % debugger. % % If your 'startApplication' method loaded the application, % perform the opposite action here, i.e. unload the % application from the debugger. this.callExternalDebugger('stop application'); withoutError = true; end % Unloads the application from the debugger. Optional. function withoutError = unloadApplication(this) % If you implemented the 'loadApplication' method, % then add logic here to unload the application from % the debugger. % If your 'loadApplication' method opened the debugger, % perform the opposite action here, i.e. close the % debugger. this.callExternalDebugger('unload application'); withoutError = true; end % Closes the debugger. Optional. function withoutError = close(this) % Add logic here to close the debugger. If you implemented the % 'open' method you should implement this method. this.callExternalDebugger('close'); withoutError = true; end % Asks if the debugger is currently stopped at the specified % breakpoint. Returns true if at the specified breakpoint, false % otherwise. Required. function [atBreakpoint, withoutError] = ... stoppedAtBreakpoint(this, breakpoint) % Add logic to determine if the debugger has broken execution % at the breakpoint passed into the function. % % The 'breakpoint' input variable is of type target.Breakpoint % which provides the description of the breakpoint. It contains % properties Function, File and Line which describes the % location of the breakpoint. % % Set the atBreakpoint return value to true if the debugger is % stopped at the breakpoint, or false if not. result = this.callExternalDebugger('determine breakpoint hit', ... breakpoint.File, ... breakpoint.Line, ... breakpoint.Function); atBreakpoint = ~isempty(result); withoutError = true; end % Continues execution if application execution is paused in the % debugger. Required. function withoutError = continueExecution(this) this.callExternalDebugger('continue execution'); withoutError = true; end % Write the specified memory stream to the target platform memory % specified by the given variable name. function withoutError = write(this, variableName, memoryStream) % Add logic to write the memoryStream data to the variableName % variable in the target. This function should assume that the % appropriate breakpoint has been hit to perform such an % action. % % memoryStream is a vector of uint64 values to be written to % the target platform. The unit64 values act as a container for % the smallest addressable integer on the target platform. In % most cases this will be a container for the size of char on % the target platform, which will commonly be 8-bit. % % The specified variable will represent a pointer to the % smallest addressable integer type. % As an example write operations on a target platform where % char represents the smallest addressable integer should be % equivilant to the following memcpy call in C code: % % (void*)memcpy(<variableName>, ... (unsigned char[<sizeOfMemoryStream>]) ... {<memoryStream(1)>,<memoryStream(2)>, ...}, ... <sizeOfMemoryStream>); % % A lot of debuggers allow for immediate execution of code when % execution is broken, if so, attempt to use the above command % to write data to the variable like the below example: sizeOfMemoryVariable = uint64(numel(memoryStream)); arrayFormat = repmat('%d,', [1 sizeOfMemoryVariable]); arrayFormat(end) = []; this.callExternalDebugger(sprintf('execute (void*)memcpy(%s, ... (unsigned char [%d]){%s}, %d)', ... variableName, ... sizeOfMemoryVariable, ... sprintf(arrayFormat, memoryStream), ... sizeOfMemoryVariable)); withoutError = true; end % read the memory stream from the target platform memory specified % by the given variable name. function [memoryStream, withoutError] = read(this, ... variableName, ... sizeToRead) % Add logic to read from the variableName variable on the % target. This function should assume that the appropriate % breakpoint has been hit to perform such an action. % % The memoryStream return value should be a vector of uint64 % values. The unit64 values act as a container for the smallest % addressable integer on the target platform. In most cases % this will be a container for the size of char on the target % platform, which will commonly be 8-bit. % % The specified variable will represent a pointer to the % smallest addressable integer type. % Read operations should be equivilant to inspecting the result % of the following C code: % (unsigned char [<sizeToRead>])*<variableName> % % A lot of debuggers allow for immediate execution of code when % execution is broken, if so, attempt to use the above command % to inspect the value of the buffer and return it to MATLAB. memoryStream = this.callExternalDebugger(... sprintf("read (unsigned char [%d])*%s", ... sizeToRead, variableName)); % The memory stream must be returned as a vector of uint64 % values memoryStream = uint64(memoryStream); withoutError = true; end end methods (Access=private) function output = callExternalDebugger(~, varargin) output = []; fprintf("\nInstructed the debugger to '%s'\n", varargin{1}); if nargin > 2 disp('Using arguments:'); disp(varargin(2:end)); end end end end
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.