2012-03-21 11 views
18

私はARM Cortex M3チップ(STM32F2)を使用しており、STは "標準周辺ライブラリ"を提供しています。いくつかの便利な.cと.hファイルがあります。 .sファイルもあります。Cプロジェクトでの.sファイルの役割は何ですか?

Cプロジェクトのコンテキストでこれらの.sファイルの目的は何ですか?私のコンパイラ/リンカーを入手するには?それらを考慮に入れますか?

答えて

27

.s拡張子は、GNUや他の多くのツールチェーンがアセンブラファイル用に使用している規則です。

最後に、STM32標準ペリフェラルライブラリにはアセンブラファイルは含まれていませんでしたが、CMSISライブラリにはさまざまなSTM32部品のスタートアップコードが含まれています。たとえば、startup_stm32f2xx.sはすべてのSTM32F2xxシリーズデバイスのスタートアップコードです。異なるツールチェーンにはさまざまな実装があります。特定のパーツとツールチェーンに関連付けられたファイルをビルドしてリンクする必要があります。ビルドして実行するサンプルプロジェクトを使用している場合や、特定のプロジェクトを作成しているIDEを使用している場合は、実行しているコードがある場合は、すでに完了しているはずです。

コードの作成方法とリンク方法は、使用しているツールチェーンによって異なります。ほとんどのIDEベースのツールは自動的に拡張子を認識し、アセンブラを呼び出して他のリンクと同様にリンクされるオブジェクトファイルを生成します。正確な内容はツールチェーンのバージョンによって若干異なりますが、主にCランタイム環境(スタックとヒープ)の作成、プロセッサの初期化、初期割り込み/例外ベクタテーブルの定義、静的データの初期化、main()へのジャンプを行います。

例えばKeil社/ ARMのRealViewバージョンのファイルのコアは、次のようになります。

; Reset handler 
Reset_Handler PROC 
       EXPORT Reset_Handler    [WEAK] 
     IMPORT SystemInit 
     IMPORT __main 
       LDR  R0, =SystemInit 
       BLX  R0 
       LDR  R0, =__main 
       BX  R0 
       ENDP 

Reset_Handlerは、アドレスプログラムカウンタ(PC)レジスタは、プロセッサのリセット後に設定されますです。

SystemInitは、初期化の大部分を行う外部Cコード関数です。これは、ハードウェアのカスタマイズが必要な場合があります。ベクタテーブルには、リセット時に自動的にSPレジスタにロードされるリセットアドレスと初期スタックポインタアドレスの両方が含まれているため、Cortex-Mはリセット直後にCコードの実行を開始できる点で珍しいです。その結果、1つを実行するために、多くのアセンブラ知識は必要ありません。

__main()は、Cコードのコンパイラが提供するエントリポイントです。これはmain()関数ではありませんが、 `main() '関数を呼び出す前に標準ライブラリ、静的データ、ヒープの初期化を行います。

Keil/ARM RealViewバージョンで__main()によって行われた多くの作業を行っているため、GCCバージョンは多少関わっていますが、基本的に同じ機能を実行します。

CMSIS SystemInit()はsystem_stm32f2xx.cで定義されており、正しいクリスタル周波数、PLL設定、外部SRAM設定などのように、ボードのカスタマイズが必要な場合があります。これはCコードでよくコメントされているので、おそらくもっと快適になるでしょう。

+0

あなたがSTM32F2xxを指定したことに気付いたことを除いて、あなたのケースでは、それぞれのファイル名がstartup_stm32f2xx.sとsystem_stm32f2xx.cであることを除けば、答えはそのまま適用されます。私はその答えをSTM32F2に特化させるように変更しました。 – Clifford

+0

Clifford - ARMのWebサイトのドキュメントでは、startup_xxx.s、__user_initial_stack_heap内の他のルーチンが88バイトを超えるスタックを使用すべきではないことに言及しています。その限界がどこから来ているのか知っていますか? http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0099a/armlib_cihhdahf.htm – NickHalden

+0

を参照してください。@ニックハルデン:それはおそらくそれが自分自身で質問として掲示されるべきだと思いますか?この質問は2年以上経過していて、あなたの質問でもありません。これは彼がコメントしたセクションではありません - SOはディスカッションフォーラムではありません。しかも、あなたはそのように大きな聴衆を得るでしょう。 – Clifford

7

通常、アセンブリコードが含まれています。アセンブラはそれらをオブジェクトファイルに変換し、後でリンカによって主なものとリンクされます。しかし、コンパイラ、ツールチェーンなどに依存していると思います。

1

あなたのSTキットには、おそらくKeilベースの開発環境があります。コンパイラのバージョンによっては、プロジェクトファイルのC、C++、およびアセンブラコードのセクションが異なります。 IDEで、プロジェクトを開き、 "プロジェクトのプロパティ"またはそのようなものを探します。

アセンブラコードとの間でシンボルをインポートおよびエクスポートして、シンボルとC/C++コードがリンクするようにすることができます。 Keilではすべてが合理的にうまく統合されています。

EXPORTディレクティブは、C/C++コードをリンクできるように、指定されたシンボルをpublicにするようにアセンブラに指示します。

IMPORTディレクティブは、指定されたシンボルが別の場所で定義されており、リンク時に解決されることをアセンブラに通知します。

関連する問題