GCC-ARM-Embedded と FreeRTOS を使用しています。FreeRTOS には、vTaskSwitchContext()
一部のインライン アセンブラ コードでのみ使用される機能があります。
問題は次のとおりです。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"
...
);
}