Keil Logo

シグナル関数

シグナル関数を使用すると、µVision4 でターゲットプログラムを実行している間、バックグラウンドでシグナル入力やパルスなどの操作を繰り返すことができます。シグナル関数を使用すると、シリアル I/O、アナログ I/O、ポート通信、およびその他の外部反復イベントのシミュレートおよびテストを行うことができます。

µVision4 でターゲットプログラムをシミュレートしている間、バックグラウンドでシグナル関数が実行されます。したがって、シグナル関数はµVision4 でターゲットプログラムを実行するために、ある時点で twatch 関数を呼び出し、遅延する必要があります。µVision4 は、twatch を呼び出さないシグナル関数に対してエラーを報告します。

  • µVision4 には、シグナル関数で使用できるさまざまなシステム変数が用意されています。詳細については、「システム変数」を参照して下さい。

シグナル関数は SIGNAL キーワードで始まり、次のように定義されます。

SIGNAL void fname (parameter_list) {
  statements
}
fname 関数の名前です。
parameter_list 関数に渡される引数のリストです。各引数には型と名前が必要です。関数に引数が渡されない場合は、parameter_list に対して void を使用します。複数の引数はコンマで区切ります。
statements 関数が実行する命令です。
{ 開き括弧です。開き括弧の数が閉じ括弧 ("}") の数と一致したときに、関数の定義が完了します。

次の例は、1,000,000 CPU ステートごとに 1 回ずつシリアル入力バッファに文字「A」を入力するシグナル関数を示しています。詳細については、「関数の作成」を参照して下さい。

SIGNAL void StuffS0in (void) {
  while (1) {
    S0IN = 'A';
    twatch (1000000);
  }
}

この関数を呼び出すには、[コマンド](Command)ウィンドウに次のように入力します。

StuffS0in()

StuffS0in シグナル関数を呼び出すと、ASCII 文字「A」がシリアル入力バッファに入力され、1,000,000 CPU ステートだけ遅延して、このプロセスが繰り返されます。

制約

シグナル関数には次のような制約があります。

  • シグナル関数の戻り値型は void である必要があります。
  • シグナル関数が持てる関数パラメータは最大 8 つです。
  • シグナル関数が、他の定義済み関数、ユーザ関数、またはシグナル関数を呼び出すことがあります。
  • シグナル関数がユーザ関数によって呼び出されることがあります。
  • シグナル関数は twatch 関数を少なくとも 1 回呼び出す必要があります。twatch を呼び出さないシグナル関数は、ターゲットプログラムに実行時間を与えることができません。Ctrl+C を使用してシグナル関数を中止できないため、µVision4 が無限ループに入る場合があります。

シグナル関数の管理

µVision4 は、アクティブなシグナル関数のキューを維持します。シグナル関数はアイドル状態または実行中のいずれかです。twatch の呼び出しで指定された CPU ステート数が期限切れになるのを待つ間、アイドル状態のシグナル関数は遅延します。実行中のシグナル関数は、関数内でステートメントを実行しています。

シグナル関数を呼び出すと、µVision4 によってその関数がキューに追加され、実行中とマークされます。シグナル関数は 1 回しか有効化できません。関数が既にキューにある場合は警告が表示されます。コマンド SIGNAL STATE を使用すると、アクティブなシグナル関数の状態を表示できます。コマンド SIGNAL KILL を使用して、キューからアクティブなシグナル関数を削除します。

シグナル関数が twatch 関数を呼び出すと、twatch に渡された CPU ステート数だけアイドル状態になります。ユーザプログラムが指定数の CPU ステートを実行した後、シグナル関数は実行中になります。twatch の後のステートメントで実行が続けられます。

戻りステートメントのためにシグナル関数が終了すると、アクティブなシグナル関数のキューから自動的に削除されます。

アナログの例

次の例は、C167 で入力をアナログ入力 0 に変えるシグナル関数を示しています。この関数は、0V とシグナル関数の唯一の引数として指定された上限の間で、0.5V ずつ入力電圧を増加または減少させます。このシグナル関数は無限に繰り返され、各電圧ステップで 200,000 ステート遅延します。

signal void analog0 (float limit) {
float volts;

printf ("Analog0 (%f) entered.\n", limit);
  while (1) {           /* forever */
    volts = 0;
    while (volts <= limit) {
      ain0 = volts;     /* analog input-0 */
      twatch (200000);  /* 200000 states Time-Break */
      volts += 0.1;     /* increase voltage */
    }
    volts = limit;
    while (volts >= 0.0) {
      ain0 = volts;
      twatch (200000);  /* 200000 states Time-Break */
      volts -= 0.1;     /* decrease voltage */
    }
  }
}

シグナル関数 analog0 は次のようにして呼び出すことができます。

>ANALOG0 (5.0)           /* Start of 'ANALOG()' */
ANALOG0 (5.000000) ENTERED

SIGNAL STATE コマンドは、analog0 の現在の状態を表示します。

>SIGNAL STATE
 1  idle     Signal = ANALOG0 (line 8)

µVision4 によって、内部関数番号、シグナル関数の状態(アイドル状態か実行中)、関数名、および実行している行番号がリストされます。

シグナル関数がアイドル状態なので、analog0twatch 関数を実行し(analog0 の 8 行目)、指定された CPU ステート数が経過するのを待機していると推察できます。200,000 ステートが経過すると、analog0 は 8 行目または 14 行目で twatch が次に呼び出されるまで実行を続けます。

次のコマンドは、analog0 シグナル関数をアクティブなシグナル関数のキューから削除します。

>SIGNAL KILL ANALOG0
  Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.

Change Settings

Privacy Policy Update

Arm’s Privacy Policy has been updated. By continuing to use our site, you consent to Arm’s Privacy Policy. Please review our Privacy Policy to learn more about our collection, use and transfers
of your data.