1

TMS470 コンパイラを使用して、特定のマクロに渡される変数が C 言語で volatile 型で宣言されていることを確認するための創造的なソリューションを探しています。意味:

良い方法:

volatile int   *_p_reg;
VOLATILE_MACRO(_p_reg);

コンパイルの失敗:

int   *_p_reg;
VOLATILE_MACRO(_p_reg);

コンパイル後に検証を実行したいと考えています。つまり、逆アセンブルまたはデバッグ情報を調べて、それらの呼び出しを特定したいと考えています。デバッグ情報に volatile の証拠が見つからないようです。

何か案は?

ありがとう!

4

2 に答える 2

1

何もないとは思いませんが、もちろん、それは完全にコンパイラ次第です。

もちろん、マクロが定義全体を行うように再構築することもできます。

#define VOLATILE_MACRO(t, p) volatile t p

次のように使用します。

VOLATILE_MACRO(int, _p_reg);

もちろん、それはうまくいかないかもしれません。

于 2014-06-17T14:14:15.340 に答える
0

gcc 拡張機能を使用した 2 つの解決策。実行時バージョンでは__builtin_types_compatible_passert. コンパイル時のバージョンも似ていますが、ハックを使用してコンパイル時に起動する静的アサートを取得します (ただし、やや不可解なエラー メッセージが表示されます)。

ランタイム

#include <stdio.h>
#include <assert.h>

#define VOLATILE_MACRO(p) \
    assert (__builtin_types_compatible_p(typeof(p), typeof(volatile int *)))

int main()
{
    volatile int * x;
    int * y;

    VOLATILE_MACRO(x);  // <<< OK
    VOLATILE_MACRO(y);  // <<< run-time error

    return 0;
}

コンパイル時

#include <stdio.h>
#include <assert.h>

#define A                      BUILD_NAME(__LINE__)
#define BUILD_NAME(line)       BUILD_NAME2(line)
#define BUILD_NAME2(line)      assert_ ## line
#define STATIC_ASSERT(test)    typedef char A[(test) ? 1 : -1]

#define VOLATILE_MACRO(p) \
    STATIC_ASSERT (__builtin_types_compatible_p(typeof(p), typeof(volatile int *)))

int main()
{
    volatile int * x;
    int * y;

    VOLATILE_MACRO(x);  // <<< OK
    VOLATILE_MACRO(y);  // <<< compile error

    return 0;
}

他のタイプをサポートする必要がある場合は、マクロを複数の連鎖テストでvolatile単純に拡張できることに注意してください。__builtin_types_compatible_p

#define VOLATILE_MACRO(p) \
    assert (__builtin_types_compatible_p(typeof(p), typeof(volatile int *)) ||
            __builtin_types_compatible_p(typeof(p), typeof(volatile short *)))
于 2014-06-17T15:22:42.860 に答える