私はARMのボード上でLCD画面上で動作するC言語のポン型ゲームを作成しています。ゲームの要件の一部は「魔法の時間」と呼ばれるものです。ARM組み込みCプログラミングのタイマーの使用
「魔法の時間」の期間は、5~10秒の間のランダムな間隔、すなわち最後の「魔法の時間」の後の5~10秒の間に起こり、ランダムな持続時間は2~10秒間続きます。
私はARMのボード上でLCD画面上で動作するC言語のポン型ゲームを作成しています。ゲームの要件の一部は「魔法の時間」と呼ばれるものです。ARM組み込みCプログラミングのタイマーの使用
「魔法の時間」の期間は、5~10秒の間のランダムな間隔、すなわち最後の「魔法の時間」の後の5~10秒の間に起こり、ランダムな持続時間は2~10秒間続きます。
私は本当にあなたの質問(あなたがタイマ割り込みを経由して、毎秒、このコードを実行し、またはか?)を理解していないが、私は一目で見多少の誤差があります。
while (magicTime == true) {
magicTimeLength++;
magicTime == magicTimeLength;
}
最後の行は、 (magicTime == magicTimeLength;
)は何もしません。magicTime
がmagicTimeLength
と等しいかどうかを単に評価するので、デッドループに入ります。
私はあなたがこれをしたいと思います:
magicTimeOccurence
ランダムな値を持つ5と10magicTimeLength
内のランダムな値を2と10magicTimeOccurence
場合が0より大きい場合は、値を1減らして を減らします。magicTimeOccurence
ヒット0になると、magicTimeLength
の値が に1減少します。magicTimeLength
が0より大きいかどうかを確認します。可能であれば、それは魔法の です(したがって、magicTime
フラグをtrue
に設定してください)。デクリメント magicTimeLength
。magicTimeLength
の場合は、あなたが1秒の周期であなたのtimer0
割り込みを初期化する必要がありますfalse
にmagicTime
を設定し、1に進みます。
/* Set timer 0 period */
T0PR = 0;
T0MR0 = SYS_GetFpclk(TIMER0_PCLK_OFFSET)/(TIMER0_TICK_PER_SEC);
だが、1秒ごとにトリガーされるようにしてください。
ここにサンプルコードがありますが、それは私の言いたいことを示すはずです。
/* In void InitTimer0Interrupt() */
...
T0TCR_bit.CE = 1; /* Counting Enable */
magicTimeOccurence = 5+(rand()%5);
magicTimeLength = 2+(rand()%8);
magicTime = false;
__enable_interrupt();
}
/* In void Timer0IntrHandler (void) */
void Timer0IntrHandler (void) {
/* clear interrupt */
T0IR_bit.MR0INT = 1;
VICADDRESS = 0;
if(magicTimeOccurence > 0)
{
magicTimeOccurence--;
}
else if(magicTimeLength > 0){
magicTime = true;
magicTimeLenght--;
}
else{
magicTime = false;
magicTimeOccurence = 5+(rand()%5);
magicTimeLength = 2+(rand()%8);
}
/* take action on timer interrupt */
}
はい、メインクラスのtimerinterruptを使用して毎秒実行されます。 私は自分のロジックがどのように欠陥があるかを理解しました。ブール値を時間の長さに設定しようとしていました。 お返事ありがとうございます、私は自分のコードを書き換えて返信します。 – user1080390
問題はありません、幸運!私は私の答えにサンプルコードを追加しました。 –
これは動作しますか?私は印象に残っていたので、whileループを呼び出して、値が増減するようにしなければならないでしょうか? または、timerinterruptのためにifステートメントを実行し続けますか? – user1080390
「magicTime == magicTimeLength;」の目的は何ですか?ブール値と整数(それ自体が問題です)を比較しますが、どこにでも結果を格納しません。 –
これはQ&Aサイトです。あなたは質問をし、答えます。あなたの質問は何ですか? –
タイマはARMコアの一部ではありません(ARM Cortex-M SYSCLKは例外ですが、Cortex-Mコードではありません)。 ARMベースのマイクロコントローラのペリフェラルデバイスは、ベンダーによって定義されています。どのベンダーからどのARM部品を正確に指定する必要があります。おそらくRTOSを使ってシステム全体を簡素化することができます。 – Clifford