1

ライブラリの使用量を最小限に抑えてオンボードLEDをオンにするためだけに、Stellarisランチパッド用のコードをCで記述したいと思いました。驚いたことに、コンパイルされたコードのサイズは約800バイトでした。そこで、コンパイラがコンパイルしたコードに何が入っているかを確認するために、逆アセンブラを使用してアセンブリコードを確認しました。Cコードを書かなかったコードがたくさんありました。それらのコードが何のためにあるのか、そしてそれがどのようにコンパイラ設定に入ったのか知りたいのですが。私は、コンパイラーがどのように動作するか、そしてコンパイラーが舞台裏で何をしているのかを学ぼうとしています。私を助けてください。

これは私のCプログラムです:

#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"

#define GPIOFBASE   0x40025000
#define GPIOCLK     *((volatile unsigned long *)(0x400FE000 + 0x608))
#define FDIR        *((volatile unsigned long *)(GPIOFBASE + 0x400))
#define FDEN        *((volatile unsigned long *)(GPIOFBASE + 0x51C))
#define FDATA       *((volatile unsigned long *)(GPIOFBASE + 0x3FF))

void main(void) {

    ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);

    GPIOCLK |= (1<<5);
    FDIR    |=  0xE;
    FDEN    |=  0xE;
    FDATA   |=  0xE;

while (1);

}

私が使用した唯一のAPI呼び出しは、オンチップROMライブラリを使用して時計設定を設定することでした。このペーストビンで分解コードを確認してください:(メイン:0x190にあります。)

http://pastebin.com/wNNsBdtT

4

1 に答える 1

7

追加のコードは、CPUの初期化とCランタイムの初期化になります。このスタートアップのソースコードは、おそらくコンパイラに付属しています。たとえばGCCでは、通常、crt0.sと呼ばれます。

CPUとメモリによっては、正しいクロック周波数、メモリタイミングなどを設定するために、おそらく初期化が必要になります。さらに、Cランタイムには、静的データの初期化とスタックの初期化が必要です。C ++がサポートされている場合は、静的オブジェクトのコンストラクターを呼び出すために追加のコードが必要です。

StellarisのようなCortex-Mデバイスは、最小限のオーバーヘッドでCコードを実行するように設計されており、基本的にリセットからCコードを開始することができますが、デフォルトの起動状態は、多くの場合、アプリケーションを実行したい状態ではありません。より低く、精度の低いクロック周波数で実行するのが好きです。


2012年12月6日追加

スタートアップコードはほぼ確実にCMSISによって提供されます。CMSISフォルダーには、スタートアップコードを含むCoreSupportフォルダーとDeviceSupportフォルダーが含まれます。このコード(またはその関連部分)をプロジェクトにコピーし、必要に応じて変更して、提供されたコードの代わりにリンクすることができます。CMSISは頻繁に更新されるため、いずれにせよそれを行うための議論があります。

ビルドログやマップファイルは、リンクされているCMSISコンポーネントを判別するのに役立ちます。

于 2012-12-02T21:35:55.727 に答える