exponenta event banner

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

Используйте MATLAB ® Coder™ для создания кода C для базовых или расширенных алгоритмов MATLAB, а затем разверните алгоритмы на внешних аппаратных платформах. В этих примерах показаны сценарии развертывания платформы Raspberry Pi™. Такие платформы, как Raspberry Pi, можно использовать для прототипирования более сложного или масштабного рабочего процесса развертывания. Raspberry Pi работает под управлением 32-разрядной операционной системы Linux ® на процессоре ARM ®.

На этом рисунке показан сгенерированный код для алгоритма демпфера массы пружины, работающего на Raspberry Pi. Основная функция C для алгоритма включает в себя ввод USB мыши с помощью интерфейса файла устройства Linux.

Предпосылки

  • Малиновый Pi модель 3 B +. Старые модели оборудования Raspberry Pi могут демонстрировать пониженную производительность.

  • Сетевой доступ или другой механизм передачи файлов, например, устройство чтения карт microSD.

  • Подключение к удаленному рабочему столу или внешний монитор.

  • Проводная мышь USB для ввода с малой задержкой.

Параметры реализации аппаратных средств

При генерации кода для внешнего аппаратного обеспечения генератору кода требуется знание параметров настройки аппаратных средств-платформ, как указано в coder.HardwareImplementation объект. Этот объект содержит параметры реализации, которые влияют на допущения, сделанные генератором кода и важные для достижения ожидаемого поведения.

Например, рассмотрим Raspberry Pi под управлением 32-разрядной Linux и 8-разрядную платформу Arduino ®. Компилятор C на Arduino присваивает int 16 бит, тогда как для Raspberry Pi компилятор C назначает 32 бита. При создании кода C, использующего int объявления переменных, то выполнение одного и того же кода на обеих платформах может вызвать различное поведение переполнения целых чисел.

Из-за этих различий в платформах установите параметры реализации аппаратного обеспечения специально для любой платформы, на которой предполагается запустить сгенерированный код. По умолчанию параметры задаются для хост-платформы MATLAB. Для установки параметров оборудования можно использовать приложение или командную строку MATLAB Coder или пакет поддержки оборудования.

Установка параметров с помощью приложения и командной строки

Установка параметров реализации аппаратных средств через coder.HardwareImplementationоткройте объект конфигурации в приложении Кодер MATLAB. Например:

cfg = coder.config('lib');
open cfg;

Сконфигурируйте параметры реализации для Raspberry Pi. Щелкните панель «Оборудование» и выберите поставщика устройства в качестве ARM Compatible и тип устройства как 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-файле. Затем используйте Linux gcc для создания исполняемого файла. Назовите его 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);

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 выполняет сгенерированный код для моделирования перемещения системы демпфера массы пружины во времени. Функция использует USB-ввод мыши из Raspberry Pi для приложения силы к массе. Сила силы пропорциональна скорости горизонтального перемещения мыши. Если мышь не перемещается, в примере моделируется невынужденная динамика. Чтобы обеспечить визуализацию динамики, основной файл включает в себя подпрограмму печати положения массы во времени.

Файл устройства.  Чтобы использовать мышь, необходимо определить, какой файл устройства в системе соответствует мышке. На платформе Linux вход внешнего USB-устройства записывается в файл устройства, хранящийся в /dev/input/ папка. /dev/input/ обычно содержит файлы для нескольких устройств ввода. Чтобы определить, какой файл соответствует вашей USB-мыши, используйте od для каждого файла и проверьте, какие файлы обновляются в ответ на перемещение мыши.

od filename

Сборка  . Чтобы создать код из терминала Linux, перейдите в папку, куда были переданы файлы. Распакуйте zip-файл. Используйте gcc и укажите все .c файлы из примера формообразующего элемента пружины:

gcc *.c -o springMassSim -lm

-lm флаг указывает компилятору на связь с требуемыми математическими библиотеками Си. Чтобы запустить исполняемый файл, укажите ранее идентифицированный файл USB-устройства мыши. Предполагается, что event0:

./springMassSim /dev/input/event0

Переместите мышь, чтобы применить силу к массе и просмотреть результирующую динамику. Если масса не реагирует на перемещение мыши, попробуйте указать другой файл устройства. Прервать программу путем ввода ctrl + c во время выполнения.

См. также

| |

Связанные темы