Базовая работа в сети с Matlab Coder

Я пытаюсь получить очень простые сетевые функции с помощью Matlab Coder (мне нужно превратить его в код C). Однако все сетевые классы и объекты, которые я пробовал, не поддерживаются Coder. Кажется неразумным, что Matlab полностью пренебрегает сетью с этим инструментом. Есть ли способ отправки данных по сети, который РАБОТАЕТ с кодером?

Я бы предпочел TCP, но UDP или что-то еще, что действительно будет отправлять/получать данные, будет работать, если оно совместимо с Coder.


person GreySage    schedule 27.07.2015    source источник
comment
Matlab Coder - это то, над чем Mathworks все еще много работает, поэтому они, возможно, пропустили его ... Вы всегда можете написать свой собственный код C и смешать его.   -  person Ander Biguri    schedule 27.07.2015
comment
Как mex-файлы взаимодействуют с Coder?   -  person GreySage    schedule 27.07.2015


Ответы (2)


Этот ответ предполагает, что набор инструментов системы DSP недоступен. Если это так, системные объекты dsp.UDPSender и dsp.UDPReceiver можно рассмотреть.

Поскольку конечной целью является генерация кода C, а сетевой ввод-вывод обычно выполняется через библиотеку, хорошим подходом будет интеграция внешнего кода C, который выполняет сетевой ввод-вывод, в ваш код MATLAB. Основным способом вызова внешней функции C является использование coder.ceval, и процесс объясняется здесь.

Рекомендуемые шаги

  1. Напишите функции C(++), реализующие нужное вам поведение, или найдите библиотеку C, обеспечивающую необходимую функциональность. Предположим, мы реализуем функцию externalUDPSend в файлах externalUDPSend.h/.c.
  2. Напишите одну или несколько функций MATLAB, которые вызывают ваши функции C (++), используя coder.ceval, как показано в связанной документации. Они будут служить оболочкой для вашего внешнего кода и будут предоставлять код C(++) для MATLAB. Что-то вроде callfoo в связанном примере будет работать:

    function y = useExternalUDP(x)
    %#codegen
    if coder.target('MATLAB')
      % Running in MATLAB. Use standard MATLAB
      % network I/O code here
      ...
    else
      % Generating code. Call external code/library
      % Include header for external code
      coder.cinclude('externalUDPSend.h');
    
      % Set the type of the output. Assume double scalar
      % Change the RHS to match the return type
      y = 0;
      y = coder.ceval('externalUDPSend',x,numel(x));
    end
    
  3. Развивайте свой проект. Вызовите функции-оболочки, которые будут работать в MATLAB и в сгенерированном коде из-за использования coder.target.
  4. Создайте функцию MEX, используя что-то вроде:

    codegen useExternalUDP -config:mex externalUDPSend.c -args ...
    

    Сгенерированная функция MEX служит интерфейсом MATLAB для вашего пользовательского кода, поэтому нет необходимости писать интерфейс MEX вручную. MATLAB Coder сгенерирует для вас всю логику интерфейса MEX. Затем проверьте эту функцию MEX в MATLAB. Тестирование функции MEX важно, поскольку ошибки времени выполнения, такие как индексация за пределами границ, использование функций, не поддерживаемых для генерации кода, и т. д., могут быть обнаружены и зарегистрированы в MEX. Эти проверки удаляются из сгенерированного автономного кода.

  5. Создайте автономный код и либо позвольте MATLAB Coder скомпилировать его в библиотеку, либо разверните код во внешней IDE и скомпилируйте его там.

Интеграция внешних библиотек/инкапсуляция зависимостей

Обратите внимание, что вам также может понадобиться связать библиотеки, если вы решите использовать существующую сетевую библиотеку ввода-вывода, или вам может потребоваться изменить сборку сгенерированного кода. Вы можете использовать coder.updateBuildInfo или coder.ExternalDependency для достижения этого в вашей Код МАТЛАБ.

Дальнейшее чтение

В примере чтения файла показаны более сложные пользовательские инструменты интеграции кода, такие как coder.ref, coder.opaque, и работа со строками C из кода MATLAB при вызове внешнего кода. Обратите внимание, что функции MATLAB fprintf и fread поддерживаются для генерации кода, поэтому этот пример предназначен скорее для обучения, чем для выполнения файлового ввода-вывода.

person Community    schedule 27.07.2015
comment
Я не думаю, что необходимо вручную писать MEX-функцию C на шаге 1. Скорее, это может быть простой код C без MEX-интерфейса, который обеспечивает необходимую сетевую связь. Затем используйте coder.ceval для вызова этого кода C из вашего кода MATLAB, как показано в примере. Чтобы протестировать в MATLAB, используйте MATLAB Coder, чтобы сгенерировать файл MEX, который вызывает ваш пользовательский код, используя codegen ... -config:mex... или c = coder.config('mex');. После завершения тестирования сгенерируйте код по мере необходимости. - person Ryan Livingston; 27.07.2015
comment
Я думаю, что это решит мою проблему, хотя это и не совсем ответ на вопрос. Чтобы было ясно, вы выступаете за запуск сетевого кода в файле MEX? - person GreySage; 28.07.2015
comment
Мой комментарий был предназначен для уточнения требований к шагу 1. Настоятельно рекомендуется протестировать сгенерированный файл MEX, поскольку он может сообщать об ошибках времени выполнения, тогда как сгенерированный код не будет иметь этих проверок ошибок. Также он позволяет тестировать в интерактивной среде MATLAB. Как только MEX заработает хорошо, вы сможете с уверенностью генерировать автономный код. - person Ryan Livingston; 28.07.2015
comment
@ lilbill39: Вы определенно знаете кодировщик Matlab лучше, чем я. Сделал ответ вики-ответом, если вы считаете, что что-то нужно изменить, обновите его. - person Daniel; 28.07.2015
comment
@Daniel, спасибо, это было обновлено. На самом деле я работаю над MATLAB Coder, так что я получил свои знания о нем. - person Ryan Livingston; 28.07.2015

Если у вас есть DSP System Toolbox, системные объекты dsp.UDPSender и dsp.UDPReceiver поддерживаются для генерации кода, поскольку они перечислены в полный список поддерживаемых функций.

Сгенерированный из них код опирается на готовые библиотеки, поставляемые с MATLAB, и будет работать на настольных платформах, совместимых с этими библиотеками. Дополнительную информацию см. в документации по блоку получения UDP.

person Ryan Livingston    schedule 27.07.2015