私は STM32 (Cortex-M3) で FreeRTOS を使用しており、ST の CMSIS ライブラリを使用してすべてをブートストラップしています。
CMSIS ライブラリはSVC_Handler
、スタートアップの ".s" ファイルでウィーク シンボルを定義します。割り込みベクター テーブルで ISR を取得するには、どこかでオーバーライドする必要があります。FreeRTOS はvPortSVCHandler
、SVC 割り込みを処理させたい ISR である を定義します。
アプリケーション コードを使用して (つまり、FreeRTOS または CMSIS ソース コードを変更せずに) 2 つを「接着」したいと考えています。エイリアスがこの仕事に適したツールだと思ったので、これを試しました (別のソース ファイル main.c で):
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
その結果、次のようになります。error: 'SVC_Handler' aliased to undefined symbol 'vPortSVCHandler'
GCC のドキュメント( http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html ) によると、属性を使用するためにalias
、翻訳単位の外でシンボルをエイリアスすることはできません。extern
だから私は次のようにシンボルをmain.cにしようと思った:
extern void vPortSVCHandler( void ) __attribute__ (( naked ));
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
これにより、同じエラーが生成されます。助言がありますか???
どちらのライブラリも変更することは避けたいと思います。SVC_Handler
単純に を呼び出す関数を作成できることはわかっていvPortSVCHandler
ますが、ISR に不要なオーバーヘッドが追加される可能性があります (おそらく最適化設定によって異なります)。注: FreeRTOS の例では、カスタム スタートアップ ファイルを介してこれを実現しています。Cまたはリンカー スクリプトからこれを行う方法を探しています。
- コンパイラのバージョン: gcc バージョン 4.5.2 (Sourcery G++ Lite 2011.03-42)
- Target: 腕なしエビ