リアルタイムオペレーティングシステムUCOSスタディノート1-UCOSIIの紹介



Real Time Operating System Ucos Study Notes 1 Introduction Ucosii



以前のすべての実験では、ベアメタルプログラム(ネイキッドストリーキング)を実行していました。この章の最初から、UCOSII(リアルタイムマルチタスクオペレーティングシステムカーネル)の紹介を始めました。

UCOSIIの紹介

UCOSIIの前身はUCOSで、1992年にアメリカの組み込みシステムの専門家であるJean J. Labrosseによって、雑誌「Embedded SystemProgramming」の5月と6月号に掲載され、UCOSのソースコードが雑誌に掲載されました。 BBSで。現在、最新バージョンのUCOSIIIが出ていますが、現在最も広く使用されているのはUCOSIIです。この章では、主にUCOSIIを紹介します。



UCOSIIは、ROM上で実行できるスケーラブルでプリエンプティブなリアルタイムマルチタスクカーネルです。移植性が高く、マイクロプロセッサやコントローラに特に適しています。これは、多くの商用オペレーティングシステム(RTOS)に匹敵するパフォーマンスを備えたリアルタイムオペレーティングシステムです。 。最高の移植性能を提供するために、UCOSIIはANSI C言語を使用して最大限に開発し、8〜64ビットのさまざまなCPU(DSPを含む)をカバーする約40種類のプロセッサシステムに移植されています。

UCOSIIは、コンピューターの組み込みアプリケーション用に特別に設計されており、ほとんどのコードはC言語で記述されています。 CPUハードウェア関連部分はアセンブリ言語で記述されており、他のCPUへの移植性を高めるために、合計約200行のアセンブリ言語部分は最小限に圧縮されています。 。ユーザーが標準のANSICクロスコンパイラ、アセンブラ、リンカ、およびその他のソフトウェアツールを持っている限り、開発された製品にUCOSIIを組み込むことができます。 UCOSIIには、高い実行効率、小さな占有スペース、優れたリアルタイムパフォーマンス、および強力なスケーラビリティという利点があります。最小カーネルは2KBにコンパイルできます 。 UCOSIIは、ほとんどすべての有名なCPUに移植されています。



UCOSIIは独創的です。構造は簡潔で洗練されており、読みやすさが優れていると同時に、リアルタイムオペレーティングシステムのすべての機能を備えています。これは単なるカーネルですが、組み込みリアルタイムオペレーティングシステムに最初に触れた友人に非常に適しています。スズメは小さく、すべての内臓を持っていると言えます。 UCOSII(V2.91バージョン)アーキテクチャを図に示します。
画像

V2.91バージョンには、以前のV2.52よりも多くの機能があり(ソフトウェアタイマーの数が多い、サポートされるタスクの最大数が255であるなど)、多くの既知のバグが修正されています。ただし、os_dbg_r.cとos_dbg.cの2つのファイルがあります。これらは上の図にリストされておらず、プロジェクトにも追加されません。これら2つは、主にUCOSカーネルのデバッグサポートに使用されます。慣れている。

上の図からわかるように、UCOSIIの移植を変更する必要があるのは、os_cpu.h、os_cpu_a.asm、os_cpu.c、およびその他の3つのファイルだけです。
os_cpu.h 、データ型、プロセッサ関連のコード、およびいくつかの関数プロトタイプを定義する
os_cpu_a.asm 、移行プロセス中に完了する必要のある機能、主にタスク切り替え機能はありますか
os_cpu.c 、いくつかのユーザーHOOK関数を定義します。



写真の中の タイマーの役割は、UCOSIIにシステムクロックのクロックを提供し、タスク切り替えおよびタスク遅延機能を実現することです。 。これ、時計が打つ OS_TICKS_PER_SEC (os_cfg.hで定義)設定では、通常、プロセッサと使用方法に応じて、UCOSIIのシステムクロックティックを1ms〜100msに設定します。この章では、STM32を使用します SYSTICKタイマー UCOSIIクロックティックを提供します。

UCOSIIの初期バージョンは64タスクしかサポートしていませんが、バージョン2.80以降、サポートされるタスクの数は255増加しています。ただし、私たちにとっては、64タスクで十分であり、多くのタスクを使用することは一般に困難です。 UCOSIIは、拡張使用のために最大4つの優先度レベルと最小4つの優先度レベルを持つ合計8つのタスクを予約しますが、実際、UCOSIIは通常、最小2つの優先度レベルのみを占有します。 アイドルタスク (最後から最後まで)そして 統計タスク (最後から2番目)、残りのタスクは最大255-2 =になる可能性があります 253 (V2.91バージョン)。

UCOSはどのように実装されていますか マルチタスクの並行性 仕事はどうですか?誰もが外部割り込みに精通していると思います。 CPUがユーザーコードの一部を実行するときに、この時点で外部割り込みが発生した場合は、最初にオンサイト保護を実行してから、割り込みサービスプログラムの実行に移ります。実行が完了すると、シーンが復元され、中断から元のユーザーコードが実行されます。 UCOSの原理は本質的に同じです。タスクAが実行されているときに、CPU制御を解放する場合は、最初にタスクAをオンサイトで保護してから、実行するタスク準備テーブルから他の準備完了タスクを見つけ、タスクAまで待機します。待機時間が経過すると、制御が回復する場合があります。 CPUの。このとき、タスクAのサイトが復元されるため、タスクAは引き続き実行されます。 。これは、2つのタスクが同時に実行されたかのように見えます。実際、いつでも1つのタスクだけがCPU制御を取得できます。このプロセスは非常に複雑で、シーンは多様です。これは説明するための簡単な例です。

いわゆるタスクは実際には無限ループ関数です この機能は特定の機能を実現します。プロジェクトには、そのようなタスクを多数含めることができます(最大255)。 UCOSIIは、これらのタスクが同時に機能できるように、これらのタスクをスケジュールおよび管理します(同時に機能しないことに注意してください!! 同時実行性とは、各タスクが同時にではなく、順番にCPUを使用することです。 CPUを占有できるタスクは常に1つだけです。 )、これはUCOSIIの最も基本的な機能です。

UCOSミッションの一般的な形式は次のとおりです。
画像

mytaskとyourtaskの2つの新しいタスクを作成する場合、ここでは最初にタスクの優先順位の概念を無視します。無限ループ内の2つのタスクの遅延時間は1秒です。ある時点でタスクmytaskが実行されている場合、遅延関数OSTimeDlyHMSMを実行すると、CPUコントローラーが解放されます。このとき、タスクyourtaskはCPUコントローラーに実行を開始させます。タスクyourtaskの実行中、遅延も呼び出されます。関数1sがCPUコントローラーを解放すると、タスクAはこのプロセス中に1sの遅延で到着し、CPUの制御を取り戻し、タスクエンティティコードの実行を再開します。無限のループ。 このサイクルでは、CPUが2つのことを同時に実行しているかのように、2つのタスクが交互に実行されるという現象が発生します。

待機中のタスクが多い場合、最初に実行する必要があるタスクはどれですか。タスクの実行中にタスクが停止した後、他のタスクを実行することは可能ですか?これは、タスクの優先度とタスクのステータスのタスク制御に関する知識です。これについては後で説明します。詳細を知りたい場合は、RenZhe著の「UCOSIIRealTimeOperatingSystem」を読むことをお勧めします。

以前に調査したすべての実験は大きなタスク(無限ループ)であるため、処理が難しいものもあります。 例:MP3実験、MP3の再生中に、歌詞も表示します。無限ループ(タスク)の場合、歌詞を表示するとMP3サウンドが一時停止する可能性があります(特にビットレートが高い場合)。これは主に歌詞の表示に時間がかかりすぎてVS1053が発生するためです。時間内にデータを取得できないため、停止します。また、UCOSIIを使用して処理する場合は、2つのタスクを分割できます。つまり、MP3がタスクを再生し(優先度が高い)、歌詞がタスクを表示します(優先度が低い)。このように、MP3タスクの優先度は歌詞表示タスクよりも高いため、MP3タスクは歌詞表示タスクを中断することができ、それによってVS1053に時間内にデータを提供して、音声が連続していることを確認し、歌詞はスムーズに進むことができます。これがUCOSIIのメリットです。

理解する必要のあるUCOSIIに関連するいくつかの概念を次に示します。タスクの優先度、タスクスタック、タスク制御ブロック、タスク準備完了リスト、タスクスケジューラ。

タスクの優先度 この概念は比較的理解しやすいです。 UCOSでは、各タスクに固有の優先順位があります。優先度は、タスクの一意の識別子です。 UCOSIIでは、CPUを使用する場合、優先度の高い(値が小さい)タスクが優先度の低いタスクよりも優先されます。つまり、タスクレディテーブルで優先度が最も高いタスクが常にCPU使用権を取得し、高いタスクのみが取得されます。優先度CPU使用権を放棄するタスク(遅延など)の場合、優先度の低いタスクはCPU使用権を取得できます。 UCOSIIは、同じ優先度の複数のタスクをサポートしていません。つまり、各タスクの優先度は異なっている必要があります。

タスクスタック 、 あれは メモリ内の連続ストレージスペース 。タスクが切り替えられて割り込みに応答し、タスクが他の関数を呼び出すときに、CPUレジスタの内容を保存する必要性を満たすために 各タスクには独自のスタックがあります 。タスクを作成するとき、 タスクスタックは、タスク作成の重要なエントリパラメータです。

タスク制御ブロックOS_TCB 、 慣れている タスクスタックポインタ、タスクの現在のステータス、タスクの優先度などのタスク属性を記録します 。 UCOSIIのタスクはすべて、タスク制御ブロック(TCB)によって制御されます。タスクが作成されると、タスク制御ブロックOS_TCBが割り当てられます。各タスク管理ブロックには、3つの最も重要なパラメーターがあります。
1.タスク関数ポインタ
2.タスクスタックポインタ
3.タスクの優先度
タスク制御ブロックは、システム内のタスクのIDです。 (UCOSIIは優先度によってタスクを識別します)。

タスクレディフォーム つまり、システム内のすべてのタスクを準備完了状態で記録するために使用されます。ビットマップです。システム内の各タスクは、このビットマップの16進ビットを占有します。この位置のステータス(1または0)は、タスクが準備完了状態にあるかどうかを示します。

タスクのスケジューリング 最初は タスクレディテーブルで最も優先度の高いレディタスクを見つけます 、2つは タスク切り替えを実装する 。たとえば、タスクがCPU制御を解放すると、タスクのスケジューリングが実行されます。このとき、タスクスケジューラは、最初にタスクレディテーブルに移動して、最も優先度の高いレディタスクをクエリする必要があります。それを見つけたら、タスク切り替えを実行し、次のタスクを実行するために向きを変えます。仕事。

UCOSIIの各ミッションは無限ループです 。各タスクは、スリープ状態、準備完了状態、実行状態、待機状態(イベントの発生を待機中)、割り込みサービス状態の5つの状態のいずれかになります。

スリープ状態 、タスク制御ブロックが装備されていない場合、またはタスク制御ブロックが奪われている場合のタスクの状態。
準備完了状態 、システムにはタスク用のタスク制御ブロックが装備されており、タスクレディテーブルに登録する準備ができています。タスクの準備はできていますが、タスクの優先度が実行中のタスクの優先度よりも低いため、一時的に実行することはできません。タスクの状態は準備完了状態と呼ばれます。
動作状態 、タスクはCPU使用権を取得して実行中です。このときのタスク状態は、実行状態と呼ばれます。
待機状態 実行中のタスクが一定期間待機する必要がある場合、または実行前にイベントが発生するのを待機する必要がある場合、タスクは他のタスクに対するCPU使用権を放棄し、タスクを待機状態にします。
割り込みサービスステータス 実行中のタスクが割り込み要求に応答すると、実行を停止し、割り込みサービスプログラムを実行します。このときのタスクの状態を割り込みサービス状態と呼びます。

UCOSIIタスクの5つの状態遷移関係を図に示します。
画像