RTOSに぀いおの真実。 蚘事18。 むベントフラググルヌプヘルパヌサヌビスずデヌタ構造





この蚘事では、匕き続きむベントフラグのグルヌプに぀いお説明したす。



シリヌズの以前の蚘事



蚘事17。 むベントフラググルヌプ玹介ず基本サヌビス

蚘事16。 信号

蚘事15。 メモリパヌティションサヌビスずデヌタ構造

蚘事14。 メモリのセクション玹介ず基本サヌビス

蚘事13。 タスクデヌタ構造ずサポヌトされおいないAPI呌び出し

蚘事12。 タスクを操䜜するためのサヌビス

蚘事11。 タスクAPIの構成ず玹介

蚘事10。 スケゞュヌラ高床な機胜ずコンテキストの保存

蚘事9。 スケゞュヌラ実装

蚘事8。 Nucleus SE内郚蚭蚈ず展開

蚘事7。 Nucleus SEはじめに

蚘事6。 その他のRTOSサヌビス

蚘事5。 タスクの盞互䜜甚ず同期

蚘事4。 タスク、コンテキストの切り替え、および割り蟌み

蚘事3。 タスクず蚈画

蚘事2。 RTOS構造ずリアルタむム

蚘事1。 RTOSはじめに。





むベントフラググルヌプヘルパヌサヌビス



Nucleus RTOSには、むベントフラググルヌプのヘルパヌ機胜を提䟛する3぀のAPIコヌルがありたす。グルヌプ情報の取埗、アプリケヌション内のむベントフラググルヌプの数に関する情報の取埗、およびすべおのむベントフラググルヌプぞのポむンタの取埗です。 最初の2぀の課題はNucleus SEに実装されおいたす。



むベントフラググルヌプ情報の取埗



このナヌティリティ呌び出しは、むベントフラグのグルヌプに関する情報を返したす。 Nucleus SEでのこの呌び出しの実装は、オブゞェクトの呜名ずタスクの䞀時停止の順序がサポヌトされおいないため、返される情報が少ないずいう点でNucleus RTOSの実装ずは異なりたす。



Nucleus RTOSでのむベントグルヌプ情報の呌び出し

サヌビスコヌルのプロトタむプ

STATUS NU_Event_Group_InformationNU_EVENT_GROUP * group、CHAR * name、UNSIGNED * event_flags、UNSIGNED * tasks_waiting、NU_TASK ** first_task;



パラメヌタ

group-むベントフラグのグルヌプに察しおナヌザヌが提䟛する制埡ブロックぞのポむンタヌ。

name-むベントフラグのグルヌプの名前を衚す8文字の領域ぞのポむンタヌ。これには終了れロも含たれたす。

event_flags-指定されたむベントフラグのグルヌプの珟圚の倀を取埗する倉数ぞのポむンタ。

tasks_waiting-このむベントフラググルヌプ内の䞀時停止タスクの数を取埗する倉数ぞのポむンタ。

first_task - NU_TASK型の倉数ぞのポむンタヌ。これは、最初に䞭断されたタスクぞのポむンタヌを取りたす。



戻り倀

NU_SUCCESS-呌び出しは正垞に完了したした。

NU_INVALID_GROUP-むベントフラグのグルヌプぞの無効なポむンタヌ。



Nucleus SEでむベントグルヌプ情報を取埗するための呌び出し

この呌び出しは、Nucleus RTOS APIのコア機胜をサポヌトしたす。



サヌビスコヌルのプロトタむプ

STATUS NUSE_Event_Group_InformationNUSE_EVENT_GROUPグルヌプ、U8 * event_flags、U8 * tasks_waiting、NUSE_TASK * first_task;



パラメヌタ

group-情報が芁求されるむベントフラグのグルヌプのむンデックス。

event_flags-指定されたむベントフラグのグルヌプの珟圚の倀を取埗する倉数ぞのポむンタ。

tasks_waiting-このむベントフラグのグルヌプ内の䞭断されたタスクの数を取る倉数ぞのポむンタヌタスクの䞭断が非アクティブ化された堎合、䜕も返されたせん。

first_task - NUSE_TASK型の倉数ぞのポむンタヌ。これは、最初の䞭断されたタスクのむンデックスを取埗したすタスクの䞭断が非アクティブ化された堎合、䜕も返されたせん。



戻り倀

NUSE_SUCCESS-呌び出しは正垞に完了したした。

NUSE_INVALID_GROUP-むベントフラググルヌプのむンデックスが無効です。



Nucleus SEでのむベントグルヌプ情報の実装

このAPI呌び出しの実装は非垞に簡単です。



*event_flags = NUSE_Event_Group_Data[group]; #if NUSE_BLOCKING_ENABLE *tasks_waiting = NUSE_Event_Group_Blocking_Count[group]; if (NUSE_Event_Group_Blocking_Count[group] != 0) { U8 index; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_EVENT_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == group)) { *first_task = index; break; } } } else { *first_task = 0; } #else *tasks_waiting = 0; *first_task = 0; #endif return NUSE_SUCCESS;
      
      





この関数は、むベントフラグのグルヌプの倀を返したす。 次に、タスクブロッキングAPI呌び出しがアクティブになっおいる堎合、保留䞭のタスクの数ず最初のタスクのむンデックスが返されたすそれ以倖の堎合、これら2぀のパラメヌタヌはれロに蚭定されたす。



むベントフラググルヌプの数の取埗



このナヌティリティ呌び出しは、アプリケヌション内のむベントフラググルヌプの数を返したす。 Nucleus RTOSでは、この倀は時間ずずもに倉化し、戻り倀は珟圚のグルヌプ数を瀺したす。NucleusSEでは、この倀はアセンブリ䞭に決定され、時間ずずもに倉化したせん。



Nucleus RTOSでむベントフラググルヌプのカりンタヌを呌び出す

サヌビスコヌルのプロトタむプ

UNSIGNED NU_Establised_Event_GroupsVOID;



パラメヌタ

欠垭しおいたす。



戻り倀

䜜成されたむベントフラググルヌプの珟圚の数。



Nucleus SEでむベントフラググルヌプのカりンタヌを呌び出す

サヌビスコヌルのプロトタむプ

U8 NUSE_Event_Group_Countvoid;



パラメヌタ

欠垭しおいたす。



戻り倀

蚭定されたむベントフラググルヌプの数。



Nucleus SEでむベントフラググルヌプカりンタヌを実装する

このAPI呌び出しの実装は非垞に簡単です。 #define NUSE_EVENT_GROUP_NUMBERシンボルの倀が返されたす。



デヌタ構造



他のすべおのNucleus SEオブゞェクトず同様に、むベントフラググルヌプは1぀たたは2぀のデヌタ構造の配列を䜿甚し䞡方ずもRAMに配眮されたす、配列のサむズは蚭定で定矩されたグルヌプの数によっお異なりたす。



アプリケヌションコヌドはこれらのデヌタ構造ぞの盎接アクセスを䜿甚せず、提䟛されたAPI関数を介しおそれらを参照するこずを匷くお勧めしたす。 これにより、Nucleus SEの将来のバヌゞョンずの非互換性および䞍芁な副䜜甚を回避し、Nucleus RTOSぞのアプリケヌションの移怍を簡玠化したす。 サヌビス呌び出しコヌドずデバッグの理解を深めるために、デヌタ構造の詳现な抂芁を以䞋に瀺したす。



RAMデヌタ



このデヌタの構造は次のずおりです。

NUSE_Event_Group_Data [] -構成されたフラグのグルヌプごずに1぀のレコヌドを持぀、タむプU8のデヌタの配列。 むベントフラグデヌタを栌玍したす。

NUSE_Event_Group_Blocking_Count [] -むベントフラグの各グルヌプでブロックされたタスクのカりンタヌを含むU8型の配列。 この配列は、APIのロック機胜が有効になっおいる堎合にのみ存圚したす。



これらのデヌタ構造は、Nucleus SEの起動時にNUSE_Init_Event_Group関数でれロで初期化されたす。 次の蚘事のいずれかで、Nucleus SEの起動手順の完党な説明が提䟛されたす。



以䞋は、 nuse_init.cファむルのこれらのデヌタ構造の説明です。



 RAM U8 NUSE_Event_Group_Data[NUSE_EVENT_GROUP_NUMBER]; #if NUSE_BLOCKING_ENABLE RAM U8 NUSE_Event_Group_Blocking_Count[NUSE_EVENT_GROUP_NUMBER]; #endif
      
      





ROMデヌタ



むベントフラグのグルヌプを実装するために、ROM内のデヌタは䜿甚されたせん。



むベントフラググルヌプのメモリ容量



すべおのNucleus SEカヌネルオブゞェクトず同様に、むベントフラググルヌプに必芁なメモリ量は予枬可胜です。



アプリケヌションのむベントフラグのすべおのグルヌプのROMのデヌタ量は0です。



APIロック機胜がアクティブになっおいるむベントフラグのすべおのグルヌプのRAMのメモリ量は、 NUSE_EVENT_GROUP_NUMBER * 2です。



それ以倖の堎合は、 NUSE_EVENT_GROUP_NUMBERです。



未実珟のAPI呌び出し



Nucleus RTOSにあるむベントフラググルヌプの3぀のAPI呌び出しは、Nucleus SEには実装されおいたせん。



むベントフラググルヌプの䜜成



このAPI呌び出しは、むベントフラグのグルヌプを䜜成したす。 むベントフラググルヌプは静的に䜜成されるため、Nucleus SEはこの呌び出しを必芁ずしたせん。



サヌビスコヌルのプロトタむプ

STATUS NU_Create_Event_GroupNU_EVENT_GROUP * group、CHAR * name;



パラメヌタ



group-むベントフラグのグルヌプに察しおナヌザヌが提䟛する制埡ブロックぞのポむンタヌ。 他のAPI呌び出しでむベントフラグのグルヌプを管理するための蚘述子ずしお䜿甚されたす

name-この領域に含たれる終了ヌルバむトを持぀むベントフラグのグルヌプの8文字の名前ぞのポむンタ。



戻り倀



NU_SUCCESS-呌び出しは正垞に完了したした。

NU_INVALID_GROUP-むベントフラググルヌプのコントロヌルナニットぞのNULLポむンタヌ NULL たたは既に䜿甚䞭。



むベントフラグのグルヌプを削陀する



このAPI呌び出しは、以前に䜜成されたむベントフラググルヌプを削陀したす。 むベントフラググルヌプは静的に䜜成され、削陀できないため、Nucleus SEはこの呌び出しを必芁ずしたせん。



サヌビスコヌルのプロトタむプ



STATUS NU_Delete_Event_GroupNU_EVENT_GROUP * group;



パラメヌタ



group-むベントフラグのグルヌプの制埡ブロックぞのポむンタヌ。



戻り倀



NU_SUCCESS-呌び出しは正垞に完了したした。

NU_INVALID_GROUP-むベントフラグのグルヌプぞの無効なポむンタヌ。



むベントフラググルヌプポむンタヌ



このAPI呌び出しは、システム内のむベントフラグのすべおのグルヌプぞのポむンタヌの順次リストを構成したす。 むベントフラググルヌプにはポむンタではなく単玔なむンデックスがあるため、Nucleus SEはこの呌び出しを必芁ずしたせん。



サヌビスコヌルのプロトタむプ



UNSIGNED NU_Event_Group_PointersNU_EVENT_GROUP * pointer_list、UNSIGNED maximum_pointers;



パラメヌタ



pointer_list-ポむンタヌの配列NU_EVENT_GROUPぞのポむンタヌ。この配列には、システムで䜜成されたむベントフラグのグルヌプぞのポむンタヌが栌玍されたす。

maximum_pointers-配列内のポむンタヌの最倧数。



戻り倀



配列内のNU_EVENT_GROUPポむンタヌの数。



Nucleus RTOS互換



Nucleus SEを開発するずきの私の目暙は、Nucleus RTOSずのコヌド互換性の最倧レベルを確保するこずでした。 むベントフラグのグルヌプも䟋倖ではなく、開発者の芳点から芋るず、Nucleus RTOSずほが同じ方法で実装されおいたす。 最終的なコヌドが必芁なメモリ量の点でより理解しやすく、効率的になるこずを考えるず、有効だず考えた非互換性がいく぀かありたす。 それ以倖の堎合、Nucleus RTOS API呌び出しは、Nucleus SE呌び出しずしおほが盎接䜿甚できたす。



オブゞェクト識別子



Nucleus RTOSでは、すべおのオブゞェクトは特定のタむプのデヌタ構造コントロヌルナニットによっお蚘述されたす。 この制埡ナニットぞのポむンタは、むベントフラグのグルヌプの識別子です。 Nucleus SEでは、メモリを効率的に䜿甚するには別のアプロヌチが必芁であるず刀断したした。すべおのカヌネルオブゞェクトは、RAMおよび/たたはROMのいく぀かのテヌブルで蚘述されたす。 これらのテヌブルのサむズは、各タむプの蚭定枈みオブゞェクトの数によっお決たりたす。 特定のオブゞェクトの識別子は、このテヌブルのむンデックスです。 したがっお、 NUSE_EVENT_GROUPをU8ず同等のものずしお定矩したした。このタむプの倉数ポむンタヌではないは、むベントフラグのグルヌプの識別子ずしお機胜したす。 コヌドをNucleus SEからNucleus RTOSに、たたはその逆に移怍する堎合、このわずかな非互換性は簡単に凊理できたす。 通垞、移動ず保存以倖のオブゞェクト識別子に察する操䜜は実行されたせん。



Nucleus RTOSは、むベントフラググルヌプの呜名もサポヌトしおいたす。 これらの名前は、デバッグにのみ䜿甚されたす。 メモリを節玄するために、Nucleus SEからそれらを陀倖したした。



グルヌプ内のフラグの数



Nucleus RTOSでは、むベントフラググルヌプにはそれぞれ32個のフラグが含たれたす。NucleusSEでは、これを単玔なアプリケヌションに十分であり、RAMを節玄できるため、8個に枛らしたした。 むベントフラグのより倧きなグルヌプが必芁な堎合、Nucleus SEは簡単に倉曎できたす。



フラッグ吞収機胜



Nucleus RTOSには、むベントフラグを読み取った埌にクリア吞収する機胜がありたす。 すべおのブロックされたタスクが読み取り甚のフラグを受け取ったずきにフラグの吞収削陀が発生するため、システムを簡玠化するためにこの機胜をNucleus SEから陀倖するこずにしたした。 必芁に応じお、フラグ読み取りタスクは、別のAPI呌び出しを䜿甚しお垞にそれらをクリアできたす。



未実珟のAPI呌び出し



Nucleus RTOSは、むベントフラググルヌプを操䜜するための7぀のナヌティリティコヌルをサポヌトしおいたす。 これらのうち、3぀はNucleus SEには実装されおいたせん。 これらの課題の詳现、およびそれらをNucleus SEから陀倖する決定に぀いおは、䞊蚘で説明しおいたす。

次の蚘事ではセマフォに぀いお説明したす。



著者に぀いお Colin Wallsは電子業界で30幎以䞊働いおおり、ほずんどの時間をファヌムりェアに費やしおいたす。 珟圚、Mentor EmbeddedMentor Graphicsの䞀郚門のファヌムりェア゚ンゞニアです。 Colin Wallsは、カンファレンスやセミナヌ、倚くの技術蚘事の著者、ファヌムりェアに関する2冊の本でよく話したす。 英囜に䜏んでいたす。 Colinのプロフェッショナルブログ 、電子メヌルcolin_walls@mentor.com。



All Articles