UAVプログラミングのOberon

すべての良い一日。



Oberonに関する記事では、衛星、水力発電所、原子力発電所などのプログラミングにおけるOberonの使用についてよく言及されています。 厳しい産業用ソフトウェアシステム。 もちろん、それぞれの場合に実際のコード例を用意したいと思いますが、これは常に可能とは限らないため、製品はないようです。 この状況を修正するために、今日はOberonでのドローンのプログラミングについてお話ししたいと思います。



私自身はUAVを使用したことがなく、マイクロコントローラーを使用してLEDを点滅させる(もちろんOberonの助けを借りて)ので、ロシアのOberon開発者コミュニティのアクティブな参加者に私の仕事について話してもらいました。 彼の名前はアレクサンダーです。



さらにテキストA.-アレクサンダー、 O。 - oberon87



O。:あなたの仕事について一言。

A:私は無人航空機を開発し、航空機の自動制御システムのプログラムを書く会社で働いています。 航空機は主に航空写真に使用されます。



O 。:市場には多くのマイクロコントローラーと言語(主にC)があるため、なぜOberonなのですか?

A:オンボードプログラムの信頼性は私たちにとって重要です。



初期の自動制御システムのプログラム(2000年代以前)は、MCS 51マイクロコントローラーで実行され、EmbeddedPascalコンパイラーを使用してPascalおよびAssemblerプログラミング言語で作成されました。 当時のMCS 51は、その人気のために選ばれました。



しかし、徐々にマイクロコントローラーのリソースが不足し、コンパイラーにはMCS 51アーキテクチャーの複雑さによるエラー(アセンブラーを使用して回避されました)が含まれ、新しいマイクロコントローラーとAstrobeのコンパイラーが登場し、2010年からNXP LPC2000マイクロコントローラー用のOberonプログラミング言語でプログラムを書き始めました。 <...>新しいシステムと以前のシステムのもう1つの違いは、新しいシステムは以前はなかった安価でコンパクトなセンサーの使用に基づいていることです。



ARMアーキテクチャはMCS 51よりシンプルで、Oberonプログラミング言語はPascalよりシンプルですが、Astrobeコンパイラの実装にはバグがあり、徐々に発見され修正されていました。

実際、私はOberon言語のすべての機能も使用していません-動的メモリとガベージコレクターを使用していません。



また、Cの構文も好きではありません。



O 。:何を使用しましたか。Oberonで記述されているコードはどのようになっていますか。

A:すでに書いたように、オンボードプログラムの信頼性は私たちにとって重要です。 シンプルなプログラミング言語を使用すると、信頼できるプログラムを作成できます。 オベロンはそれだけで、彼は妊娠していました。 コンパイラーも信頼できるものでなければなりません。 それは、可能であれば、シンプルでもあります。 コンパイラをシンプルにするためには、プログラミング言語とターゲットアーキテクチャがシンプルでなければなりません。 このようなアーキテクチャがRISCです。



2014年、 Project Oberon Nicklaus WirthのOberon-> RISCコンパイラに基づいて、ARMv7-Mアーキテクチャ(Cortex-M4F)を備えた最新のマイクロコントローラー用のOberonコンパイラーを作成し、新しい自動制御システムのプログラムを作成しました。



コンパイラは既に記述されているため(また、フロントエンドとバックエンドへの関数の正しい分離が含まれているため)コンパイラを記述することは難しくありませんでした。 また、プログラミング言語はシンプルで、ARM7-Mのアーキテクチャはシンプルであるため、それほど時間はかかりませんでした。 コンパイラーを作成するために必要なのは、ARMv7-Mのアーキテクチャーと、リンカーを作成するための最新のマイクロコントローラー(STM32およびLPC)のいくつかの機能のみです。



マイクロコントローラ用のシステムモジュールを作成する際、NXPはSTM32のユーザーマニュアル(リファレンスマニュアルとデータシート)を使用しました。 ST MicroelectronicsよりもNXPのドキュメントが好きでした。 リファレンスマニュアルのあいまいな場所を理解するには、Keilライブラリのソースを調べる必要がありました。



コンパイラを書いたとき、私自身がいくつかのミスを犯しましたが、オートパイロットプログラムを書いたときにすぐに発見し、修正しました。すぐにハードウェアとソフトウェアのモデルでテストしました。 不注意による1つの誤り(命令の1つを生成するときにパラメーターとして間違ったレジスタを示した)、2つの場所を最適化する必要があるという事実による2つ。 そして、元のコンパイラでさらに2つ3つのエラーが見つかりました(1つはおそらく不注意によるもので、他の2つは同じタイプでした)。



コンパイラーを作成した後、マイクロコントローラーをサポートするための基本的なシステムモジュールを作成する必要がありました。カーネル(PLL)を構成し、周辺機器を操作するためです。 それも簡単でした。



O 。:サンプルコードを教えてもらえますか?

A 。:例として引用できるものは見つかりませんでした。 さて、ここに簡単な整数ローパスフィルターの実装を示します。

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 。:情報をありがとう。



インタビューからわかるように、Oberonとの連携を開始し、Oberonの製品の信頼性を向上させるには、欲望以外に何も必要ありません。 開発の各段階は非常に単純なので、それについて書くことは何もありません。

にんじんジュースを飲む!

マイクロコントローラーにはOberonを使用してください!



PSと追加情報のためにロシアのオベロンコミュニティのサイトを訪問することを忘れないでください



All Articles