2016-07-15 19 views
5

私はGCC-ARM-EmbeddedとFreeRTOSを使用しています。 FreeRTOSの機能は、であり、一部の インラインアセンブラコードでのみ使用されています。GCC LTOによる関数の削除を防止する

問題は次のとおりです。LTOを使用すると、GCCはインラインアセンブラコードを考慮せず、関数が使用されていないと判断して削除します。インラインアセンブラコードの関数呼び出しを解決できないため、リンカが失敗します。

私は__attribute__((used))を適用しますが、私はFreeRTOSコード(STM32CubeMXによって生成されています)に触れたくありません。

は、私は私のコードでこれを入れてみましたが、実際にGCCは、これが機能することはできませのに十分スマートです:こと、

if(false) 
    vTaskSwitchContext(); 

が異なるソースファイルでGCCを伝えるためにいくつかの方法があり、またはパラメータを経由してこの関数は削除しないでください。

// file1.c 
void vTaskSwitchContext(void) 
{ 
    ... 
} 

// file2.c 
void xPortPendSVHandler(void) 
{ 
    __asm volatile 
    (
    ... 
    " isb         \n" 
    " bl vTaskSwitchContext    \n" 
    " mov r0, #0       \n" 
    ... 
    ); 
} 
+0

これはどうして起こるのだろうか。リンカーは、オブジェクトファイルとその外部参照を確認します。シンボルがCコードかインラインアセンブリから参照されるかどうかは関係ありません。 –

+0

@undur_gongor:LTOは多くのことを変え、一般的に驚きを引き起こす可能性があります。 「リンカ」は実際にオブジェクトファイルと外部参照を表示せず、リンカはコンパイラのバックエンドのフロントエンドとして機能し、コンパイラのバックエンドからの結果をリンクします。 –

答えて

6

usedをマークされている別の関数から関数を呼び出してください。

void dummyFunction(void) __attribute__((used)); 

// Never called. 
void dummyFunction(void) { 
    vTaskSwitchContext(); 
} 
関連する問題