3

私は TI のサンプル コードで次のスイッチ ケースを見ています。

__interrupt void Timer_A(void)
{
  switch (TAIV, 10)        // Efficient switch-implementation
  {
    case  2:  break;                        // TACCR1 not used
    case  4:  break;                        // TACCR2 not used
    case 10:  P1OUT ^= 0x01;                // overflow
              break;
  }
}

私の推測では、「10」の大文字と小文字の値を最初にチェックする優先順位があると思いますが、よくわかりません。

4

3 に答える 3

8

本質的な呼び出しが欠落していると思います:

switch (__even_in_range(TAIV, 10))
{

__even_in_rangeMSP-430 MCU に使用される組み込み関数です。これは、MSP-430 用の TI コンパイラcl430と MSP-430 用の IAR コンパイラの両方によって提供されます。これには、割り込みベクトル レジスタと、許容範囲内の最後の値 (この例では 10) の 2 つの引数が必要です。組み込み関数は、コンパイラが効率的なコードを生成できるようにするために使用されます。

MSP-430コンパイラ ドキュメントの IAR を参照してください。この例は 25 ページにあります。

#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1_ISR(void)
{
    switch (__even_in_range(TAIV, 10))
    {
    case 2: P1POUT ˆ= 0x04;
    break;
    case 4: P1POUT ˆ= 0x02;
    break;
    case 10: P1POUT ˆ= 0x01;
    break;
    }
}

そして言います:

組み込み関数の効果は、生成されたコードが指定された範囲内の偶数の値のみを処理できることです。タイマー A の割り込みベクトル レジスタは 0、2、4、6、8 しか使用できないため、これはまさにこの場合に必要なものです。 、または 10。

__even_in_range237ページの説明には次のように書かれています。

指定された値が偶数であり、指定された範囲内にあることに依存するようコンパイラーに指示します。それに応じてコードが生成され、要件が満たされた場合にのみ機能します

于 2013-08-08T10:24:53.003 に答える