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

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

Пример 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!

Пружина пример системы демпфера массы

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

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

См. также

| |

Похожие темы