Разверните сгенерированный код C на внешнем оборудовании: примеры Raspberry Pi

Используйте 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 объекту настройки, параметры аппаратной реализации устанавливаются соответственно.

Пример Hello World

Сгенерируйте исходный код C для внешнего оборудования

Считайте элементарный 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!

Системный пример демпфера массы Spring

Сгенерируйте исходный код для системы демпфера массы Spring

Этот пример показывает, как сгенерировать исходный код 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 во время выполнения.

Смотрите также

| |

Похожие темы