変数参照が最適化される

ee9king に投稿

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して待機で、割り込みで抜けるように書けないかな。

 

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
  • 行と段落は自動的に折り返されます。