Использование 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