os2からos5へ変更する際に、どうもTickerがうまく動かなかった。
Ticker tbase;
DigitalOut led(LED1);
volatile int tb_reach=0;
void tbase_t(void){
tb_reach=0;
}
int main(){
tbase.attach( callback(tbase_t) , 0.5 ) ;
while (true) {
led = !led;
// thread_sleep_for(500);
while( tb_reach );
tb_reach = 1;
}
}
mbed-os5-example-blinkyのthread_sleep_for()をTickerに変えるだけだから、動いて当然、と思ってたのに while( tb_reach ); のところからぬけてくれないみたいな動きになった。
Tickerの値を変えたらたまに動いたり、極端に小さくすると動いたり、また前後に処理を入れると動く時があったりで、困っていた。
確認のため、os2でもやってみたら、同じように動かない。あれ?、動いているプログラムもあるんだけど(処理は違うんだけど)、まさかね?、と思いmbedオンラインでもやったら、動いてないやん、えー、今までと何も変えてないよー。
communityに質問してようやく答えを教えてもらえた。
whileステートメントでのtb_reach変数の参照が最適化されてしまって、意図した動作になっていないようです。以下のようにvolatile修飾すれば、期待した動作になると思いますのでお試しください。
volatile int tb_reach=0;
volatile、、、以前にも同様のことを誰かに教えてもらったのかも、たぶんそんな気がする。年取って物忘れがさらにひどいな。申し訳ない。
後で試してみたら、次のようにしても動作できるみたいだった。
while( tb_reach ){
wait_us(1);
}
でも、これだと、目的達しないことあるよな気がしない?
msp430のように、sleepして待機で、割り込みで抜けるように書けないかな。
コメントを追加