Интерфейс к средствам разработки

Если вы не разработаете цель просто в целях генерации кода, вы захотите, чтобы ваш целевой процессор поддержал полный процесс сборки. Полный процесс сборки генерации почтового индекса включает

  • Компиляция сгенерированного кода

  • Соединение скомпилированного кода и библиотек времени выполнения в модуль исполняемой программы (или некоторое промежуточное представление исполняемого кода, таких как формат S-Rec)

  • Загрузка исполняемого файла к целевому компьютеру с отладчиком или другой утилитой

  • Инициирование осуществления загруженной программы

Поддержка полного процесса сборки является по сути комплексной задачей, потому что она включает взаимодействие через интерфейс к инструментам кросс-разработки и утилитам, которые являются внешними к генератору кода.

Если вашими средствами разработки можно управлять с традиционными make-файлами и сделать утилитой, такими как gmake, может быть относительно просто для вас адаптировать существующие конечные файлы (такие как ert.tlc и файлы ert.tmf, обеспеченные программным обеспечением Embedded Coder®) к вашим требованиям. Этот подход обсужден в Подходе Make-файла Шаблона.

О взаимодействии через интерфейс к средствам разработки

Автоматизация вашего процесса сборки через современную интегрированную среду разработки (IDE) представляет различный набор проблем. Каждый IDE поступает по-своему представления набора исходных файлов и библиотек для проекта и для определения аргументов сборки. Взаимодействие через интерфейс к IDE может потребовать генерации специализированных форматов файлов, требуемых IDE (например, файлы проекта) и, и также может потребовать, чтобы использование методов межсвязи приложений (IAC) запустило IDE. Один такой подход к автоматизации сборки обсужден в Интерфейсе к Интегрированной среде разработки.

Обработайте подход make-файла по шаблону

Make-файл шаблона предоставляет информацию о вашей модели и вашей системе разработки. Процесс сборки использует эту информацию, чтобы создать make-файлы для создания исполняемой программы. Генератор кода обеспечивает много make-файлов шаблона, подходящих для компиляторов компьютера разработчика, таких как LCC (ert_lcc.tmf) и Microsoft® Visual C ++® (ert_vcx64.tmf).

Адаптация одного из существующих make-файлов шаблона к вашему кросс-компилятору делает утилиту, может потребовать немного больше, чем копирование и переименование make-файла шаблона в соответствии с соглашениями вашего проекта.

Если необходимо сделать более обширные модификации, необходимо понять make-файлы шаблона подробно. Для подробного описания структуры make-файлов шаблона и лексем, используемых в make-файлах шаблона, смотрите, Настраивают Make-файлы Шаблона.

Следующие темы добавляют основную информацию о make-файле шаблона:

Интерфейс к интегрированной среде разработки

В этом разделе описываются методы, которые использовались, чтобы интегрировать целевые процессоры с интегрированной средой разработки (ИДЫ), включая

  • Как сгенерировать заголовочный файл, содержащий директивы, чтобы задать переменные (и их значения) требуемый основанной на не-make-файле сборкой.

  • Некоторые проблемы и решения, характерные для взаимодействия через интерфейс с целевыми процессорами с Полупроводником Freescale™ CodeWarrior® IDE. Обеспеченные примеры должны помочь вам иметь дело с подобными проблемами взаимодействия через интерфейс со своим конкретным IDE.

Генерация заголовочного файла CPP_REQ_DEFINES

В make-файлах шаблона маркерный CPP_REQ_DEFINES расширен и заменен списком установок параметров, вводимых с различными диалоговыми окнами. Эта переменная часто содержит информацию, такую как MODEL (имя генерации модели), NUMST (количество шагов расчета в модели), MT (модель является многозадачностью или не), и многочисленные другие параметры (см. Make-файлы Шаблона и Лексемы).

Механизм make-файла обрабатывает лексему CPP_REQ_DEFINES автоматически. Если ваша цель требует использования файла проекта, а не традиционного подхода make-файла, можно сгенерировать заголовочный файл, содержащий директивы, чтобы задать эти переменные и обеспечить их значения.

Следующий файл TLC, gen_rtw_req_defines_h.tlc, обеспечивает пример. Код генерирует заголовочный файл C, cpp_req_defines.h. Информация, запрошенная, чтобы сгенерировать каждую директиву #define, выведена, любой от информации в файле model.rtw (например, CompiledModel.NumSynchronousSampleTimes), или от делает переменные из структуры rtwoptions (например, PurelyIntegerCode).

%% File: gen_rtw_req_defines_h.tlc
%openfile CPP_DEFINES = "cpp_req_defines.h"
#ifndef _CPP_REQ_DEFINES_
#define _CPP_REQ_DEFINES_
#define MODEL %<CompiledModel.Name>
#define ERT  1
#define NUMST %<CompiledModel.NumSynchronousSampleTimes>
#define TID01EQ %<CompiledModel.FixedStepOpts.TID01EQ>
%%
%if CompiledModel.FixedStepOpts.SolverMode == "MultiTasking"
#define MT  1
#define MULTITASKING  1
%else
#define MT  0
#define MULTITASKING  0
%endif
%%
#define MAT_FILE  0
#define INTEGER_CODE %<PurelyIntegerCode>
#define ONESTEPFCN %<CombineOutputUpdateFcns>
#define TERMFCN %<IncludeMdlTerminateFcn>
%%
#define MULTI_INSTANCE_CODE  0
#define HAVESTDIO  0
#endif
%closefile CPP_DEFINES

Взаимодействие через интерфейс к IDE Freescale CodeWarrior

Взаимодействие через интерфейс с процессом сборки целевого процессора к CodeWarrior IDE требует, чтобы с двумя проблемами имели дело:

  • Процесс сборки должен сгенерировать CodeWarrior совместимый файл проекта. Эта проблема и решение, обсуждены в Импорте Проекта XML. Описанное решение применимо к форматам файлов проекта ASCII.

  • Во время генерации кода цель должна автоматизировать сеанс CodeWarrior, который открывает файл проекта и создает исполняемый файл. Эта задача описана в Автоматизации Процесса сборки. Описанное решение применимо к ИДАМ, которыми можно управлять с автоматизацией Microsoft Component Object Model (COM).

Импорт Проекта XML.  Этот раздел иллюстрирует, как использовать Компилятор выходного языка (TLC), чтобы сгенерировать расширяемый язык разметки (XML) файл, подходящий для импорта в CodeWarrior IDE, который содержит информацию об исходном коде, сгенерированном целевым процессором.

Выбор формата XML диктует то, что CodeWarrior IDE поддерживает экспорт проекта и импорт с XML-файлами. С этой записи нативные файлы проекта CodeWarrior находятся в собственном двоичном формате.

Обратите внимание на то, что, если ваша цель должна поддержать формат файла проекта некоторого другого компилятора, можно применить методы, показанные здесь другим форматам ASCII-файла (см. Генерацию Заголовочного файла CPP_REQ_DEFINES).

Чтобы проиллюстрировать фундаментальное понятие, считайте гипотетический XML-файл экспортируемым из проекта канцелярской бумаги CodeWarrior. Следующее является частичным листингом:

<target>
   <settings>
    ...
   <\settings>
   <file><name>foo.c<\name>
   <\file>
   ...
   <file><name>foobar.c<\name>
   <\file>
   <fileref><name>foo.c<\name>
   <\fileref>
   ...
   <fileref><name>foobar.c<\name>
   <\fileref>
<\target>

Вставьте этот код XML в блок %openfile/%closefile в файле TLC, test.tlc, как показано ниже.

%% test.tlc
%% This code will generate a file model_project.xml,
%% where model is the generating model name specified in
%% the CompiledModel.Name field of the model.rtw file.
%openfile XMLFileContents = %<CompiledModel.Name>_project.xml
<target>
   <settings>
    ...
   <\settings>
   <file><name>%<CompiledModel.Name>.c<\name>
   <\file>
   ...
   <file><name>foobar.c<\name>
   <\file>
   <fileref><name>%<CompiledModel.Name>.c<\name>
   <\fileref>
   ...
   <fileref><name>foobar.c<\name>
   <\fileref>
<\target>
%closefile XMLFileContents
%selectfile NULL_FILE

Отметьте использование маркерного CompiledModel.Name TLC. Лексема разрешена, и получившееся имя файла включено в поток вывода. Можно указать другую информацию, такую как пути и библиотеки, в потоке вывода путем определения других лексем, заданных в model.rtw. Например, System.Name может быть задан как <Root>/Subsystem1.

Теперь предположите, что test.tlc вызывается во время процесса сборки цели, где генерирующейся моделью является mymodel. Это должно быть сделано после оператора codegenentry. Например, test.tlc мог быть включен непосредственно в системном конечном файле:

%include "codegenentry.tlc"
%include "test.tlc"

Также директива %include "test.tlc" могла быть вставлена в файл рычага mytarget_genfiles.tlc, если существующий.

Лексемы TLC такой как

<file><name>%<CompiledModel.Name>.c<\name>

расширены, с записью CompiledModel в файле mymodel.rtw, как в

<file><name>mymodel.c<\name>

test.tlc генерирует XML-файл, файл model_project.xml, из модели. model_project.xml содержит ссылки на файлы сгенерированного кода. model_project.xml может быть импортирован в CodeWarrior IDE как проект.

Следующая блок-схема обобщает этот процесс.

Примечание

Этот процесс имеет недостатки. Во-первых, вручную редактирование XML-файла, экспортируемого из проекта канцелярской бумаги CodeWarrior, может быть трудоемкой задачей, включающей модификацией нескольких дюжин строк, встроенных в нескольких тысячах строк кода XML. Во-вторых, если вы вносите изменения в проект CodeWarrior после импорта сгенерированного XML-файла, XML-файл должен быть экспортирован и вручную отредактирован еще раз.

Автоматизация Процесса сборки.  Приложение, которое поддерживает автоматизацию COM, может управлять другими приложениями, которые включают COM-интерфейс. Используя функции автоматизации MATLAB® COM, файл MATLAB может управлять, чтобы COM-совместимая система разработки выполнила задачи, требуемые процессом сборки.

Функции автоматизации COM MATLAB, описанные в этом разделе, документируются в COM-объекты (MATLAB).

Для получения информации о командах автоматизации, поддержанных CodeWarrior IDE, см. свою документацию CodeWarrior.

Автоматизация COM используется некоторыми целевыми процессорами, чтобы автоматизировать CodeWarrior IDE, чтобы выполнить задачи, такие как:

  • Открытие нового сеанса CodeWarrior

  • Сконфигурируйте проект

  • Загрузка файла проекта CodeWarrior

  • Удаление объектного кода из проекта

  • Создание или восстановление проекта

  • Отладьте приложение

Технология COM автоматизирует определенные повторяющиеся задачи и позволяет пользователю взаимодействовать непосредственно с внешним приложением. Например, когда конечный пользователь возможности целевых процессоров инициирует сборку, цель быстро вызывает действия CodeWarrior и оставляет проект созданным и готовым запуститься с IDE.

Пример Функции Автоматизации COM.  Функции ниже используют команду actxserver MATLAB, чтобы вызвать функции COM для управления CodeWarrior IDE от файла MATLAB:

  • CreateCWComObject: Создайте связь COM с CodeWarrior IDE.

  • OpenCW: Откройте CodeWarrior IDE, не открывая проект.

  • OpenMCP: Откройте файл проекта CodeWarrior (файл .mcp) заданный входным параметром.

  • BuildCW: Откройте заданный файл .mcp, удалите объектный код и разработайте проект.

Эти функции являются примерами; они не составляют полное внедрение интерфейса автоматизации COM. Если ваша цель создает файл проекта во время генерации кода, функция BuildCW верхнего уровня должна быть вызвана после того, как процесс генерации кода завершается. Обычно BuildCW был бы назван из метода exit вашего файла STF_make_rtw_hook.m (см. STF_make_rtw_hook.m).

В примерах кода переменная in_qualifiedMCP принята, чтобы сохранить полностью определенный путь к файлу проекта CodeWarrior (например, путь, имя файла и расширение). Например:

in_qualifiedMCP = 'd:\work\myproject.mcp';

В фактической практике ваш код ответственен за определение соглашений, используемых для имени файла проекта и местоположения. Одно простое соглашение состояло бы в том, чтобы принять значение по умолчанию к файлу проекта model.mcp, расположенный в папке сборки вашей цели.

%======================================================================
% Function: CreateCWComObject
% Abstract: Creates the COM connection to CodeWarrior
%
function ICodeWarriorApp = CreateCWComObject
  vprint([mfilename ': creating CW com object']);
  try
    ICodeWarriorApp = actxserver('CodeWarrior.CodeWarriorApp');
  catch
    error(['Error creating COM connection to ' ComObj ...
       '. Verify that CodeWarrior is installed. Verify COM access to
CodeWarrior outside of MATLAB.']);
  end
  return;


%======================================================================
% Function: OpenCW
% Abstract: Opens CodeWarrior. Returns the
%           handle ICodeWarriorApp.
%
function ICodeWarriorApp = OpenCW()
  ICodeWarriorApp = CreateCWComObject;
  CloseAll;
  OpenMCP(in_qualifiedMCP);


%=====================================================================
% Function: OpenMCP
% Abstract: open an MCP project file
%
function OpenMCP(in_qualifiedMCP)
  % Argument checking. This method requires valid project file.
  if ~exist(in_qualifiedMCP)
      error([mfilename ': Missing or empty project file argument']);
  end
  if isempty(in_qualifiedMCP)
      error([mfilename ': Missing or empty project file argument']);
  end
  ICodeWarriorApp = CreateCWComObject;
  vprint([mfilename ': Importing']);
  try
    ICodeWarriorProject = ...
      invoke(ICodeWarriorApp.Application,...
      'OpenProject', in_qualifiedMCP,...
      1,0,0);
  catch
    error(['Error using COM connection to import project. ' ...
       ' Verify that CodeWarrior is installed. Verify COM access to
CodeWarrior outside of MATLAB.']);
  end


%=====================================================================
% Function: BuildCW
% Abstract: Opens CodeWarrior.
%           Opens the specified CodeWarrior project.
%           Deletes objects.
%           Builds.
%
function ICodeWarriorApp = BuildCW(in_qualifiedMCP)
    % ICodeWarriorApp = BuildCW;
    ICodeWarriorApp = CreateCWComObject;
    CloseAll;
    OpenMCP(in_qualifiedMCP);
    try
      invoke(ICodeWarriorApp.DefaultProject,'RemoveObjectCode', 0, 1);
    catch
      error(['Error using COM connection to remove objects of current project. ' ...
       'Verify that CodeWarrior is installed. Verify COM access to
CodeWarrior outside of MATLAB.']);
    end
    try
      invoke(ICodeWarriorApp.DefaultProject,'BuildAndWaitToComplete');
    catch
      error(['Error using COM connection to build current project. ' ...
       'Verify that CodeWarrior is installed. Verify COM access to
CodeWarrior outside of MATLAB.']);
    end

Похожие темы