11

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"
    ...
    );
}
4

4 に答える 4

11

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

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

// Never called.
void dummyFunction(void) {
    vTaskSwitchContext();
}
于 2016-07-15T07:04:12.923 に答える
0

お使いのバージョンの FreeRTOS が既にマクロportDONT_DISCARDを使用している場合は、独自にvTaskSwitchContext()定義できますportDONT_DISCARDportmacro.h

#define portDONT_DISCARD __attribute__((used))

基本的にバックポートhttps://github.com/FreeRTOS/FreeRTOS-Kernel/commit/07e672c448e2a4ea56ae793f1c6dae26d908b16e

于 2021-03-29T09:53:33.170 に答える