ARMプロセッサ向けのコンパクトOS

「完璧なものは、追加するものがないときではなく、削除するものがないときに達成されるようです。」



(アントワーヌドサンテグジュペリ)



画像








組み込みシステム、リアルタイムオペレーティングシステム、アセンブラ、Cのプログラミングの研究については、非常にシンプルなStartOSオペレーティングシステムを紹介します。



目的:



-電源を入れてから1〜2秒後に動作を開始し、マイクロ秒以内に外界からの信号に応答できるデバイスを作成する必要がある場合。

-インターネットへのデータ出力を備えた施設管理システムの迅速な作成。

-アイデア、アルゴリズム、プロトタイピングデバイスの開発。

-Cおよびアセンブラーでの組み込みシステムのプログラミングの経験を積む;

-たとえば、自己修正プログラムの開発のために、コンピューターデバイスのハードウェアへのフルアクセスを取得します。



システムのいくつかのプロパティ:



電源投入後の準備時間:<1秒

バイナリプログラムコードのボリューム:<40 kB



システムはRAMの上位アドレスに少量を占有し、ユーザーにプログラムの標準ダウンロードをRAMの下位アドレスに提供します。 ユーザープログラムの自動起動が存在し、システムがメモリカード上のSTART.BINファイルを検出すると、自動的に起動します。



システムの主な機能:



SoC(システムオンチップ、システムオンチップ)およびその他の外部デバイスの初期化。 ユーザープログラムをメモリに読み込み、システム機能へのインターフェイスを提供します。



-テキストおよびグラフィックモードでLCDを操作します(テキスト、ピクセル、ライン、BMP画像の出力、画面領域の保存/復元...);

-タッチスクリーンからX、Yペンの座標を入力します。

-リアルタイムクロック(RTC)で動作します。

-アナログ-デジタルコンバーター(ADC)からのデータの読み取り。

-デジタルポートからのデータの読み取り。

-COMポートで文字と行を読み書きします。

-パルス幅変調器(PWM、PWM)およびピエゾダイナミクスへの出力。

-内蔵コントローラーを使用したイーサネットパケットの入力/出力。

-ファイルの読み取りと書き込み。

-インターネット用のサーバークライアント;

-ビデオカメラを使用します。



このシステムは、Samsungプロセッサを搭載したSamsungまたはFriendlyARM開発者のボードに実装されています。 これらのプロセッサとボードの完全なドキュメントがあります。



それで、もう少しはっきり。 一度見たほうがいいので、ビデオへのリンク:







システムは、ARM Cortex-A8ではもう少し複雑です。







そして、もちろん、「Hello、World!」というコード(忍び寄る行もあります):



char txt [ ]={"Hello"}; void Main(void) { int i; for ( i = 134; i > 8; --i ) { // X Y String Print_String ( i, 150, "Hello, World!"); Print_String ( i, 170, txt); Delay (20); // Delay 20 mS } Exit (); // Exit to OS }
      
      





これはアセンブラーにあります:



 ;    , Hello.s.     100  (!) ;       StartOS.c _Exit EQU 7 ; SysTrap _Exit _Delay EQU 10 ; SysTrap _Delay _Print_String EQU 122 ; SysTrap _Print_String PRESERVE8 ;   8  AREA INIT, CODE, READONLY ; . ,   ENTRY ;    ;______     __________ LDR r0, =0x33ffff08 ;    LDR r1, [r0,#0xE8] ; STR r1, [r0] ; ;    ,  . 4  ; MRS r0,cpsr ; BIC r0,r0,#0xDF ; ORR r1,r0,#0x13 ; MSR cpsr_cxsf,r1 ;___     ;   ... ; -           ;----   LDR r2, text1 ;    1   r2 MOV r1,#30 ;  Y     r1 MOV r0,#25 ;  X    r0 SWI _Print_String ;   (Print_String(25,30,text1)) ;----   ---- ADR r2, text2 ;    text 2  r2 MOV r1,#70 ; Y  r1 MOV r0,#25 ; X r0 SWI _Print_String ;  (Print_String(25,70,"Hello, ARM Assembler!")) LDR r0, millis ;      5000  r0 ;     (, 500ms)  : MOV r0,#500 SWI _Delay ;  (Delay 5s) SWI _Exit ;      ,    text1 DCD txt ;   "Hello" text2 DCB "Hello, ARM Assembler!",0 ;      DCB 0,0 ;    32-  (*4 ) millis DCD 5000 ;  5000   5  DCB 0,0 ;  txt DCB "Hello",0 ;   H, e, l, l, o  0 END ;   - !
      
      





システム作成の背景は次のとおりです。 著者は、「ホーム」オペレーティングシステムの作成は非常に責任があり、リスクの高いビジネスであることを認識しています(そして、クリエーターに批判以外の何ものでもありません)。 しかし、彼らが言うように、人生は作られました。 それで、どうしてこれが起こったのでしょうか?



これは次のようなものでした。FriendlyARMMini2440開発者向けのボードが見つかりました。これは非常に安価で、多くの周辺機器を選択できました。 粘着ラベルのアプリケーターでAtmel AVRコントローラーを使用した後、私は後者の開発を続けたいと思いました。



当時(2010年)、Mini2440ボードの価格は80ドル、約2,400ルーブルで、これはアプリケーターのセンサーのコストに匹敵しました。 Mini2440は、アプリケーションを承認し、「プログラミングに成功した場合は注文する」ことを保証する1社の長にデモを行いました。 プログラミングの成功とは、センサーからの信号がマイクロ秒単位で処理され、待機に時間がかからなかった場合に、デバイスをリアルタイムで使用することを意味しました。 2か月後、NANDメモリに配線されたプログラムは、ステッピングモーターを正常に制御し、電源投入後1秒でロードしました。 しかし、ここでは、たまたま頭はすでにst迷に陥っており、黙っています。 彼が沈黙している間に時間が経ち、著者はその瞬間を何らかの開発に使用することにしました。



初期化コードを毎回プロジェクトに挿入しないようにするために、これを一度だけ実行し、SDカードからメモリにアプリケーションプログラムを直接メモリにロードして、そこから実行することにしました。



たとえば、ST732 ARM7コントローラでは、ユーザープログラムが外部デバイスを操作するための独自のライブラリでコンパイルされるアプローチがあります。 同時に、同社は独自のソースコードを公開せず、ユーザープログラムはメモリ内のアドレスで独自のルーチンを呼び出します。



同時に、著者はDECのRT-11などのオペレーティングシステムの「内部」を知っており、Electronics-60、DVK-2 ... 4などで使用しました。 IBM PC AT、MS DOS、Palm OSのBIOSもよく研究されました。 これらすべてのシステムでは、ソフトウェア割り込みの使用という古典的なアプローチが使用されました。 つまり、OSはメモリの上位アドレスとユーザープログラムに配置されます。メモリの先頭からオペレーティングシステムのルーチンを呼び出し、コマンド割り込みでプログラム割り込み番号を渡すと、実際に割り込みが発生します。



したがって、開発されたシステムは、SWI(SVC)コマンドによるソフトウェア割り込みメカニズムを採用しています。 システムコードは外部アドレスにあり、ユーザープログラムはメモリの先頭に直接読み込まれて実行されます。 既存のシステムと比較することはせず、システムが最小のボリューム、可能な限り最高の速度、「ハード」リアルタイムで判明したと言うだけで十分です。 どの時点でどのコマンドが実行され、何が起こっているかを常に非常に正確に知ることができます。



システムの名前は、エントリーレベルのシステムとして考えられ始めました。 Googleで検索した後、選択はStartOSに落ち、この名前が登録されました(しばらくして、惑星のある部分の特定のLinuxクローンもStartOSに名前が変更されたことは残念です)。



ユーザーの要求に応じて、TCP IPスタックがシステムに追加され、サーバーとクライアントが作成されました。 また、ビデオカメラを操作するためのプログラムも追加しました。 ちなみに、ボードに電源を投入すると、2秒後にカメラの画像が既に画面に表示されます。



ボードにマウントされたほぼすべての外部デバイスを操作するためのプログラムの例が提示されています。 ADS1.2(Metrowerks CodeWarrior)、IAR、Keil、およびその他の環境でプログラムを作成できます。



ドキュメント、例などは、 こちらこちらにあります



FriendlyARM Mini2440開発ボードは既に古くなっているため(多くのプロジェクトに適していますが)、著者はシステムをより新しいMini210sボードに移植しました。 ちなみに、多くのユーザーがSamsungボードでStartOSを使用し、成功しています。



コミュニティに関しては、

アナトリーベスプルメンノフ、エンジニア



PS:たとえば、列車を制御するシステムが「フリーズ」し、ウォッチドッグタイマーが動作し、再起動して1秒後に再び動作する場合など、リアルタイムシステムを真剣に考えてください。 CuriosityローバーがMicriumのuCOS RTシステムの制御下で火星の広がりを耕しているのは、何も理由ではありません。



All Articles