このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
時間ベースのスケジューリング モデル例
時間カウンターのメモリ使用量の最適化
この例は、コード ジェネレーターが時間カウンターに割り当てるメモリ量を最適化する方法を示しています。この例では、経過時間、つまり 2 つのイベントの時間間隔を保存するメモリを最適化します。
コード ジェネレーターは、時間カウンターを符号なし整数で表します。時間カウンターのワード サイズは、モデル コンフィギュレーション パラメーター [アプリケーションのライフスパン] の設定に基づいています。このパラメーターは、アプリケーションが実行される予測最大時間を指定します。このパラメーターを使用して時間カウンターのオーバーフローを防ぐことができます。既定のサイズは 64 ビットです。
時間カウンターが使用するビット数は、[アプリケーションのライフスパン (日)] パラメーターの設定に応じて変わります。たとえば、時間カウンターがオーバーフローを回避するために 1 kHz のレートでインクリメントする場合、カウンターのビット数は次のようになります。
ライフスパン < 0.25 秒: 8 ビット
ライフスパン < 1 分: 16 ビット
ライフスパン < 49 日: 32 ビット
ライフスパン > 50 日: 64 ビット
64 ビット時間カウンターは、5 億 9,000 万年オーバーフローしません。
モデル例を開く
モデル例 rtwdemo_abstime
を開きます。
モデルは、SS1
、SS2
、SS3
の 3 つのサブシステムで構成されます。[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[数学とデータ型] ペインで、[アプリケーションのライフスパン (日)] パラメーターは既定値の inf
に設定されています。
3 つのサブシステムには、出力値を計算するための入力として経過時間を必要とする Discrete-time Integrator が含まれます。サブシステムは、次のように変わります。
SS1 - 1 kHz のクロックで動作します。時間カウンターは必要ありません。トリガー端子の [サンプル時間タイプ] パラメーターは、[
periodic
] に設定されます。経過時間は 0.001 としてインライン化されます。SS2 - 100 Hz のクロックで動作します。時間カウンターが必要です。1 日のライフスパンに基づいて、32 ビット カウンターに経過時間が保存されます。
SS3 - 0.5 Hz のクロックで動作します。時間カウンターが必要です。1 日のライフスパンに基づいて、16 ビット カウンターに経過時間が保存されます。
モデルのシミュレーション
モデルのシミュレーションを実行します。既定の設定では、モデルはサンプル時間を異なる色で表示します。3 つのサブシステムの離散サンプル時間は、赤、緑、青で表示されます。トリガーされたサブシステムは青緑で表示されます。
コードとレポートの生成
1. ビルドと検査プロセス用に一時フォルダーを作成します。
2. GRT システム ターゲット ファイルと inf
日間のライフスパンを使用するようにコード ジェネレーターのモデルを設定します。
3. モデルを作成します。
### Starting build procedure for: rtwdemo_abstime ### Successful completion of build procedure for: rtwdemo_abstime Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================= rtwdemo_abstime Code generated and compiled. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 12.1s
生成コードのレビュー
生成されたソース ファイル rtwdemo_abstime.h
を開きます。
struct tag_RTM_rtwdemo_abstime_T { const char_T *errorStatus; /* * Timing: * The following substructure contains information regarding * the timing information for the model. */ struct { uint32_T clockTick1; uint32_T clockTickH1; uint32_T clockTick2; uint32_T clockTickH2; struct { uint16_T TID[3]; uint16_T cLimit[3]; } TaskCounters; } Timing; }; /* Block states (default storage) */ extern DW_rtwdemo_abstime_T rtwdemo_abstime_DW; /* Zero-crossing (trigger) state */ extern PrevZCX_rtwdemo_abstime_T rtwdemo_abstime_PrevZCX; /* External inputs (root inport signals with default storage) */ extern ExtU_rtwdemo_abstime_T rtwdemo_abstime_U; /* External outputs (root outports fed by signals with default storage) */ extern ExtY_rtwdemo_abstime_T rtwdemo_abstime_Y; /* Model entry point functions */ extern void rtwdemo_abstime_initialize(void); extern void rtwdemo_abstime_step0(void); extern void rtwdemo_abstime_step1(void); extern void rtwdemo_abstime_step2(void); extern void rtwdemo_abstime_terminate(void); /* Real-time Model object */ extern RT_MODEL_rtwdemo_abstime_T *const rtwdemo_abstime_M; /*- * The generated code includes comments that allow you to trace directly * back to the appropriate location in the model. The basic format * is <system>/block_name, where system is the system number (uniquely * assigned by Simulink) and block_name is the name of the block. * * Use the MATLAB hilite_system command to trace the generated code back * to the model. For example, * * hilite_system('<S3>') - opens system 3 * hilite_system('<S3>/Kp') - opens and selects block Kp which resides in S3 * * Here is the system hierarchy for this model * * '<Root>' : 'rtwdemo_abstime' * '<S1>' : 'rtwdemo_abstime/SS1' * '<S2>' : 'rtwdemo_abstime/SS2' * '<S3>' : 'rtwdemo_abstime/SS3' */ #endif /* RTW_HEADER_rtwdemo_abstime_h_ */
4 つの 32 ビット符号なし整数の clockTick1
、clockTickH1
、clockTick2
および clockTickH2
が、サブシステム SS2
と SS3
の経過時間を格納するカウンターになります。
最適化の有効化とコードの再生成
1. モデルを再設定してライフスパンを 1 日に設定します。
2. モデルを作成します。
### Starting build procedure for: rtwdemo_abstime ### Successful completion of build procedure for: rtwdemo_abstime Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================== rtwdemo_abstime Code generated and compiled. Incremental checksum changed. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 8.0106s
再生成コードのレビュー
struct tag_RTM_rtwdemo_abstime_T { const char_T *errorStatus; /* * Timing: * The following substructure contains information regarding * the timing information for the model. */ struct { uint32_T clockTick1; uint16_T clockTick2; struct { uint16_T TID[3]; uint16_T cLimit[3]; } TaskCounters; } Timing; }; /* Block states (default storage) */ extern DW_rtwdemo_abstime_T rtwdemo_abstime_DW; /* Zero-crossing (trigger) state */ extern PrevZCX_rtwdemo_abstime_T rtwdemo_abstime_PrevZCX; /* External inputs (root inport signals with default storage) */ extern ExtU_rtwdemo_abstime_T rtwdemo_abstime_U; /* External outputs (root outports fed by signals with default storage) */ extern ExtY_rtwdemo_abstime_T rtwdemo_abstime_Y; /* Model entry point functions */ extern void rtwdemo_abstime_initialize(void); extern void rtwdemo_abstime_step0(void); extern void rtwdemo_abstime_step1(void); extern void rtwdemo_abstime_step2(void); extern void rtwdemo_abstime_terminate(void); /* Real-time Model object */ extern RT_MODEL_rtwdemo_abstime_T *const rtwdemo_abstime_M; /*- * The generated code includes comments that allow you to trace directly * back to the appropriate location in the model. The basic format * is <system>/block_name, where system is the system number (uniquely * assigned by Simulink) and block_name is the name of the block. * * Use the MATLAB hilite_system command to trace the generated code back * to the model. For example, * * hilite_system('<S3>') - opens system 3 * hilite_system('<S3>/Kp') - opens and selects block Kp which resides in S3 * * Here is the system hierarchy for this model * * '<Root>' : 'rtwdemo_abstime' * '<S1>' : 'rtwdemo_abstime/SS1' * '<S2>' : 'rtwdemo_abstime/SS2' * '<S3>' : 'rtwdemo_abstime/SS3' */ #endif /* RTW_HEADER_rtwdemo_abstime_h_ */
[アプリケーションのライフスパン (日)] パラメーターの新しい設定では、コード ジェネレーターに、時間カウンター用に確保するメモリを少なくするよう指示します。生成コードには次が含まれます。
32 ビット符号なし整数
clockTick1
。SS2
のタスクの経過時間を保存します。16 ビット符号なし整数
clockTick2
。SS3
のタスクの経過時間を保存します。
関連情報
シングルレート モデリング (OSなしのベア ボード)
このモデルでは、ベアボード ターゲット (オペレーティング システムが搭載されていない) に構成したシングル レートの離散時間モデルのコード生成を示します。
モデル例を開く
モデル例 rtwdemo_srbb
を開きます。
open_system('rtwdemo_srbb')
このモデルは 1 つのサンプル時間を使用し、ブロック線図の更新時にサンプル時間の色を表示するように設定されています。Inport ブロック In1_1s と In2_1s は 1 秒のサンプル時間を指定し、これは、モデル コンフィギュレーション パラメーター [周期的なサンプル時間の制約] の設定により実施されます。
このモデルは注釈付きの色分けされたサンプル時間を表示するように設定されています。モデルを開いた後に表示するには、Ctrl+D を押してブロック線図を更新します。凡例を表示するには、Ctrl+J を押します。このモデルは 1 つのサンプル時間で設定されているため、モデル内で最速の離散サンプル時間を表す赤色で表示されます。
シングルタスク モードのマルチレート モデル化 (OS なしのベア ボード)
このモデルでは、ベアボード ターゲット (オペレーティング システムが搭載されていない) に構成したマルチ レートの離散時間モデルに生成されるコードを説明します。
モデル例を開く
モデル例 rtwdemo_mrstbb
を開きます。
open_system('rtwdemo_mrstbb')
このモデルには 2 つのサンプル時間が含まれています。Inport ブロック 1 と Inport ブロック 2 は、それぞれ 1 秒と 2 秒のサンプル時間を指定します。これには、モデル コンフィギュレーション パラメーター [周期的なサンプル時間の制約] の設定が適用されています。ソルバーにはシングルタスク操作が設定されています。したがってプリエンプションは発生せず、異なるサンプル時間で実行されるブロック間に Rate Transition ブロックは含められません。
このモデルは注釈付きの色分けされたサンプル時間を表示するように設定されています。モデルを開いた後に表示するには、Ctrl+D を押してブロック線図を更新します。凡例を表示するには、Ctrl+J を押します。赤色はモデル内の最速の離散サンプル時間を表し、緑色は 2 番目に速いサンプル時間を、黄色は混在しているサンプル時間を表します。
マルチタスク モードのマルチレート モデル化 (OS なしのベア ボード)
このモデルでは、マルチタスクのベアボード ターゲット (オペレーティング システムのないもの) に構成したマルチレートの離散時間モデル用の生成コードを説明します。
モデル例を開く
モデル例 rtwdemo_mrmtbb
を開きます。
open_system('rtwdemo_mrmtbb')
モデル例の確認
このモデルには 2 つのサンプル時間が含まれています。Inport ブロック 1 と Inport ブロック 2 は、それぞれ 1 秒と 2 秒のサンプル時間を指定します。これには、モデル コンフィギュレーション パラメーター [周期的なサンプル時間の制約] の設定が適用されています。ソルバーにはマルチタスク動作が設定されています。つまり、1 秒のタスクが 2 秒のタスクをプリエンプトする場合に、Rate Transition ブロックではデータの整合性が確実に維持される必要があります。Simulink® および Simulink Coder™ によって適切なレート変換が常に適用されます。このモデルでは明示的に Rate Transition ブロックを指定します。または、モデル コンフィギュレーション パラメーター [データ転送に対するレート変換を自動的に取り扱う] を設定して Simulink でこのブロックを自動的に挿入できます。
このモデルは、ブロック線図の更新時にサンプル時間の色を表示するように設定されています。モデルを開いた後に表示するには、Ctrl+D を押してブロック線図を更新します。凡例を表示するには、Ctrl+J を押します。赤色はモデル内の最速の離散サンプル時間を表し、緑色は 2 番目に速いサンプル時間を、黄色は混在しているサンプル時間を表します。
データ転送の仮定
タスク間データ転送の操作の基礎:
1 つの読み取りタスクと 1 つの書き込みタスクの間でデータ遷移が発生する。
バイト単位の変数の読み取りと書き込みはアトミックである。
データの遷移中に 2 つのタスクが対話した場合、一方のタスクがもう一方のタスクをプリエンプトする場合がある。
周期的タスクの場合、速いレートのタスクの優先順位は遅いレートのタスクよりも高くなる。すなわち、速いレートのタスクは遅いレートのタスクを常にプリエンプトする。
タスクは 1 つのプロセッサ上で実行される。タイム スライスは許可されない。
プロセスは、特にデータがタスク間で転送されているときはクラッシュまたは再起動しない。
マルチタスク モードのマルチレート モデル化 (VxWorks® OS)
この例では、マルチタスク オペレーティング システム ターゲット (VxWorks®) 用に設定されたマルチレート離散モデルのコードを生成します。このモデルには 2 つのサンプル時間が含まれています。Inport ブロック 1 と Inport ブロック 2 は、それぞれ 1 秒と 2 秒のサンプル時間を指定します。これには、モデル コンフィギュレーション パラメーター [周期的なサンプル時間の制約] の設定が適用されています。ソルバーにはマルチタスク動作が設定されています。つまり、1 秒のタスクが 2 秒のタスクをプリエンプトする場合に、Rate Transition ブロックではデータの整合性が確実に維持される必要があります。Simulink® とコード ジェネレーターは、適切なレート変換を適用します。このモデルでは明示的に Rate Transition ブロックを指定します。または、モデル コンフィギュレーション パラメーター [データ転送に対するレート変換を自動的に取り扱う] を設定して、このブロックを挿入するよう Simulink® に指示することができます。
このモデルは注釈付きの色分けされたサンプル時間を表示するように設定されています。モデルを開いた後に表示するには、Ctrl+D を押してブロック線図を更新します。凡例を表示するには、Ctrl+J を押します。赤色はモデル内の最速の離散サンプル時間を表し、緑色は 2 番目に速いサンプル時間を、黄色は混在しているサンプル時間を表します。
モデル例
model = 'rtwdemo_mrmtos';
open_system(model);
確定性とデータの整合性のトレードによるシステム性能の改善
このモデルは、Rate Transition ブロックがマルチレート、マルチタスク モデルで使用された場合の操作モードの相違点を説明します。Rate Transition ブロックの柔軟なオプションにより、アプリケーションに最適なモードを選択できます。確定レベルとデータの整合性をトレードし、システム性能を改善できます。
Rate Transition ブロックの操作モード
データの整合性と確定性を確保 (DetAndInteg): 信号 (幅の広い信号のすべての要素を含む) のすべてのデータ バイトが同じタイム ステップからとなるようにデータが転送されます。また、データがあるレートから別のレートに転送される相対サンプル時間 (遅延) は常に同じになります。ANSI® C コードのみが使用され、ターゲット固有の 'クリティカル セクション' 保護は必要ありません。
整合性を確保 (IntegOnly): 信号 (幅の広い信号のすべての要素を含む) のすべてのデータ バイトが同じタイム ステップからとなるようにデータが転送されます。ただし、あるデータ転送から次のデータ転送までの、データが転送される相対サンプル時間 (遅延) は異なることがあります。このモードでは、データの読み取り/書き込みを行うコードが DetandInt モードよりも頻繁に実行されます。最悪の場合、遅延は DetandInt モードと等しくなりますが、遅延は短くなる可能性があり、これは一部のアプリケーションにおいて重要です。また、このモードは DetandInt モードでサポートされない非同期レートとの間のデータ転送をサポートします。ANSI-C コードのみが使用され、ターゲット固有の 'クリティカル セクション' 保護は必要ありません。
データ整合操作は行われない (None): この場合、Rate Transition ブロックはコードを生成しません。このモードは、スカラー データ型のアトミック アクセスが保証される一部のアプリケーションにおいて、データの相対時相値が重要でない場合に許容されます。このモードでは遅延は発生しません。
データ転送の仮定
タスク間データ転送の操作の基礎:
1 つの読み取りタスクと 1 つの書き込みタスクの間でデータ遷移が発生する。
バイト単位の変数の読み取りと書き込みはアトミックである。
データの遷移中に 2 つのタスクが対話した場合、一方のタスクがもう一方のタスクをプリエンプトする場合がある。
周期的タスクの場合、速いレートのタスクの優先順位は遅いレートのタスクよりも高くなる。すなわち、速いレートのタスクは遅いレートのタスクを常にプリエンプトする。
すべてのタスクは 1 つのプロセッサ上で実行される。タイム スライスは許可されない。
プロセスはクラッシュまたは再起動しない (特にデータがタスク間を転送されているとき)。
モデル rtwdemo_ratetrans
open_system('rtwdemo_ratetrans')
モデル rtwdemo_ratetrans
では、以下の Rate Transition ブロックの操作モードにおける相違を示します。
Rate Transition ブロック DetAndIntegF2S
確定性とデータの整合性 (高速から低速への遷移):
ブロック出力は永続的なデータ バッファーとして使用される。
データは遅いレートで出力に書き込まれるが、速いレート コンテキスト時に実行される。
遅いレートから見えるデータは常に、速いレートと遅いレートの両方が最後に実行されたときの値となる。遅いレートが実行されている間、速いレートによる後続のステップ (および関連付けられたデータ更新) は、遅いレートからは見えない。
Rate Transition ブロック DetAndIntegS2F
確定性とデータの整合性 (低速から高速への遷移):
2 つの永続的なデータ バッファー、内部バッファーおよびブロック出力を使用する。
内部バッファーは遅いレートで出力にコピーされるが、速いレート コンテキスト時に実行される。
内部バッファーは遅いレートで遅いレート コンテキスト時に書き込まれる。
速いレートから見えるデータは常に遅延しており、したがってデータは遅いレート コードの前のステップからのものとなる。
Rate Transition ブロック IntegOnlyF2S
データの整合性のみ (高速から低速への遷移):
ブロック出力は永続的なデータ バッファーとして使用される。
読み取り処理中のフラグが立っていなければ、データは速いレート コンテキスト時にバッファーに書き込まれる。
フラグが設定されるとデータが遅いレートでバッファーから出力にコピーされ、その後フラグはクリアされる。これは確定的なケースと比較すると追加のコピーとなる。
遅いレートから見えるデータは、遅いレートと速いレートの両方が実行された時点からのものではなく、速いレートのより最近のステップからのものである場合がある。
Rate Transition ブロック IntegOnlyS2F
データの整合性のみ (低速から高速への遷移):
2 つの永続的なデータ バッファー (いずれも内部バッファー) を使用する。
2 つのバッファーの一方は常に速いレートで出力にコピーされる。
2 つのバッファーの一方は遅いレートで遅いレート コンテキスト時に書き込まれ、その後アクティブなバッファーが切り替わる。
速いレートから見えるデータは確定的なケースの場合よりも最近のものになることがある。遅いレートと速いレートの両方にヒットがある場合は特に、速いレートからは遅いレートの前の値が見える。ただし、速いレートの後続のステップからは更新された値が見えることがある (遅いレートによってアクティブでないバッファーが更新され、アクティブなバッファー フラグが切り替わる場合)。
Rate Transition ブロック NoneF2S
確定性とデータの整合性が見送られる場合、Rate Transition ブロックのコードは生成されません。
Rate Transition ブロック NoneS2F
確定性とデータの整合性が見送られる場合、Rate Transition ブロックのコードは生成されません。
bdclose('rtwdemo_ratetrans');