Pull to refresh

Оберон в программировании БПЛА

Reading time4 min
Views7.9K
Всем доброго времени суток.

В статьях про Оберон часто упоминается применение Оберона в программировании спутников, ГЭС, АЭС и так далее. Суровые промышленные программные комплексы. Конечно, хотелось бы иметь реальные примеры кода для каждого случая, но это не всегда возможно, и поэтому складывается впечатление, что никаких продуктов как бы нет. Для исправления этой ситуации сегодня хотелось бы рассказать о программировании беспилотников на Обероне.

Так как я сам никогда с БПЛА не работал, а микроконтроллер только для мигания светодиодом использовал (с помощью Оберона, конечно), я попросил рассказать о своей работе активного участника сообщества Оберон-разработчиков в России. Его зовут Александр.

Далее по тексту А. — Александр, O.oberon87

O.: Пару слов о твоей работе.
А.: Я работаю в фирме, которая занимается разработкой беспилотных летательных аппаратов, и пишу программы для систем автоматического управления самолётами. Самолёты применяются, в основном, для аэрофотосъёмки.

O.: Почему именно Оберон, ведь на рынке есть куча микроконтроллеров и языков (в основном Си)?
А.: Нам важна надёжность бортовых программ.

Программы ранних систем автоматического управления (в 2000-х годах и ранее) выполнялись на микроконтроллерах MCS 51 и были написаны на языках программирования Pascal и Assembler с использованием компилятора EmbeddedPascal. MCS 51 в то время был выбран из-за своей популярности.

Но постепенно ресурсов микроконтроллера стало не хватать, компилятор содержал ошибки (которые обходили использованием ассемблера) из-за сложности архитектуры MCS 51, появились новые микроконтроллеры и компилятор фирмы Astrobe, и с 2010 года мы стали писать программы на языке программирования Oberon под микроконтроллеры NXP LPC2000. <...> Еще одно отличие новой системы от предыдущей в том, что новая основана на использовании более дешёвых и компактных датчиков, которых раньше не было.

Архитектура ARM проще, чем MCS 51, и язык программирования Oberon проще, чем Pascal, но всё равно в реализации компиляторе Astrobe были ошибки, которые постепенно находили и исправляли.
Вообще-то я даже использую не все возможности языка языка Oberon — не пользуюсь динамической памятью и сборщиком мусора.

Ещё я не люблю синтаксис языка C.

O.: Что использовал, как происходит написание кода в обероне, насколько это легко/трудно?
А.: Как я уже писал, нам важна надёжность бортовых программ. Использование простого языка программирования помогает писать надёжные программы. Oberon как раз таким и является, он таким и был задуман. Компилятор тоже должен быть надёжным. То есть по возможности тоже простым. Для того, чтобы компилятор был простым, должен быть простым язык программирования и целевая архитектура. Такой архитектурой является RISC.

В 2014 году я написал свой компилятор Oberon для современных микроконтроллеров с архитектурой ARMv7-M (Cortex-M4F) на основе компилятора Oberon->RISC из Project Oberon Никлауса Вирта, и программа для новой системы автоматического управления была написана с его использованием.

Компилятор написать было несложно, потому что он уже был написан (и потому, что в нем правильное разделение функций на фронтэнд и бэкенд), и мне нужно было всего лишь переписать компилятор заднего плана (кодогенератор) и написать компоновщик. А так как язык программирования простой и архитектура ARMм7-M простая, то это не заняло много времени. Для того, чтобы написать компилятор, мне потребовалось только изучить архитектуру ARMv7-M и некоторые особенности современных микроконтроллеров (STM32 и LPC) для написания компоновщика.

При написании системных модулей для микроконтроллеров NXP использовал User Manual, для STM32 — Reference Manual и datasheet. Документация у NXP мне понравилась больше, чем у ST Microelectronics. Для понимания неоднозначных мест в Reference Manual пришлось смотреть исходники библиотек Keil.

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

После того как я написал компилятор, нужно было ещё написать базовые системные модули для поддержки микроконтроллеров – для настройки ядра (ФАПЧ) и для работы с периферией. Это тоже было несложно сделать.

O.: Можешь привести пример кода?
А.: Не нашёл ничего такого, что можно привести в пример. Ну, вот, простая целочисленная реализация фильтра НЧ:
MODULE IntRC;

    (* Alexander Shiryaev, 2015.01 *)

    TYPE
        RC* = RECORD
            rc*, n*: INTEGER
        END;

    PROCEDURE Init* (VAR rc: RC; x, n: INTEGER);
    BEGIN
        rc.rc := LSL(x, n);
        rc.n := n
    END Init;

    PROCEDURE Set* (VAR rc: RC; x: INTEGER);
    BEGIN
        rc.rc := LSL(x, rc.n)
    END Set;

    PROCEDURE ASR1 (x, n: INTEGER): INTEGER;
    BEGIN
        IF x > 0 THEN INC(x, LSL(1, n - 1)) END
    RETURN ASR(x, n)
    END ASR1;

    PROCEDURE Update* (VAR rc: RC; x: INTEGER): INTEGER;

        PROCEDURE ASR2 (x, n: INTEGER): INTEGER;
        BEGIN
            IF x > 0 THEN INC(x, LSL(1, n) - 1) END
        RETURN ASR(x, n)
        END ASR2;

    BEGIN
        rc.rc := rc.rc + ASR2(LSL(x, rc.n) - rc.rc, rc.n)
    RETURN ASR1(rc.rc, rc.n)
    END Update;

    PROCEDURE Get* (rc: RC): INTEGER;
    BEGIN
    RETURN ASR1(rc.rc, rc.n)
    END Get;

END IntRC.


O.: Спасибо за информацию.

Как можно увидеть из интервью, для того чтобы начать работу с Обероном и повысить надежность своих продуктов, не нужно ничего, кроме желания. Каждый этап разработки настолько прост, что даже писать о нем нечего.
Пейте морковный сок!
Используйте Оберон для микроконтроллеров!

P.S. и не забудьте посетить сайт российского Оберон-сообщества для дополнительной информации
Tags:
Hubs:
Total votes 25: ↑11 and ↓14-3
Comments104

Articles