一方、前のページで、「リアルタイムOS不要」とご紹介いたしました。このため、実際のハードウエアにアクセスするための仕組みが必要です。
このハードウエアにアクセスする仕組みが xC 言語(ライブラリ)として用意されています。
1. ハードウエアへのアクセス
- Port (in/out/bi-direction)
- Declaration (example): out port output_port_A = XS1_PORT_1A;
→ "output_port_A" を物理ポート"1A" に出力ポートとして割り当て
- Declaration (example): in port input_port_B = XS1_PORT_1B;
→ "input_port_B" を物理ポート"1B" に入力ポートとして割り当て
- Usage (example) output_port_A <: unsigned_variable_Y;
→ 出力ポート"output_port_A" に変数unsigned_variable_Y の値を出力
- Usage (example): input_port_B :> unsigned_variable_X;
→ 入力ポート "input_port_B" の値を、変数 unsigned_variable_X に取り込む
- Timer
- Declaration (example): timer t;
- Usage (example): t :> unsigned_timer_variable;
→ 現在のタイマー "t" の値を変数unsigned_timer_variable に取り込む
- Clock
- Declaration (example): clock mclk_clock_in = CLKBLK2;
→ クロックブロック CLKBLK2 を、mclk_clock_in 変数に割り当て
- Channel
- Declaration (example): chan chA;
- Usage (example): chA <: unsigned_variable_Zo;
→ チャネル chA に、変数 unsigned_variable_Zo の値を出力
- Usage (example): chA :> unsigned_variable_Zi;
→ チャネル chA からの値を、変数 unsigned_variable_Zi に受信
- par { .... }
以下の例では、main 関数内で、Task0() と Task1() を、各CPUに割り当てています。
par {} 内の関数又は処理が、それぞれの CPU に割り当てられます。
- select { ... }
- case "条件"/ default
xCORE-200 によるプログラミングでは、割込みの概念がありません。その代りに、「イベント」が定義され、そのイベントに応じて処理を記述します。
このイベントとして定義できるのは次の3種類です。
- ポート
- タイマー
- チャネル
それぞれのイベントが発生した場合に、異なる処理を行う内容を記述するのが、select文 (case/default) になります。
以下の記述例では、いづれかのイベントが発生した時に、異なる処理を行います。
- timer t0 が 1ms 経過したときに process1() を実行
- 入力ポート p_inA の値が変化した時に、process2() を実行
- チャネル chA からの入力が発生した時に、process3 () を実行
======================================================================
in port p_inA = XS1_PORT_1A;
chan chA;
timer t0;
unsigned timeout0;
unsigned pval_inA;
unsigned chvalA;
t0 :> timeout0;
timeout0 += XS1_TIMER_KHZ; //+1ms
p_inA :> pval_inA; //現在のポートの値を取得
while (1)
{
select {
case t0 when timerafter(timeout0) :> timeout0:
//t0 が timeout0 よりも大きい場合に、t0 値が timeout0 に設定
timeout0 += XS1_TIMER_KHZ; //+1ms
process1 ();
break;
case p_inA when pinsneq( pval_inA ) :> pval_inA:
// p_inA が pval_inA の値と異なる時、p_inA の値が pval_inA に設定
process2 () ;
break;
case chA:> chvalA:
//チャネル chA から値を受信したときに、chvalA 変数に設定される
process3 ();
break;
} //select
} //while(1)
======================================================================
xC に関する詳しい説明は、XMOS Programming Guide にございますので、ご参照ください。
次回は、xCORE-200 ハードウェアについて簡単に見ていきます。ここまで説明した xC 記述とハードウェアの関係がわかります。
(その他の投稿については、右上の「ページ」をご確認ください)
xC に関する詳しい説明は、XMOS Programming Guide にございますので、ご参照ください。
次回は、xCORE-200 ハードウェアについて簡単に見ていきます。ここまで説明した xC 記述とハードウェアの関係がわかります。
(その他の投稿については、右上の「ページ」をご確認ください)
0 件のコメント:
コメントを投稿