ハードウェアを操作する xC 言語(ライブラリ)

xCORE-200 による組み込みソフトウェアの開発は、基本的には ANSI C 言語で行います。

一方、前のページで、「リアルタイム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 に受信
         
         
2. 各タスクをCPUに割り当てる
    •    par { .... }

      以下の例では、main 関数内で、Task0() と Task1() を、各CPUに割り当てています。
      par {} 内の関数又は処理が、それぞれの CPU に割り当てられます。




3. イベント処理
    •   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 記述とハードウェアの関係がわかります。


(その他の投稿については、右上の「ページ」をご確認ください)

0 件のコメント:

コメントを投稿