2011-10-04 9 views
6

私は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

答えて

8

あなたが、または例えば、リンカに適切なオプションを渡すことで、どちらかのリンカスクリプトでこれを行うことができるはずです。 LDのため、--defsym=SVC_Handler=vPortSVCHandler

は、LD --defsymオプションの詳細については、binutilsのマニュアルを参照してください、と私はFreeRTOS例の1つから収集assignments in linker scripts

+1

'SVC_Handler = vPortSVCHandler;'をリンカスクリプトの先頭に追加するだけで、その作業が完了します。まだ乱雑に見えますが、うまくいきます。 –

+0

このソリューションは、LTOではまったく動作しないように見えることに注意してください。生成された命令では、 "0x0"を指し示すシンボルが常に出されているようです。 –

0

私はSVCハンドラのみFreeRTOSで使用されているかなり確信しています ハンドラを追加すると、パフォーマンスが低下することはありません(しかし、その 醜い)。最初の起動時に が発生します。 FreeRTOSフォーラムでこれを尋ねると、 の応答があります。このことができます

希望、よろしく、デイブ

+0

私は、同様のSysTickとPendSVハンドラのw /これを実行する必要があることを追加する必要があります。私はFreeRTOSフォーラムでも尋ねるかもしれませんが、FreeRTOSよりもGCCのツールチェーンについては本当に疑問です。 –

1

別の解決策は、あなたのFreeRTOSConfig.hに以下を追加することです。.. 。

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS 
standard names - or at least those used in the unmodified vector table. */ 
#define vPortSVCHandler SVC_Handler 
#define xPortPendSVHandler PendSV_Handler 
#define xPortSysTickHandler SysTick_Handler 

オリジナルファイルも設定にCMSISシステムクロックを統合FreeRTOS /デモ/ CORTEX_M0_LPC1114_LPCXpresso/RTOSDemo /ソース/ FreeRTOSConfig.hからです。 CMSIS/FreeRTOSプロジェクトの出発点です。

2

エイリアスの問題は、単なるエイリアスであるため、宣言され定義された関数が必要であると思います。あなたは別の関数の前方宣言としてそれを使いたいと思っています。

void SVC_Handler(void) asm("vPortSVCHandler"); 

これはSVC_Handlerのエントリポイントの名前を変更し、あなたがそれを定義しない場合、それがvPortSVCHandlerを見つける必要があります:私はそのように動作するように同様のことを得ました。

参照:https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html

関連する問題