私はSTM32(Cortex-M3)上でFreeRTOSを使っていて、STのCMSISライブラリを使ってすべてをブートストラップしています。GCCのエイリアスが翻訳単位の外で機能するようにする--AKA-これは仕事のためのツールでさえもこれですか?
CMSISライブラリは、起動時の ".s"ファイルに弱い記号SVC_Handler
を定義します。割り込みベクタテーブルでISRを取得するには、どこかでオーバーライドする必要があります。 FreeRTOSはvPortSVCHandler
を定義します。これはSVR割り込みを処理したい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 void vPortSVCHandler(void) __attribute__ ((naked));
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
これは、同じエラーを生成します。だから私はそうのように、私はmain.cのにextern
にシンボルを試してみようと思いました。助言がありますか???
いずれのライブラリも変更しないようにしたいと思います。私は、単にvPortSVCHandler
を呼び出す関数SVC_Handler
を書くことができますが、それはISRに不必要なオーバーヘッドを(おそらく最適化設定によって)追加する可能性があることを知っています。注:FreeRTOSの例では、カスタム起動ファイルを使用してこれを実行しています。私はC または私のリンカースクリプトからこれを行う方法を探しています。
- コンパイラのバージョン:gccのバージョン4.5.2(のSourcery G ++ Liteの2011.03から42)
- 対象:アームなし、EABI
'SVC_Handler = vPortSVCHandler;'をリンカスクリプトの先頭に追加するだけで、その作業が完了します。まだ乱雑に見えますが、うまくいきます。 –
このソリューションは、LTOではまったく動作しないように見えることに注意してください。生成された命令では、 "0x0"を指し示すシンボルが常に出されているようです。 –