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

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

| |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте