マルチタスクオペレーティングシステムには、プリエンプティブと協調の2つの主なタイプがあります。どちらもシステムで複数のタスクを定義できますが、違いはタスクの切り替えがどのように機能するかです。もちろん、単一のコアプロセッサでは、一度に実際に実行されるタスクは1つだけです。
どちらのタイプのマルチタスクOSでも、タスクごとに個別のスタックが必要です。つまり、これは2つのことを意味します。1つ目は、プロセッサがRAMの任意の場所にスタックを配置できるため、スタックポインター(SP)を移動する命令があることです。 PICの。これにより、PIC10、12、および16シリーズは除外されます。
OSはほぼ完全にCで記述できますが、SPが動き回るタスクスイッチャーはアセンブリ内にある必要があります。PIC24、PIC32、8051、および80x86用のタスクスイッチャーを何度も書いてきました。ガッツはすべて、プロセッサのアーキテクチャに応じてまったく異なります。
2番目の要件は、複数のスタックを提供するのに十分なRAMがあることです。通常、スタックには少なくとも数百バイトが必要です。ただし、タスクあたりわずか128バイトでも、8つのスタックには1KバイトのRAMが必要になります。ただし、各タスクに同じサイズのスタックを割り当てる必要はありません。現在のタスク、およびそのネストされたサブルーチンの呼び出しを処理するのに十分なスタックが必要であることに注意してください。
各タスクに使用しているスタックの量を判断するためのかなり簡単な方法があります。たとえば、すべてのスタックを特定の値(0x55など)に初期化し、システムをしばらく実行してから、メモリを停止して調べることができます。
どんな種類のPICを使用したいかは言いません。ほとんどのPIC24とPIC32には、マルチタスクOSを実行するための十分なスペースがあります。PIC18(RAMにスタックを持つ唯一の8ビットPIC)の最大RAMサイズは4Kです。だからそれはかなり不確かです。
協調マルチタスク(2つのうちの単純なもの)では、タスクの切り替えは、タスクがその制御を「放棄」してOSに戻るときにのみ行われます。これは、タスクがOSルーチンを呼び出して、I / O要求やタイマー呼び出しなど、待機する機能を実行する必要がある場合に発生します。これにより、OSがスタックを切り替えるのが容易になります。すべてのレジスタと状態情報を保存する必要がないため、SPを別のタスクに切り替えることができます(実行するタスクが他にない場合、アイドルスタックは与えられた制御)。現在のタスクがOS呼び出しを行う必要はないが、しばらく実行されている場合は、システムの応答性を維持するために、自発的に制御を放棄する必要があります。
協調マルチタスクの問題は、タスクが制御を決して放棄しない場合、システムを独占する可能性があることです。それと制御が与えられた割り込みルーチンのみが実行できるため、OSはロックアップしているように見えます。これは、これらのシステムの「協力的な」側面です。タスク切り替えが実行されたときにのみリセットされるウォッチドッグタイマーが実装されている場合、これらの誤ったタスクをキャッチすることができます。
Windows 3.1以前は協同運用システムであったため、パフォーマンスがそれほど優れていなかった理由の1つです。
プリエンプティブマルチタスクは実装がより困難です。ここでは、タスクは手動で制御を放棄する必要はありませんが、代わりに各タスクに最大実行時間(10ミリ秒など)を与えることができます。次に、タスクがあれば、次の実行可能なタスクに切り替えられます。これには、タスクを任意に停止し、すべての状態情報を保存してから、SPを別のタスクに切り替えて開始する必要があります。これにより、タスクスイッチャーがより複雑になり、より多くのスタックが必要になり、システムの速度が少し低下します。
協調的マルチタスクとプリエンプティブマルチタスクの両方で、実行中のタスクを一時的に横取りする割り込みがいつでも発生する可能性があります。
supercatがコメントで指摘しているように、協調マルチタスクの利点の1つは、リソースの共有が容易なことです(たとえば、マルチチャネルADCなどのハードウェアやリンクリストの変更などのソフトウェア)。2つのタスクが同時に同じリソースにアクセスしたい場合があります。プリエンプティブスケジューリングを使用すると、OSはリソースを使用して1つのタスクの途中でタスクを切り替えることができます。そのため、別のタスクが入って同じリソースにアクセスするのを防ぐためにロックが必要です。協調マルチタスクでは、タスクがいつそれをOSに解放するかを制御するため、これは必要ありません。