4

私はavrマイクロコントローラーをプログラムしましたが、armは初めてです。winarmに付属しているsam7s64のサンプルコードを調べました。これらのファイルrom.ld、ram.ld、scatter file、cstartup.sファイルについて混乱しています。私がavrをプログラムしたとき、私はこれらの種類のファイルを見たことがありません。それらのファイルのそれぞれが何をするのか私の疑問を明確にしてください。

4

2 に答える 2

4

http://github.com/dwelch67について熟考するためのさらに多くのサンプルがあります

特定の命令セットをサポートするツールチェーンがあるとします。ツールは、多くの場合、さまざまな実装をサポートしようとします。X 量のフラッシュと Y 量の RAM を備えたマイクロコントローラーがあるとします。あるチップには、別のチップとは異なる場所にRAMがある場合があります。ツールチェーンが最終的にメモリレイアウトを知りたい命令の一部をエンコードするために、命令セットは同じである可能性があります(またはそれ自体が微妙に変更されている可能性があります)。は。一部のプロセッサでは、純粋に位置に依存しないコードを書くことができますが、コストがかかるため、それは必ずしも目標ではありません。ツールはまた、物事に対してUNIXのアプローチをとる傾向があります。ソース言語からオブジェクト ファイルまで、まだメモリ レイアウトがわからないため、後で埋めなければならない穴がいくつか残っています。ツールチェーンと命令セットに応じて、さまざまな言語から取得できます。おそらく、ada と C、およびオブジェクトにコンパイルされる他の言語が混在しています。次に、リンカーはこれらすべてを組み合わせる必要があります。あなたはプログラマーとして、何がどこに行くのかを制御でき、時には制御しなければなりません。ベクター テーブルを適切な場所に配置し、エントリ コードを特定の場所に配置し、.data を最終的に RAM に、.text をフラッシュに配置する必要があります。

gnu ツールの場合は、リンカー スクリプトを使用してリンカーに指示しますが、他のツールチェーンには他の方法がある場合があります。gnu ld を使用すると、ld コマンドラインを使用することもできます...表示されている .ld ファイルは、これを制御するために存在します。現在、これはツールチェーンのインストールの奥深くに埋もれている場合があります。デフォルトのリンカー スクリプトが見つかるデフォルトの場所があります。それでよければ、リンカー スクリプトを作成してプロジェクトに持ち込む必要はありません。avrで使用していたツールに応じて、それをいじる必要がなかった(アセンブリ、avra、または.orgまたは他の同様のステートメントでこれを制御するものを使用していた)か、ツールチェーン/サンドボックスがそれを処理しました。 、埋められました(たとえば、arduinoサンドボックスを使用)。たとえば、hello world プログラムを作成するとします。

#include <stdio.h>
int main ( void )
{
   printf("Hello World!\n");
   return(0);
}

デスクトップ/ラップトップでそれをコンパイルします

gcc hello.c -o hello

関連するリンカ スクリプトがありました。おそらく厄介で、恐ろしく、醜いスクリプトです。しかし、オペレーティング システムのデフォルトのリンカ スクリプトとレイアウトに満足しているので、それを台無しにする必要はありません。1 つのツールチェーンで膨大な数のチップとベンダーをサポートできるこれらのマイクロコントローラーでは、これに対処する必要が生じ始めています。リンカー スクリプトをプロジェクトに保持することをお勧めします。あるマシンまたは人から次のマシンに、どのような正確な gnu クロス コンパイラがあるかわからないためです。それらをツールチェーンに強制するのではなく、プロジェクトでいくつかのものを保持してください。

これの残りの半分、特に gnu ツールでは、リンカー スクリプトとの密接な関係はスタートアップ コードです。C プログラムが呼び出される前に、いくつかの期待事項があります。たとえば、.data が配置され、.bss がゼロになっています。マイクロコントローラの場合、.data を不揮発性メモリに保存する必要があるため、C プログラムを開始するときにそこにあるため、フラッシュにある必要がありますが、.data は読み取り/書き込みであるため、そこから実行することはできません。エントリ ポイントの前にC コードが呼び出されると、.data をフラッシュから RAM の適切な場所にコピーする必要があります。リンカ スクリプトは、.data を保存するフラッシュ内の場所と、それをコピーする RAM 内の場所の両方を記述します。startup.s、start.s、crt0.s など、任意の名前を付けることができるスタートアップ コードは、コードが .data を ram にコピーできるように、リンク ステージ中に入力された変数を取得し、.bss をゼロ アウトできます。スタック ポインターを設定して、スタック (C が機能するために必要な別の項目) を作成すると、そのコードは C エントリ ポイントを呼び出します。これは、他の高水準言語にも当てはまります。他に誰もがスタック ポインターを必要としない場合は、スタートアップ コードが必要です。

私の例のいくつかを見ると、リンカー スクリプトと avr プロセッサのスタートアップ コードも実行していることがわかります。

于 2012-05-26T14:50:25.847 に答える
3

特定のケースで、各ファイル ( rom.ld 、 ram.ld 、スキャッター ファイル 、 cstartup.s ) の内容を正確に知ることは困難です。ただし、それらの名前が十分に説明的であると仮定すると、それらが何を意図しているのかについてのアイデアを提供します。

1- rom.ld/ram.ld : ファイル拡張子により、これらは「リンカー スクリプト」です。これらのファイルは、オブジェクト ファイルの各メモリ セクションをどこに配置するかをリンカに指示します (リンカ スクリプトとその構文の詳細については、 GNU LDを参照してください)。

2- cstartup.s : 繰り返しますが、このファイルの拡張子から。アセンブリで記述されたコードのようです。通常、このファイルでは、ソフトウェア開発者がメイン アプリケーションに制御を渡す前に、そのマイクロコントローラーを初期化します。このファイルによって実行されるアクションの例は次のとおりです。

  • ARM ベクトルをセットアップする
  • 発振器の周波数を構成する
  • 揮発性メモリの初期化
  • main() を呼び出す

3- Scatter : 個人的には、このファイルを使用したことがありません。ただし、アプリケーションのメモリ レイアウトと、それがマイクロでどのようにレイアウトされるかを制御するために使用されるファイルのようです (参照を参照)。これは、他のリンカー スクリプトと変わらない Keil 固有のファイルのようです。

于 2012-05-27T06:02:02.173 に答える