Использование MATLAB® Coder™ сгенерировать Код С для базовых или расширенных алгоритмов MATLAB, а затем развернуть алгоритмы на внешнее оборудование платформах. Эти примеры показывают сценарии развертывания для платформы Raspberry Pi™. Можно использовать такие платформы, как Raspberry Pi, для прототипа более сложного или крупного рабочего процесса развертывания шкалы. Raspberry Pi работает на 32-битном Linux® окружение операционной системы на ARM® процессора.
Этот рисунок показывает сгенерированный код для алгоритма пружины массового демпфера, выполняемого на Raspberry Pi. Основная функция C для алгоритма включает вход USB-мыши с помощью файлового интерфейса устройства Linux.

Raspberry Pi Model 3 B +. Старые модели оборудования 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.
Модель Пружины демпфера массы
Система пружины масс с демпфированием является основной системой в механике и динамике. При помощи уравнений движения можно решить перемещение массы в ответ на различные начальные условия и внешние силы.
Функция 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);
The 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.
Основной файл. Основная функция springMass_main.c выполняет сгенерированный код, чтобы симулировать перемещение системы демпфера массы пружины с течением времени. Функция использует вход мыши от Raspberry Pi, чтобы придать массе силу. Сила силы пропорциональна скорости горизонтального движения мыши. Если вы не перемещаете мышь, в примере моделируется невынужденная динамика. Чтобы обеспечить визуализацию динамики, основной файл включает стандартную программу для печати положения массы с течением времени.
Файл устройства. Чтобы использовать вход мыши, необходимо определить, какой файл устройства в вашей системе соответствует файлу мыши. На платформе Linux вход внешнего USB-устройства записывается в файл устройства, хранящийся в /dev/input/ папка. The /dev/input/ папка обычно содержит файлы для нескольких устройств входа. Чтобы идентифицировать файл, соответствующий вашей USB-мыши, используйте od команда на каждом файле и проверьте, чтобы увидеть, какие файлы обновляются в ответ на перемещение мыши.
od filename
Build.Чтобы создать код с терминала Linux, перейдите в место, куда вы передали свои файлы. Разархивируйте zip- файла. Используйте gcc и задайте все .c файлы из примера весенней массы:
gcc *.c -o springMassSim -lm
The -lm флаг предписывает компилятору ссылаться на необходимые математические библиотеки C. Чтобы запустить исполняемый файл, укажите ранее идентифицированный файл устройства USB-мыши, здесь принятый как event0:
./springMassSim /dev/input/event0
Переместите мышь, чтобы применить силу к массе и просмотреть полученную динамику. Если масса не реагирует на перемещение мыши, попробуйте задать другой файл устройства. Завершите программу путем ввода ctrl + c во время выполнения.
coder.hardware | coder.HardwareImplementation | packNGo