ロシアの1぀のRTOSの抂芁、パヌト2。RTOSMAXのカヌネル

RTOS MAXの「知識の本」の章を匕き続き配眮したす。 最初の郚分は䞀般的でした。 今日は、タスクのコアず優先床に専念する第2郚です。



コンテンツ公開および未公開の蚘事



パヌト1.䞀般情報

パヌト2. RTOS MAXのカヌネルこの蚘事

パヌト3.最も単玔なプログラムの構造

パヌト4.有甚な理論

パヌト5.最初のアプリケヌション

パヌト6.スレッド同期ツヌル

パヌト7.タスク間でデヌタを亀換する手段

パヌト8.割り蟌みの凊理



挑戊する



すでに述べたように、MACS RTOSのタスクは、汎甚OSのフロヌに類䌌しおいたす。 同時に、システムでもちろん利甚可胜なリ゜ヌス内で任意の数のタスクを実行できたす。 汎甚OSでは、これは理論化を止めお緎習に移るこずができたすが、リアルタむムOSの堎合、プログラマヌはすべおを正しく行ったこずを確認する必芁があり、タスクは必芁なだけのプロセッサヌ時間を受け取るこずが保蚌されたす。 そしお、すべおを正しく行うには、䜕らかの理論を知る必芁がありたす。 したがっお、タスクの䜜業をより詳现に怜蚎したす。



マルチタスクの皮類



MAX MAX RTOSでは、他のほずんどのリアルタむムオペレヌティングシステムず同様に、3぀の異なるタむプのマルチタスクが可胜です混雑、協調、混合。 なぜそんなに 実際、異なるシステムでは異なるタむプを䜿甚する方が䟿利です。 したがっお、最も䟿利な圢匏の遞択は、特定のアプリケヌションプログラムの開発者に委ねられおいたす。



プリ゚ンプティブマルチタスク



このタむプは、倚くのプログラムで最もよく知られおいたす;さらに、プリ゚ンプティブマルチタスクは、汎甚オペレヌティングシステムで䜿甚されるものず䌌おいたす。 スケゞュヌラヌは各タスクに固定タむムクォンタムデフォルトで1000 HzであるMAKS_TICK_RATE_HZ定数を䜿甚しお蚭定されたす。぀たり、デフォルトでクォンタムは1ミリ秒ですを実行し、次のタスクを実行したす。 以䞋でタスクを列挙する原理を怜蚎したす。ここでは、システムタむマヌに埓っおタスクが順番に実行されるこずに泚意しおください。 䞀般に、このスキヌムは、ハヌドりェアの戊いが始たるたで、かなり芋栄えがよくなりたす汎甚オペレヌティングシステムで䜿甚されるのは圓然のこずです。



機噚を操䜜する際のプリ゚ンプティブマルチタスクの問題



マむクロコントロヌラヌの䞻なタスクの1぀は、機噚の操䜜です。 そしお、この機胜はプログラマヌに倚くの責任を負わせたす。 同じSPIバスが、異なるCSラむンで区切られた耇数のデバむスに察応しおいるこずが刀明する堎合がありたす。 あるデバむスでの䜜業が完了するたで、別のデバむスでの䜜業を開始するこずはできたせん。



耇数のデバむスで単䞀のSPIバスを䜿甚する䟋



図 1.耇数のデバむスで単䞀のSPIバスを䜿甚する䟋



I2Cバスは元々、倚くのデバむスを接続するために蚭蚈されたした。



タむミング図に十分高い粟床で耐えるこずが必芁な堎合がありたす。 タむムスラむスが終了するず、ダむアグラムが歪んでしたいたす。



しかし、プリ゚ンプティブマルチタスクでは、スケゞュヌラは容赊がありたせん。 タスクを切り替えるためのタむマヌがい぀機胜するかは誰にもわからないため、䞊蚘の堎合は同期メカニズムを䜿甚する必芁がありたす。 特定のスキヌムでは、いく぀かの同期プリミティブを導入するだけで十分です。 しかし、プログラマヌは同期に぀いおよりもプログラムに぀いお考えるこずを䜙儀なくされるこずが刀明するかもしれたせん。 そしお、この堎合、協同組合を支持しお先制マルチタスクを攟棄する方が良いです。



協調マルチタスク



協調マルチタスクでは、切り替えはタむマヌではなく、タスク自䜓からのコマンドによっお実行されたす。 このタむムクォンタムで行われるこずになっおいるすべおを完了するず、圌女自身がタスクスむッチング関数Yieldを呌び出したす。 この関数の呌び出しは、次のタスクに制埡を移す時間であるこずをスケゞュヌラに通知したす。 その結果、タスクは、それ自䜓がシステムに問い合わせるたで実行が䞭断されないずいう保蚌がありたす。 しかし、蚀うたでもなく、コむンの裏偎はプログラマヌにずっお倧きな責任です。 タスクがプロセッサを過床に占有しないようにする必芁があるのは、アプリケヌションプログラマです。 タスクがシステム党䜓をフリヌズさせるこずを曞くこずも慣習ですが、私の意芋では、これはさらに良いです。 機噚は動䜜するかしないかのどちらかです。 サブシステムの1぀に障害が発生した堎合-機噚が安党でなくなるず、結果はひどくなりたす。 そのため、デバむスが完党に故障した堎合でも、゚ラヌを芋぀けるための信号ずしお機胜したす。 それにもかかわらず、プリ゚ンプティブマルチタスクの堎合、1぀のタスクがハングしおも党䜓ずしお䜜業が䞭断されるこずはなく、協調的なタスクの堎合、タスクは単に他のタスクを制埡したせん。



たた、協調型マルチタスクを䜿甚しお、シングルタスクシステムからアプリケヌションをすばやく移怍できたす。 3Dプリンタヌ実際にはCNCマシン甚のMarlin「ファヌムりェア」の断片を考えおみたしょう。



void loop() { if(buflen < (BUFSIZE-1)) get_command(); #ifdef SDSUPPORT card.checkautostart(false); #endif if(buflen) { ... process_commands(); //SDSUPPORT buflen = (buflen-1); bufindr = (bufindr + 1)%BUFSIZE; } //check heater every n milliseconds manage_heater(); manage_inactivity(); checkHitEndstops(); lcd_update(); }
      
      





loop関数は、Arduinoランタむムによっお無限ルヌプで呌び出されたす。 同様のルヌプは、タスクを切り替えるスケゞュヌラに類䌌しおいたす。 すべおを実際のスケゞュヌラヌにやり盎すず、loop関数を捚おお、無限ルヌプでスピンするタスクの圢でコンポヌネントを蚭蚈し、次の反埩の前にYieldを呌び出すこずができたす。 これにより、タスクが機噚を介しお盞互に競合しないようになり、盞互に誘導タむムアりトが䜜成されたす。 そしお、将来的には、システムが適応するに぀れお、プリ゚ンプティブマルチタスクぞの切り替えを詊みるこずができたす。



混合マルチタスク



最埌の可胜なオプション。システムがプリ゚ンプティブマルチタスクモヌドで動䜜したすが、タスクの䞀郚たたは䞀郚がYield関数を呌び出したす。 特に、タスクが制埡を受け取ったが、そのデヌタの準備がただ敎っおいないこずがわかった堎合。 次に、リ゜ヌスを占有しないために、圌女はYield関数を呌び出しお別のタスクに制埡を枡すこずができたす。 ただし、MAX MAX RTOSの珟圚のバヌゞョンでは、これは蚱容できたすが、泚意しお䜿甚する必芁がありたす。 むンパクトを高めるために、赀で匷調したい理由。



珟圚のMAX MAXでは、混合マルチタスクを泚意しお䜿甚する必芁があるこずに泚意しおください。 実際には、固定呚波数で動䜜するタむマヌでプリ゚ンプティブタスクの切り替えが発生したす。 匷制的なタスクの切り替えは、このタむマヌには圱響したせん。 タスクAが垞に700ÎŒs以内に実行された埌、Yield関数を䜿甚しおスケゞュヌラに制埡を転送するずしたす。 スケゞュヌラヌはタスクBを実行したす。しかし、300マむクロ秒埌、タむマヌからの割り蟌みが発生し、スケゞュヌラヌは次のタスクBに制埡を転送したす。制埡転送は順次発生するため、タスクBは氞久に抑制されたす。 圌女には垞に劣った時間の量子が䞎えられ、タスクAの量子の残りが䞎えられたす。



タスクの状態



マルチタスクの皮類に粟通したので、タスクずそれに近い制埡を転送するロゞックを怜蚎できたす。 タスクの状態ずそれらの間の遷移のグラフを図に瀺したす。 2。



図2.問題の状態ずそれらの間の遷移のグラフ



図 2.問題の状態ずそれらの間の遷移のグラフ



走る 最も快適な状態。 タスクは完了しおいたす。 この状態では、各瞬間に1぀のタスクしか存圚できたせん。
準備ができお タスクがタむムスラむスを䜿い果たすか、それ自䜓でYield関数を呌び出すず、タスクはこの状態に入り、スケゞュヌラが再び蚭定するたでその状態のたたになりたす。
ブロックされた ビゞヌ状態のリ゜ヌスを芁求した堎合、タスクはこの状態になりたす。 同期プリミティブミュヌテックスたたはセマフォ、むベントの期埅、キュヌからのメッセヌゞの期埅が可胜です。 リ゜ヌスが解攟されるたで、タスクはプロセッササむクルを無駄にするこずなくロック状態になりたす。 これはタスクにずっお非垞に重芁な状態です。完了するタスクの数が少ないほど、残りのプロセッサ時間は長くなるためです。 サむクルで䜕かの期埅を敎理するのではなく、タスクをブロックしお、スケゞュヌラヌが呌び出されるべきではないこずをスケゞュヌラヌに知らせるこずを匷くお勧めしたす。



リ゜ヌスが解攟されるず、状況に応じお、タスクはすぐに実行に進むか、蚈画の準備状態になりたす。 埌者は、䞀床に耇数のタスクを埅機しおいたリ゜ヌスが解攟された堎合結局、実行できるのは1぀のみ、たたは優先床の高いタスクが珟圚実行されおいる堎合です。
非アクティブ 䜜成時、たたは䜜業の終了時にタスクが進む状態。 ぀たり、タスクがスケゞュヌラにただ接続されおいない堎合、たたは逆に、スケゞュヌラからすでに切断されおいる堎合です。 タスクずは関係のない補助状態。


タスクの優先床



各タスクには独自の優先順䜍がありたす。



優先床は、タスクの䞍可欠で非垞に重芁なプロパティです。 䞀般に、数倀に優先順䜍を付けるこずができたす。 しかし、第䞀に、汎甚オペレヌティングシステムで優先順䜍を付けるのが䞀般的ですそこでは理にかなっおいたすが、原則ずしおはうたくいく可胜性がありたす、第二に、オブゞェクト指向のアプロヌチは類型化ず密接に関連しおいたす。 いく぀かの抜象的な数字は簡単に混同される可胜性があり、名前を付けるずきに特定のタむプの「優先床」に関連付けるこずができたす。



したがっお、䌝統を守るために、そしお厳密なタむピングを確実にするために、MAX MAX RTOSでは次のタスクの優先順䜍が区別されたす。



  enum Priority { PriorityIdle, ///<   (   IDLE) PriorityLow, ///<   PriorityBelowNormal, ///<    PriorityNormal, ///<   (  ) PriorityAboveNormal, ///<    PriorityHigh, ///<   PriorityRealtime, ///<   ( ) PriorityMax = MAKS_MAX_TASK_PRIORITY };
      
      





タスク切り替え手順



汎甚オペレヌティングシステムに぀いお説明する堎合、このセクションは通垞サむズが非垞に倧きく、メカニズムはバヌゞョンごずに倉わるため、著者はメカニズムに぀いお簡単に説明するず付け加えおいたす。 これは、汎甚オペレヌティングシステムがすべおのプロセスのすべおのスレッドの動䜜を保蚌しようずするずいう事実によるものです。 リアルタむムOSの堎合、すべおがシンプルです。 タスクはラりンドロビンアルゎリズムを䜿甚しお切り替えられたす。図を図に瀺したす。 3.このアルゎリズムの本質は、リストのタスクが順番に実行され、最埌に達するず、OSがリストの先頭に切り替わるこずです。 リスト内で、実行するタスクを遞択するず、リストの次のタスクが取埗されたす。 準備完了状態の堎合、実行されたす。 ブロックされた堎合-次のタスクに進みたす。



図3.ラりンドロビアンルゎリズムを䜿甚したタスクの切り替え



図 3.ラりンドロビンアルゎリズムを䜿甚したタスクの切り替え



最も優先床の高いタスクが実行されるこずに泚意しおください。぀たり、実際のシステムでは耇数のリストが存圚する可胜性がありたす。 たずえば、PriorityNormal優先床を持぀タスクのリストず、PriorityHigh優先床を持぀リスト。 さらに、すべおのタスクが埅機状態にない堎合、スケゞュヌラは垞に優先床の高いリストのタスクのみを実行したす。



図4.タスク1〜6の実行䟋



図 4.タスク1〜6優先床が高いの実行ずタスク7〜12の完党なダりンタむムの䟋仕事の優先床は䜎い



ただし、これは、䞀郚のタスクが無芖されるこずを意味するものではありたせん。正しく蚭蚈されたプログラムでは、時間クォンタムがすべおのタスクに行きたす。 優先床の高いタスクは、できるだけ頻繁にブロック状態になるように蚭蚈する必芁がありたす-リ゜ヌスセマフォ、キュヌからのデヌタなどを埅機したす。



䟋5.タスク7〜12の実行䟋



図 5.優先床の高いタスクはすべおブロックされるため、タスク7〜12優先床が䜎いの実行䟋



通垞の優先床を持぀タスクは䞻力です。 圌らは絶えず反埩的なアクションを実行したす遅い機噚を監芖し、制埡アクションの入力を提䟛し、結果を衚瀺したす。



通垞よりも䜎い優先床を持぀タスクは、通垞の優先床を持぀タスクでさえもすべおブロック状態になる可胜性が保蚌されおいる堎合、プログラムに入力できたす぀たり、Yield関数の単玔な呌び出しでは圹に立たないため、リ゜ヌスを埅぀か、関数を呌び出す必芁がありたす遅延ただし、珟圚の優先順䜍を持぀すべおのタスクがスリヌプ状態になるようにしおください。



優先床の高いタスクの適甚の具䜓䟋を以䞋に瀺したす。 「高速」機噚を凊理するように蚭蚈されおいたす。 それたでの間、いく぀かの基本的なルヌルを芚えおおけば十分です。





省電力機胜



すべおのタスクがロックされた状態にある堎合、プロセッサは䜕かをする必芁がありたす。そうでない堎合は、スリヌプ状態にする必芁がありたす。 システムには特別なプリプロセッサ定数があり、動䜜のいずれかを遞択できたす。



MAKS_SLEEP_ON_IDLE



この定数が1の倀で定矩されおいる堎合、スケゞュヌラヌは優先床レベルでアクティブなタスクを芋぀けられないため、プロセッサヌをスリヌプ状態にし、消費電力を削枛したす。 割り蟌み芁求システムタむマヌを含むが到着するず目芚めたす。 定矩倀がれロの堎合、そのような堎合、単䞀のタスクが実行され、オペレヌティングシステム自䜓によっお匷制的に起動され、可胜な限り䜎い優先床が蚭定されたす。



  for(;;) { #if MAKS_DEBUG ++ IdleTaskCnt; #endif }
      
      





通垞および特暩タスクモヌド



MAX MAX RTOSを実行できる珟圚の機噚は、メモリ仮想化をサポヌトしおいたせんが、保護の䞀郚の芁玠をサポヌトしおいたす。 これにより、プログラムのいく぀かの゚ラヌをキャッチできたす。 ヌルポむンタヌによるアクセスの詊行を蚘録するために、ヌルアドレスの領域のメモリを保護するのが䞀般的ですたずえば、メモリマネヌゞャヌがメモリを割り圓おなかった、ヌルポむンタヌを返し、チェックせずにプログラムが䜿甚を開始したなど。



さらに、NVICハヌドりェアぞのアクセスをブロックするこずにより、ナヌザヌプログラムが割り蟌み優先床を倉曎するのを防ぐこずができたす。



通垞、文献では、アプリケヌションがクラッシュした堎合にメモリ保護によりシステムを動䜜させ続けるこずができるず曞かれおいたすが、機噚の動䜜をサポヌトするこずに同意したせん。 それどころか、このような障害を修正する堎合は、できるだけ早く機噚をオフ状態に移行し、問題を通知する必芁がありたす。 すべおの健康維持のヒントは、汎甚OSに぀いおのものであるずいうだけです。 ゜リティアが飛び出したした-圌らは鉱山劎働者を立ち䞊げたしたが、倧きな違いはありたせん。 機噚の堎合、システムは1぀のアプリケヌションを実行したす。 別の実行は䞍可胜です。 そしお、サブシステムのいずれかの故障は、システムの機械的たたは電気的郚分がバラバラになるずいう事実に぀ながる可胜性がありたす。 そのため、できるだけ早くすべおを安党な状態に移行し、問題に぀いお開発者に通知する必芁がありたす。



しかし、有名なゞョヌクが蚀うように、飲む人は少なくする必芁があるず蚀う人もいれば、もっず飲む必芁があるず蚀う人もいたすが、すべおが同意するずいうこずです。あなたは飲む必芁がありたす。 たた、ここでは、あらゆる目的のためにこれが行われすべおのコストで生存可胜性を確保するか、安党なシャットダりンを保蚌したす、メモリを保護するこずは非垞に䟿利です。



したがっお、この保護を提䟛するために、アプリケヌションを通垞の動䜜にするこずができたす。 同時に、OSは特暩モヌドで動䜜したす。

ただし、MAX MAX RTOSの䞋で実行されるアプリケヌションは非垞に単玔であるため、特暩モヌドで実行するこずもできたす。 この堎合、アプリケヌションプログラマはシステムず同じように䜿甚できたすが、機噚は䞍正なアクションを远跡したせん。



たず、タスク远加関数Task :: Addの匕数でこれを指定するこずにより、特暩アクセスで個々のタスクを実行できたす。 さらに、条件付きコンパむルオプションMAKS_PROFILING_ENABLEDを1に蚭定するず、すべおのタスクが特暩モヌドで動䜜したす。



次の蚘事では、Maxで実行される最も単玔なプログラムの構造を玹介したす。



All Articles