CY_ISRで使用するとグローバル変数が機能しない - KBA224452- Community Translated (JA)
- RSS フィードを購読する
- 新着としてマーク
- 既読としてマーク
- ブックマーク
- 購読
- 印刷用ページ
- 不適切なコンテンツを報告
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)が実行されます。