Используйте MATLAB® Coder™, чтобы сгенерировать код С для основных или усовершенствованных алгоритмов MATLAB, и затем развернуть алгоритмы в платформы внешнего оборудования. Эти примеры показывают сценарии развертывания для платформы Raspberry Pi™. Можно использовать платформы, такие как Raspberry Pi, чтобы моделировать рабочий процесс развертывания более комплексного или более широкого масштаба. Raspberry Pi запускает 32-битную среду операционных систем Linux® на процессоре ARM®.
Этот рисунок показывает сгенерированный код для пружинного массового алгоритма демпфера, работающего на Raspberry Pi. Основная функция C для алгоритма включает вход мыши USB при помощи интерфейса файла устройств Linux.
Модель 3 B Raspberry Pi +. Более старые модели оборудования Raspberry Pi могут показать уменьшаемую эффективность.
Сетевой доступ или другой механизм передачи файлов, такой как средство чтения карты памяти microSD.
Связь удаленного рабочего стола или внешний монитор.
Соединенная проводом мышь USB для низкой задержки вводится.
При генерации кода для внешнего оборудования генератор кода требует знания настроек аппаратной платформы, как задано coder.HardwareImplementation
объект. Этот объект содержит параметры реализации, которые влияют на предположения, сделанные генератором кода и которые важны для достижения ожидаемого поведения.
Например, рассмотрите Raspberry Pi, запускающий 32-битный Linux и 8-битную платформу Arduino®. Компилятор C на Arduino присваивает int
16 битов, тогда как для Raspberry Pi, компилятор C присваивает 32 бита. Если вы генерируете код С, который использует int
объявления переменной, затем запуская тот же код по обеим платформам могут вызвать различное поведение целочисленного переполнения.
Из-за этих различий в платформе, установленных параметры аппаратной реализации специально для того, какой бы ни платформа вы ожидаете работать на сгенерированном коде. По умолчанию параметры устанавливаются для серверной платформы MATLAB. Можно использовать приложение MATLAB Coder или командную строку, чтобы установить аппаратные параметры, или можно использовать Пакет Аппаратной поддержки.
Устанавливать параметры аппаратной реализации через coder.HardwareImplementation
, откройте свой объект настройки в приложении MATLAB Coder. Например:
cfg = coder.config('lib'); open cfg;
Сконфигурируйте параметры реализации для Raspberry Pi. Кликните по панели Hardware и выберите Device vendor как ARM Compatible
и Device type как ARM Cortex
. Этот выбор эквивалентен вводу:
cfg.HardwareImplementation.ProdHWDeviceType = 'ARM Compatible->ARM Cortex';
Установка ProdHWDeviceType
параметр инициировал соответствующие настройки для всех других coder.HardwareImplementation
параметры.
Если у вас есть доступ к Пакету Поддержки MATLAB для Оборудования Raspberry Pi, можно настроить связь с Raspberry Pi из среды MATLAB. Можно установить coder.HardwareImplementation
настройки путем выбора Raspberry Pi
в меню Hardware Board в приложении MATLAB Coder, или из командной строки, путем ввода:
cfg = coder.config('lib'); hwObj = coder.hardware('Raspberry Pi'); cfg.Hardware = hwObj;
coder.hardware
функция создает coder.Hardware
объект. Когда вы присваиваете coder.Hardware
возразите против объекта настройки, параметры аппаратной реализации устанавливаются соответственно.
Считайте элементарный MATLAB функцией Hello World.
function helloworld %#codegen fprintf('Hello world!\n');
Создайте настройку, возражают и задают генерацию исходного кода. Установите параметры аппаратной реализации для Raspberry Pi.
cfg = coder.config('lib','ecoder',false); cfg.GenCodeOnly = true; cfg.HardwareImplementation.ProdHWDeviceType = 'ARM Compatible->ARM Cortex';
Сгенерируйте код:
codegen -config cfg helloworld -report
Можно группировать сгенерированный код для передачи файлов при помощи packNGo
функция. Эта функция создает zip-файл, содержащий необходимые файлы сгенерированного кода. packNGo
функция не включает сгенерированный пример основные файлы, которые можно использовать, чтобы скомпилировать код в исполняемый файл. Переместите сгенерированный пример основные файлы или ваши собственные рукописные основные файлы отдельно.
Из директории, из которой вы вошли codegen
команда, соберите файлы для развертывания:
myBuildInfoFile = 'codegen/lib/helloworld/buildInfo.mat'; load(myBuildInfoFile); packNGo(buildInfo); movefile ./codegen/lib/helloworld/examples/main.c movefile ./codegen/lib/helloworld/examples/main.h
Передайте файлы от своей хост-машины рабочий MATLAB к вашей цели внешнего оборудования. Можно использовать программу передачи файлов для платформы или прямых команд, таких как scp
с целевым IP-адресом Raspberry Pi.
Если вы передали файлы директории, от терминального, запускаете unzip
на zip-файле. Затем используйте gcc
Linux создайте инструмент, чтобы создать исполняемый файл. Назовите его
helloworld
с -o
опция:
gcc helloworld.c helloworld_initialize.c helloworld_terminate.c main.c -o helloworld
Запускать исполняемый файл и проверять, что сборка была успешна, введите:
./helloworld
Дисплеи терминала выход:
Hello world!
В этом примере показано, как сгенерировать исходный код C для пружинной массовой системы демпфера, которую можно затем создать и работать на Raspberry Pi.
Модель демпфера массы Spring
Пружинная массовая система с затуханием является основной системой в механике и динамике. При помощи уравнений движения можно решить для смещения массы в ответ на различные начальные условия и внешние силы.
Функциональный springMassEqns
кодирует уравнения движения в форме двух линейных дифференциальных уравнений первого порядка. Переменные dxdt(1)
и dxdt(2)
скорость и ускорение массы, соответственно. Переменная x(1)
представляет положение массы.
function dxdt = springMassEqns(t,x,x0,k,m,c,F)
dxdt = zeros(2,1);
dxdt(1) = x(2);
dxdt(2) = F/m - k/m*(x(1)-x0) - c/m*x(2);
Алгоритм MATLAB
Симулировать смещение как функцию времени, функционального springMassStep
применяет решатель ОДУ ode45
к уравнениям движения.
function [x] = springMassStep(xi,vi,ti,dt,g) %#codegen % Set spring equilibrium position x0 = 1; % Set spring, mass, damper constants k = 1000; m = 10; c = 25; % Scale acceleration g like a gravity force F = m*g; % Solve ODE for displacement at ti + dt initCond = [xi vi]; tspan = [ti ti+dt]; [~,x] = ode45(@(t,x) springMassEqns(t,x,x0,k,m,c,F),tspan,initCond);
springMassTakeStep
вызовы функции springMassStep
функционируйте и возвращает итоговое смещение в конце фиксированного временного интервала.
function [xf, vf] = springMassTakeStep(xi,vi,ti,dt,g) %#codegen % Function springMassTakeStep acts as a wrapper for the ODE solving function, step. % It takes the same input parameters as springMassStep, but only outputs the final % position and velocity. x = springMassStep(xi,vi,ti,dt,g); xf = x(end,1); vf = x(end,2);
Результаты алгоритма
Изучать типичное поведение модели и алгоритма, скрипта springMassSim
симулирует систему в типичной области значений параметра. Выходные результаты показывают смещение массы как функция времени. Можно настроить начальные условия, параметры модели, и обеспечивающий функцию, чтобы видеть, как модель отвечает.
springMassSim
Сгенерируйте исходный код C
После проверки, что модель MATLAB работает как ожидалось, сгенерируйте исходный код C для развертывания.
xi = 0.5; vi = 0; ti = 0; dt = .01; g = 0; cfg = coder.config('lib','ecoder',false); cfg.GenCodeOnly = true; cfg.HardwareImplementation.ProdHWDeviceType = 'ARM Compatible->ARM Cortex'; codegen springMassTakeStep -args {xi,vi,ti,dt,g} -config cfg -report
Code generation successful: To view the report, open('codegen/lib/springMassTakeStep/html/report.mldatx').
После генерации исходного кода C для алгоритма можно изменить пример main.c
и main.h
файлы для вашего приложения. В данном примере прикрепленный файл springMass_main.c
показывает, как использовать сгенерированный код. Соответствующий заголовочный файл springMass_main.h
также присоединен к предыдущему примеру со вспомогательными файлами.
Из директории, от который вы сгенерированный код, соберите файлы для развертывания:
myBuildInfoFile = 'codegen/lib/springMassTakeStep/buildInfo.mat';
load(myBuildInfoFile);
packNGo(buildInfo);
Передайте zip-файл и ваш основной .c
и .h
файл от вашей хост-машины, которая запускает MATLAB к цели. Можно использовать программу передачи файлов для платформы или прямых команд, таких как scp
с целевым IP-адресом Raspberry Pi.
MainFile . Основной функциональный springMass_main.c
выполняет сгенерированный код, чтобы симулировать смещение пружинной массовой системы демпфера в зависимости от времени. Функция использует вход мыши USB от Raspberry Pi, чтобы передать силу на массе. Сила силы пропорциональна скорости горизонтального движения мыши. Если вы не перемещаете мышь, пример симулирует добровольную динамику. Чтобы обеспечить визуализацию динамики, основной файл включает стандартную программу, чтобы распечатывать положение массы в зависимости от времени.
Файл устройств. Чтобы использовать вход мыши, необходимо идентифицировать, какой файл устройств в системе соответствует мыши. На платформе Linux внешний вход USB-устройства зарегистрирован в файле устройств, сохраненном в /dev/input/
папка. /dev/input/
папка обычно содержит файлы для нескольких устройств ввода данных. Чтобы идентифицировать, какой файл соответствует вашей мыши USB, используйте od
команда на каждом файле и проверка, чтобы видеть, какой файл обновляется в ответ на движение мыши.
od filename
Сборка. Чтобы создать код из терминала Linux, перейдите к местоположению, куда вы передали свои файлы. Разархивируйте zip-файл. Используйте gcc
команда и задает весь .c
файлы из пружинного массового примера:
gcc *.c -o springMassSim -lm
-lm
флаг дает компилятору команду соединяться с необходимыми математическими библиотеками C. Чтобы запустить исполняемый файл, задайте ранее идентифицированный файл устройств мыши USB, здесь принятый, чтобы быть event0
:
./springMassSim /dev/input/event0
Переместите мышь, чтобы прикладывать силу к массе и просмотреть получившуюся динамику. Если масса не отвечает на движение мыши, попытайтесь задать различный файл устройств. Отключите программу путем ввода ctrl + c
во время выполнения.
coder.hardware
| coder.HardwareImplementation
| packNGo