11

私は 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: 腕なしエビ
4

4 に答える 4

9

これは、リンカー スクリプトを使用するか、適切なオプションをリンカーに渡すことで実行できます。ld の場合、--defsym=SVC_Handler=vPortSVCHandler

--defsymldオプションとリンカー スクリプトでの割り当ての詳細については、binutils のドキュメントを参照してください。

于 2011-10-04T15:23:23.333 に答える
3

エイリアスの問題は、単なるエイリアスであるため、宣言および定義された関数を期待していることだと思います。別の関数の前方宣言として使用したい。私はそのように動作するように似たものを得ました:

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

これにより、SVC_Handler のエントリ ポイントの名前が変更されます。定義しない場合は、vPortSVCHandler が検出されます。

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

于 2016-02-18T10:39:49.270 に答える
0

SVC ハンドラーは初期起動時に FreeRTOS によってのみ使用されると確信しているため、間接例外ハンドラーを追加してもパフォーマンスが低下することはありません (ただし、醜い)。FreeRTOS フォーラムでこれを尋ねるのが最善です。そこの反応は通常素晴らしいものです。

これがお役に立てば幸いです、よろしくお願いします、デイブ

于 2011-10-04T15:10:57.713 に答える