CS+でC言語のグロバール変数の扱いがよくわかりません

皆様、お寒い中お仕事ご苦労様です。

およしと申します。

派遣で仕事していますが、仕事が切れて自宅待機になりました。

回路設計が主業務ですが、久々に勉強がてら自宅でマイコンでもと奮闘しています。

以前は、PM+とV850を使用していましたが、今回はCS+とRX62Nにしました。

 

しかし、タイマーを利用したウェイト関数を作ろうとしたのですが、どうも旨く行きません。

理由をご存じの方がおりましたら、教えて頂けたらと思います。

処理としては、グローバル変数をフラグとして、割り込みでリセットされるまで、ルーするという簡単な内容なはずですが、

割り込みも入っていますし、ウォッチで変数を見ても、確実にフラグがリセットされているのに、ループを脱出できない状況になっています。

mainの冒頭でInitWait();を呼んで、その後別の関数からWait0((unsigned short)216);と呼んでいます。

 

#include "iodefine.h"
#include "vect.h"

//
// WAIT初期化
//  CMTによるタイマーに関する設定
//      CMT0-PCLK/8=3MHz(33.33uS)
//      CMT1-PCLK/128=187.5KHz(5.33mS)
//
/////////////////////////////////////////////////

char fWait0;    // Wait0用割り込みフラグ
char fWait1;    // Wait1用割り込みフラ

void InitWait(){

    SYSTEM.MSTPCRA.BIT.MSTPA15 = 0;  // CMTユニット0停止解除
    //CMT0.CMCR.BIT.CKS = 0;   // PCLK/8(初期値)
    CMT0.CMCR.BIT.CMIE = 1;   // CNT0割り込み許可
    CMT1.CMCR.BIT.CKS = 2;   // PCLK/128
    CMT1.CMCR.BIT.CMIE = 1;   // CMT1割り込み許可
    ICU.IPR[4].BIT.IPR = 5;   // CNT0割り込み優先レベル=5(0は割り込み禁止)
    ICU.IPR[5].BIT.IPR = 5;   // CMT1割り込み優先レベル=5(0は割り込み禁止)
    ICU.IER[3].BIT.IEN4 = 1;   // CNT0割り込み許可(IRQ8=ベクタ番号28-ベクタアドレス+070h)
    ICU.IER[3].BIT.IEN5 = 1;   // CMT1割り込み許可(IRQ9=ベクタ番号29-ベクタアドレス+074h)
    }

//
// WAIT0
//   CMT0を使ったウエイト関数
//
/////////////////////////////////////////////////

void Wait0(unsigned short count){

    CMT0.CMCNT = 0;    // カウンタクリア
    CMT0.CMCOR = count;      // カウント値セット
    fWait0 = 1;        //フラグセット 
    CMT.CMSTR0.BIT.STR0 = 1;      // カウントスタート
   
    // 割り込みがあるまでウェイト
    while(fWait0);
    }

//
// WAIT0用割り込み処理
//
/////////////////////////////////////////////////

void IntWait0(void){

    CMT.CMSTR0.BIT.STR0 = 0;      // カウント停止
    fWait0 = 0;        // フラグリセット
    }

 

変数の宣言で初期化しないとグローバルにならないのかなとか思いましたが、そういうことでもないらしいです。

ちなみに、while(fWait0);をwhile(CMT.CMSTR0.BIT.STR0);にするとループを脱出できます。

よろしくお願いします。

Parents
  • わわいです
    最適化で、変数のチェックを省略されたためにそうなってしまってますねー

    char fWait0; // Wait0用割り込みフラグ
    を、
    volatile char fWait0; // Wait0用割り込みフラグ
    と書き換えてやってみましょう
  • わいわいさん

    ありがとう御座います。
    volatileについて調べて、解りました。
    つまり、変数を確認する必要がないと認識されたことにより、
    変数のチェックが省略されたといことですね。

    お忙しい処、ありがとうございました。
  • デバッグで変数が上手くウオッチ出来ないときに、volatileを付けてやるとしっかり見えたりもします。
  • わわいです
    コンパイラの設定で、最適化なし、の設定にするとそのままでもあなたの思うように動くようになります

    また、コンパイラの設定で、インフォメーションメッセージを表示する設定にすると、このような場合にもメッセージが表示されますんで、ある程度判別できるようになります。。が、いろんな余計なメッセージも山ほど出してくれますがw
  • Mooさん

    助言ありがとうございます。
Reply Children
No Data