Диагностируйте ошибки компиляции библиотеки стандартных шаблонов (STL) C++ для приложения реального времени

Чтобы включить проект C++, я упаковываю источник в блок S-Function, который совместим с Simulink® Desktop Real-Time™ цель генерации кода, sldrt.tlc. Проект C++ использует интерфейсы C++ 11 Standard Шаблона Library (STL), такие как std::vector, std::stack, и std::complex. Я могу успешно скомпилировать проект в режиме normal mode. Но, когда я компилируюсь во режиме external mode, я получаю такие ошибки компиляции, как:

<complex> file not found
<vector> file not found

Что означает эта проблема

Компилятор генерирует эти ошибки, потому что библиотека стандартных шаблонов C++ несовместима с кодом в реальном времени.

В коде в реальном времени существует требование всегда заканчивать один временной шаг вовремя, прежде чем следующий должен начаться. Это требование создает детерминированное по времени поведение для кода в реальном времени и создает более или менее фиксированное время выполнения.

Для сравнения, библиотека стандартных шаблонов C++ часто использует функции, которые не являются детерминированными по времени. Наиболее заметными примерами являются динамическое выделение памяти и исключения. В то время как динамическое выделение памяти поддерживается (с некоторыми ограничениями) ядра реального времени детерминированным способом в реальном времени, исключения не существуют. Таким образом, невозможно использовать код, который может выдавать исключения.

Эта проблема приводит к недоступности большинства заголовков STL с целевым устройством генерации кода Simulink Desktop Real-Time. Эти интерфейсы выдают исключения. Вы не можете запустить код, который использует STL в ядре реального времени.

Попробуйте это решение

Чтобы устранить ошибки компилятора, измените свой проект, чтобы не использовать библиотеку стандартных шаблонов C++.

Если вы не можете изменить свой проект, чтобы не использовать библиотеку стандартных шаблонов C++, можно использовать цель генерации кода Simulink Desktop Real-Time в режиме normal mode.

Для режима normal mode скомпилируйте S-функцию так же, как и для Simulink. Затем запустите модель. Требования в реальном времени не могут быть соблюдены, но ошибки в реальном времени сообщаются по мере их возникновения.