1

私はCortexM3に取り組んでおり、IAREWARMを使用しています。DWT_DYCCNTタイミング計算にはを使用します。問題は、(コンパイラオプションを使用して)速度を上げるためにコードを最適化すると、DWT_DYCCNTデバッグ中にの値が失われることです。コードはCおよびC++です。また、を使用して変数の値を出力しようとしましたprintfが、エラーも返されます。

変数を作ってみましたvolatileが、それも役に立ちません。

デバッグ中、私は常にunknown valueこの変数を取得します。

速度が最適化され、変数の値が失われないコードでコードのタイミングを計算する方法を知りたいです。コンパイラにこれらの変数の値を保持させるにはどうすればよいですか?

編集:

     volatile int count = 0;
        volatile unsigned int *DWT_CYCCNT = (unsigned int *)0xE0001004; //address of the register
        volatile unsigned int *DWT_CONTROL = (unsigned int *)0xE0001000; //address of the register
        volatile unsigned int *SCB_DEMCR = (unsigned int *)0xE000EDFC; //address of the register

        *SCB_DEMCR = *SCB_DEMCR | 0x01000000;
        *DWT_CYCCNT = 0; // reset the counter
        *DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter

_DO_SOMETHING_HERE_

count = *DWT_CYCCNT;
         printf("\n COUNT!!!! = %d",*DWT_CYCCNT);

コードをデバッグするとき、の値countは「失われます」。

ありがとう

4

3 に答える 3

1

ある期間を測定したい場合は、オシロスコープを使用できます。タイミングを測定したいコードのセクションに入ったらピンを HIGH に設定し、セクションが終了したらピンを LOW に設定するだけです。

これは、組み込みのタイミングを測定する最も正確な方法です。

于 2013-03-16T07:37:33.667 に答える
0

_DO_SOMETHING_HERE_ が外部操作ではなく、揮発性操作が含まれていない場合、コンパイラは、プログラム結果を変更しない場合、揮発性操作の前後に移動できます。

揮発性操作のみが注文されます。

ベンチマークには同様のコードを使用しますが、count には global volatile を好みます (arm-none-eabi-gcc 4.6 で動作しました)。

于 2014-02-20T11:17:09.213 に答える