Перейти к содержанию

Есть сделанные в Матлабе алгоритмы, как наиболее правильным образом (настройки и т.п.) сгенерировать Си код, для последующей компиляции Кейлом или ИАРом для STM32F4 и F7 ?
(у F4 флоат только сингл, у F7 и дабл).

Или может я не в тот раздел написал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Allregia @ Nov 22 2017, 15:25) <{POST_SNAPBACK}>
Есть сделанные в Матлабе алгоритмы, как наиболее правильным образом (настройки и т.п.) сгенерировать Си код, для последующей компиляции Кейлом или ИАРом для STM32F4 и F7 ?
(у F4 флоат только сингл, у F7 и дабл).

Или может я не в тот раздел написал?

В MATLAB double нативный формат. Вы хотите, чтобы он заменил double на float при генерации из m-скрипта в сишный код? Я думаю, нужно явно в скрипте приводить переменные к float...
Раньше при кодогенерации MATLAB даже счетчики циклов в Си делал double. Вроде бы сейчас такого уже нет.

Оказалось, что можно более грамотно сделать: https://www.mathworks.com/help/fixedpoint/u...ion-c-code.html

Код
scfg = coder.config('single')

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Я не только формат float имел ввиду, а и вообще как все правильно сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Правильно посмотреть первые 4 ссылки в гугл.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Во 1-х. сразу скажыу я этот вопрос задал по просьбе коллег, сам я с матлабом слабо дружу.
Во 2-х:
Я не смотрел сейчас, но на 100% уверен, что "первые 4 ссылки в Гугл", показывают на stm32-mat-target.
В документации к нему расписывется интеграция с Смулинком и Кубом, плюс отладка через jtag в железе.
Мы не используем Куб, программы для STM32 пишутся в IAR или Keil, а к ним пристыковываются исходники из-под матлаба.
Делают это Кодером, но есть мнение, что делаю это не правильно.
В настройках кодера есть target, и там стоит MS Visual C++ 64bit.
И мы вовсе не уверены, что сгенеренный для 64 бит Вижуала код, получается также хорош для 32-битного Кортекса, поотому и задал вопрос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
У вас MATLAB скрипты или алгоритмы разрисованы в Simulink или Stateflow?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Grizzzly @ Nov 22 2017, 15:38) <{POST_SNAPBACK}>
В MATLAB double нативный формат. Вы хотите, чтобы он заменил double на float при генерации из m-скрипта в сишный код? Я думаю, нужно явно в скрипте приводить переменные к float...
Раньше при кодогенерации MATLAB даже счетчики циклов в Си делал double. Вроде бы сейчас такого уже нет.

Матлаб давным-давно умеет приводить свои результаты расчётов к float или целочисленным типам. Много лет назад когда я в симулинке считал фильтры, то сохранял их коэффициенты потом в целочисленке.
Вкладка делающая это называлась как-то типа: "Квантование". вроде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Allregia @ Nov 23 2017, 08:40) <{POST_SNAPBACK}>
В настройках кодера есть target, и там стоит MS Visual C++ 64bit.
И мы вовсе не уверены, что сгенеренный для 64 бит Вижуала код, получается также хорош для 32-битного Кортекса, поотому и задал вопрос.

Похоже вы делаете также как и я.
Simulink когда генерит код рассчитывает на некий готовый фреймворк на платформе.
А мне такое не нужно. Поэтому генерю весь пакет файлов, но беру от туда только главный код и h-файл с объявлением типов.
Компиляцией в самом Matlab не пользуюсь. Поэтому параметры касающиеся toolchain не имеют значения.
Правда приходится править интерфейсы функций и передачу аргументов для совместимости с моим фреймворком.
Иногда чтобы подстроить модель под мой стиль передачи параметров приходится переусложнять модель в Simulink.
Короче разработка итерационная: строю модель, генерю код, смотрю как вышло, если не нравится переделываю модель чтоб сгенерила по другому.

У меня такие настройки для code generation:
[attachment=109908:Dialog1.PNG]
[attachment=109909:Dialog2.PNG]

Сгенерированный код отлично работает под Cortex-M4. Проверено многократно. Хорошо оптимизируется.
Варианты double от float отличается только тем, что в последнем идут суффиксы f у всех чисел с плавающей точкой.

Если проектируете фильтры, то Matlab покажет как различаются характеристики после усечения точности.
Но не гарантирует, что фильтр построенный в Simulink бедет работать правильно. Надо все перепроверять там же.
Перевод модели из нативного double в урезанный float без потери стабильности всегда ручная и сложная работа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(jcxz @ Nov 23 2017, 13:27) <{POST_SNAPBACK}>
Матлаб давным-давно умеет приводить свои результаты расчётов к float или целочисленным типам. Много лет назад когда я в симулинке считал фильтры, то сохранял их коэффициенты потом в целочисленке.
Вкладка делающая это называлась как-то типа: "Квантование". вроде.

Это всегда так было. А вот с генерацией сишного кода раньше были странности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата
Правда приходится править интерфейсы функций и передачу аргументов для совместимости с моим фреймворком.
Иногда чтобы подстроить модель под мой стиль передачи параметров приходится переусложнять модель в Simulink.

Раз уж пошла такая пьянка, не поделимся опытом, кто как вводит/выводит сигналы из Симулинка?
Лично я не использую I/O порты, а определяю нужные сигналы как ImportedGlobal. Тогда Матлаб их определяет как external и их можно задекларировать в любом куске программы.

Цитата
Короче разработка итерационная: строю модель, генерю код, смотрю как вышло, если не нравится переделываю модель чтоб сгенерила по другому.

Моделирование забыли. Я смотрю, как оно работает в модели и генерю код, только когда полностью доволен поведением. Тогда проверка в железе чисто формальная. Модели для моделирования и генерации кода - разные. В первой контроллер подключен к Test Harness, которая состоит из эмулятора контролируемого процесса и собственно GUI - ну там кнопочки понажимать, симитировать аварийные ситуации. Вторая модель - чисто для генерации кода - там та же модель контроллера подключена к I/O сигналам. Также в некоторых случаях вызываю свои Legacy Cи функции - Matlab их тогда просто вставляет в код.

Вот что хотел бы как-нибудь запустить на своем ARMe - так это External Mode. Чтобы наблюдать внутренности модели, когда она работает в реальном времени на железяки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(syoma @ Nov 23 2017, 10:59) <{POST_SNAPBACK}>
У вас MATLAB скрипты или алгоритмы разрисованы в Simulink или Stateflow?


Скрипты.
Симулинком не пользуются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Allregia @ Nov 24 2017, 14:46) <{POST_SNAPBACK}>
Скрипты.
Симулинком не пользуются.

В матлабе есть подробная инструкция как генерировать C-и файлы из m файлов.
Их нее следует, что все типы назначаются руками.
А если не объявлены, то их надо объявить.
Волшебного превращения алгоритмов из double во float не происходит.
Сгенерит-то сгенерит с другими типами, но сходимость алгоритма после этого матлаб никому не обещает.
Надо запускать отладку и перепроверять весь алгоритм сверху до низу.
Кстати я сравнивал результаты алгоритмов управления в float point в Simulink и сгенерированный им проект для Cortex-M4 по одной и той же выборке реальных данных (1000 отсчетов).
И они совпали только до 4-5-го знака.
Т.е. стандарт float point по умолчанию у сопроцессора Cortex не совпадает с Matlab-овским в какой-то мелочи.

Цитата(syoma @ Nov 24 2017, 10:50) <{POST_SNAPBACK}>
Вот что хотел бы как-нибудь запустить на своем ARMe - так это External Mode. Чтобы наблюдать внутренности модели, когда она работает в реальном времени на железяки.

На Cortex-M3..7 совершенно не реально.
А вот в LabVIEW я видел специальный стек протоколов отладочного движка специально под RTOS RTX от Keil-а .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата
На Cortex-M3..7 совершенно не реально.

Дык вроде как в примерах для Discovery такое присутствует. Надо только разобраться...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(AlexandrY @ Nov 24 2017, 18:37) <{POST_SNAPBACK}>
И они совпали только до 4-5-го знака.
Т.е. стандарт float point по умолчанию у сопроцессора Cortex не совпадает с Matlab-овским в какой-то мелочи.

Наверное, всё-таки из-за различия FPU Cortex и сопроцессора на ПК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Может поделитесь, чем же вы таким в матлабе занимаетесь, что потом это на STM32 запускаете? Я, как говорится, всю ночь не спал, не мог придумать, как можно скрестить матлаб и STM32... Ладно еще для плисины код генерировать, но для элементарного микроконтроллера?..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация