Real-Time Workshop User's Guide | ![]() ![]() |
Task Synchronizationブロック
VxWorks Task Synchronizationブロックは、独立したVxWorksタスクとして、出力に接続しているファンクションコールサブシステムを起動するファンクションコールサブシステムです。別の2つのファンションコールサブシステムの間に置かれることを意図しています。一般的に、VxWorks Asynchronous InterruptブロックとファンクションコールサブシステムブロックまたはStateflowチャートの間に置かれます。その他の例は、Task Synchronizationブロックをファンクションコールとして設定されたイベント、"Output to Simulink"をもつStateflow線図の出力に置きます。
VxWorks Task Synchronizationブロックは、つぎの機能を実行します。
taskSpawn()
を使って独立したタスクとして起動されます。タスクは、モデルの終了時にtaskDelete()
を使って削除されます。semTake()
を使ってセマフォを待ちます。semTake()
が最初に呼び出されるとき、NO_WAIT
が指定されます。これにより、タスクは、2番目のsemGive()
がファンクションコールサブシステムの終了前に発生するかどうかを決定できます。これは、割り込みレートが速すぎるかあるいはタスクの優先度が低すぎることを示します。semgive()
は、Task Synchronizationブロック(マスクされたファンクションコールサブシステム)に対して生成されます。これにより、出力ファンクションコールサブシステムの実行が可能です。例として、Task SynchronizationブロックをVxWorks Asynchronous Interruptブロックの出力に接続する場合、semGive()
はISR内部で発生します。Task Synchronizationパラメータ
下図は、VxWorks Task Synchronizationブロックのダイアログボックスを示します。
Task Synchronizationブロックに関連するパラメータは、以下の通りです。
taskSpawn()
システムコールの第一引数として利用されます。この名前は、VxWorks ルーチンによって利用され、呼び出すタスクを識別してデバッグを援助します。デフォルトでは、Real-Time Workshopは、すべての生成コード内でのローカル変数に対するバイト数を8192バイトに制限します(matlabroot
/rtw/c/tornado/tornado.tlc
のMaxStackSize
の割り当てを参照)。規則として、タスクとして起動される1つの関数に2回8192バイト(16384)を与えて十分にすべきです。
Task Synchronizationブロックの例
この例題は、Task Synchronizationブロックを簡単なISRとして示します。
Task Synchronizationブロックは、このコードをTarget Language Compilerコード生成フェーズ中に挿入します。
MdlStart
では、Task Synchronizationブロックは、Asynchronous InterruptブロックによってISRとして登録されます。Task Synchronizationブロックは、同期セマフォを作成し、初期化します。ファンクションコールサブシステムを独立したタスクとして起動します。/* Create and spawn task: <Root>/Faster Rate(.015) */
if ((*(SEM_ID *)rtPWork.s6_S_Function.SemID =
semBCreate(SEM_Q_PRIORITY, SEM_EMPTY)) == NULL)
ssSetErrorStatus(rtS,"semBCreate call failed "
"for block <Root>/Faster Rate(.015).\n ");
}
if ((rtIWork.s6_S_Function.TaskID = taskSpawn("root_Faster_", 20, VX_FP_TASK, 1024, (FUNCPTR)Sys_root_Faster__OutputUpdate,
(int_T)rtS, 0, 0, 0, 0, 0, 0, 0, 0, 0)) == ERROR) {
ssSetErrorStatus(rtS,"taskSpawn call failed for block <Root>/ Faster Rate " "(.015).\n");
}
/* Output and update for function-call system: <Root>/Faster Rate(.015) */
void Sys_root_Faster__OutputUpdate(void *reserved, int_T controlPortIdx, int_T tid)
{
/* Wait for semaphore to be released by system: <Root>/Task Synchronization */
for(;;) {
if (semTake(*(SEM_ID *)rtPWork.s6_S_Function.SemID,NO_WAIT) != ERROR) {
logMsg("Rate for function-call subsystem"
"Sys_root_Faster__OutputUpdate() fast.\n",0,0,0,0,0,0);
#if STOPONOVERRUN
logMsg("Aborting real-time simulation.\n",0,0,0,0,0,0);
semGive(stopSem);
return(ERROR);
#endif
} else {
semTake(*(SEM_ID *)rtPWork.s6_S_Function.SemID, WAIT_FOREVER);
}
/* UniformRandomNumber Block: <S3>/Uniform Random Number */
rtB.s3_Uniform_Random_Number =
rtRWork.s3_Uniform_Random_Number.NextOutput;
.
.
.
}
![]() | Asynchronous Interruptブロック | Asynchronous Bufferブロック | ![]() |