+7 (812) 670-9095
Обратная связьEnglish
Главная → Статьи → Системное ПО → Обзор статьи «Специализированные компиляторы для систем помощи водителю»
Версия для печати

Обзор статьи «Специализированные компиляторы для систем помощи водителю»

3 апреля 2017

Антон Васильев

В АстроСофт активно развивается собственная разработка компании — универсальный компилятор C/С++ для встроенных систем, который позволяет быстро создавать компиляторы под целевые платформы заказчика. Одновременно создаются и все остальные компоненты средств разработки (SDK). Совершенствование технологии продолжается уже более 15 лет. На базе данного универсального решения выпущено несколько коммерческих компиляторов под различные платформы. Мы следим за развитием индустрии и попросили нашего коллегу, Антона Васильева, руководителя отдела стратегического маркетинга, подготовить обзор статьи, которая была недавно опубликована на портале Embedded, о применении компиляторов в продвинутых системах помощи водителю.






Специализированные компиляторы для систем помощи водителю

Производители оборудования и поставщики ПО для автомобилей все чаще ориентируются на создание продвинутых систем помощи водителю (Advanced Driver Assistance Systems, ADAS). Однако при ближайшем рассмотрении становится понятно, что для оптимальной работы таких систем нужны специализированные компиляторы и наборы вспомогательных программ, способные справляться с очень специфичными задачами.


Приложения для ADAS — это вызов

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

Обзор статьи «Специализированные компиляторы для систем помощи водителю»


Как и любые физические измерения, сведения об окружающей среде могут быть подвержены шуму и другим погрешностям. Следовательно, перед тем как система сможет принять решение за водителя, собранные данные должны пройти обработку аппаратными и программными инструментами. Подобный процесс наиболее эффективен при объединении информации датчиков, так как снижает погрешности.

Система помощи водителю предназначена для обработки огромного объема информации в режиме реального времени. Если раньше нужно было обрабатывать данные по отдельным датчикам в виде целых чисел или чисел с фиксированной точкой со скоростью передачи 1-5 Кбит/с, то сегодня программы обрабатывают числа с плавающей точкой на высоких скоростях. Например, изображения с видеокамер — со скоростью 340 Кбит/с, данные радара — около 1.5 Мбит/с.

Очевидно, что приложения ADAS требуют более высокой вычислительной мощности, чем традиционные автомобильные приложения. Сейчас сложно определить, какие из аппаратных архитектур будут наиболее выгодны для таких приложений. Однако становится понятно, что для многоразового и экономически эффективного пользования приложениями будет необходима поддержка компилятором всех архитектур. Это ведет к необходимости использования абстрактных методологий проектирования (C++11/14), модельно-ориентированному проектированию, а также дополнительных технологий, включающих возможность параллельного программирования (например, OpenCL, Pthreads). Более того, для безопасного и эффективного осуществления стандартных операций необходимы проверенные оптимизированные библиотеки. А ввиду отраслевых специфик потребуется и соответствие определенным стандартам безопасности (ASIL-D; ISO 26262 и т. д.).



В поисках подходящей архитерктуры

Производители комплектующих и оборудования ADAS сталкиваются с рядом сложностей и рисков при выборе подходящей архитектуры. С одной стороны, она может быть слишком громоздкой, дорогой и не будет соответствовать стандартам безопасности, с другой — будет подпадать под требования по безопасности, но при этом будет слишком слаба для сложных вычислений. Эти непростые требования вынуждают вносить изменения в имеющиеся компиляторы для встраиваемых систем.

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



Оптимизированные библиотеки

Большинство критически важных вычислений в приложениях ADAS основано на наборе стандартных линейных алгебраических операций. Издержки при портировании этих приложений на другие архитектуры можно значительно сократить, если использовать стандартный интерфейс для таких операций. Для большинства наиболее используемых алгебраических операций уже существуют оптимизированные библиотеки для целевых архитектур. Также важно, чтобы библиотеки поддерживали стандартный интерфейс, они на порядок быстрее и эффективных open source-решений или собственных разработок компаний.


Параллельное программирование

Дополнительное требование к компилятору для встроенных систем — поддержка языка C++11/C++14. Наличие в нем классов и механизма «наследования» — проверенный временем способ писать код на более высоком, абстрактном уровне. Разработка ADAS-приложений стремится улучшить повторное использование кода и достичь большего с меньшим количеством строчек в коде, без потерь в производительности.

C++11 предоставляет возможность портируемого, параллельного программирования. Для приложений ADAS важны параллельная и многоядерная обработка в связи с высокой нагрузкой и критической временной зависимостью.

Механизмы синхронизации теперь являются частью стандарта языка, и поэтому компилятор «в курсе» всех барьеров, используемых для предотвращения выполнения критических секций более чем одним потоком одновременно. Таким образом, компилятор может исключить оптимизацию нужного кода. Программисты могут воспользоваться атрибутом atomic, появившимся в стандарте с версией C++11, с помощью которого компилятор будет способен обеспечить желаемое поведение без издержек производительности.

К сожалению, нет конкретного способа определить все участки кода и данные, которые не имеют должной защиты от параллельного доступа. Иногда ошибочный код может не приводить к ошибкам компиляции и будет корректно выполняться в большинстве случаев. Тем не менее, программы, имеющие подобные скрытые ошибки, могут спонтанно выдавать неправильные результаты как следствие небольших временных разниц при выполнении параллельных потоков.

Разработчик может правильно написать параллельный код, но при этом он будет работать незначительно быстрее (или даже медленнее), чем более простой в обращении эквивалентный последовательный код. К счастью, есть специализированные библиотеки, которые дают гарантии, что параллельный код будет работать верно и быстро.


Поддержка аппаратного ускорения

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


Источник: http://www.embedded.com/design/programming-languages-and-tools/4458083/Specialized-compilers-address-ADAS-needs


Теги: ADAS, компилятор, Advanced Driver Assistance Systems, приложение для ADAS