Используйте 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.HardwareImplementation
| coder.hardware
| packNGo