Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

CY_ISRで使用するとグローバル変数が機能しない - KBA224452- Community Translated (JA)

CY_ISRで使用するとグローバル変数が機能しない - KBA224452- Community Translated (JA)

ChaitanyaV_61
Employee
Employee
50 questions asked 25 likes received 25 sign-ins

Community Translated by NoTa_4591161          Version: **

 

Translation - English: Global Variables Not working When Used in CY_ISR - KBA224452

質問:

メイン関数とCY_ISRで使用されるグローバル変数が機能していません。なぜですか

回答:

より高いレベルの最適化では、グローバル変数はコンパイラによって最適化されます。これは、変数がCY_ISRなどの関数によってのみ変更される場合に発生します。次のサイプレス開発者コミュニティメンバーのBob Marlowe さんからのコードスニペットに示すようにvolatileキーワードを使用して、同様の変数を最適化しないようコンパイラに通知します。

 

コード例:

 

uint8 FlagToCheck = FALSE;

CY_ISR(SecHandler)
{
      SecTimer_Stop();
      SecTimer_ReadStatusRegister();

      FlagToCheck = TRUE;
}

int main(void)

{

     CyGlobalIntEnable; /* グローバル割り込みを有効にします。*/

    Timeout_StartEx(SecHandler);

    SecTimer_Start();

    LED_Write(LEDOFF);

    /* ここに初期化/起動コードを配置します(例:MyInst_Start()) */

    while(!FlagToCheck)
    {

    }
      LED_Write(LEDON);

      while(TRUE)

      {

            CyDelay(100);

      }

}

この例では、コンパイラーの最適化がより高いレベルに設定されている場合、LED_Write(LEDON)は実行されません。ただし、volatileキーワードを追加すると、LED_Write(LEDON)が実行されます。

0 件の賞賛
457 件の閲覧回数