Mini210S 開発キットOSなしのプログラム開発手順連載(6)

Mini210S/Tiny210等開発ボード関連のフォラーム

Mini210S 開発キットOSなしのプログラム開発手順連載(6)

投稿記事by dwtechadm » 火 4 16, 2013 2:20 pm

Mini210S 開発キット詳細URL

第V章 スタック設定とC言語でLEDを点灯

第一節 C関数を呼び出す前、先にスタックを設定する理由:
1. スタックの整体的役割
1) 保存;
2) 引数受け渡し:アセンブリコードからC関数を呼び出すには、引数必要がある;
3) 一時変数を保存:非静的ローカル変数やコンパイラが自動的生成した一時変数の保存機能を含みます;
2. 具体的に説明
1) シーン保存
現場は、事件が発生する現場で、痕跡を記録する必要があります。でないと、一旦破壊されたら、現場を回復することはできません。ここの現場では、CPUが作動時にレジスタ使っいました、例えばレジスタR0、R1など、そしてこれらのレジスタの値を保存せず、直接サブルーチンにジャンプし実行するい場合は、関数の実行もレジスタが使用するためで、前のデータが破壊されます。したがって、関数呼び出しの前に、これらのレジスタなどのシーン)等を一時保存して(スタックpush)、関数実行した戻り(スタックpop)、シーンを復元をします。これでCPUが正常に次の指令が実行できます。
レジスタの値を保存するには、通常は push指令を使用します、対応するレジスタの値を一つずつでスタック上保存します、いわゆるスタックpushです。そして呼び出し子関数が実行終了したら、POP用を呼び出し、スタックから対応する値を取り出し、対応するレジスタに与えます、いわゆるスタックpopです。
保存したレジスタの中に、LRの値も含まれでます(BLコマンドでジャンプすると、PCの値はLRに保存される為です)、そしてサブルーチンが終了すると、スタックからLRの値を取り出して、PCに与えます。これでサブ関数の正常戻りが実現できます。

2)引数受け渡し
多くの場合、C言語が関数を呼び出す時に、関数に引数を与えます、そしてコンパイラでアセンブリ言語に変換する時には、引数一時保存する必要があります、一方アクセス権も与え、引数伝送機能を実現します。保存については、二つの場合があります。一つ、引数自体の数が4つを超えない場合で、レジスタR0〜R3で伝送します。前のシーン保存で既にレジスタの値を保存しましたので、現在はアイドル•ステートで、引数を置くことができます。
もう一つ、引数の数が4を超える場合、レジスタが足りませんので、スタックを使用する必要があります。

3)一時的な変数はスタックに保存
関数の非静的ローカル変数やコンパイラが自動的生成の一時変数を含めます。

第二節 説明する手順

完全なコードは、ディレクトリ 3.led_c_spを参照してください。
1. start.S
本章では、C関数で照明と遅延機能を実現します。コード3.led_c_spにあります。、start.Sの役割は次のとおりです。
ステップ 1 ウォッチドッグを閉じる;
ステップ 2 スタックを設定する;
ステップ 3 C関数led_blink()を呼び出し、LEDが点滅を実現します。;
スタックを設定し、すなわち、spレジスタを設定することである、可用なメモリを指向するで、ここで0xD003_7D80に指向しています、理由は下記の通りです:


画像

IROM内部空間の割り当て図

IROM にコード設定のSPは0xD003_7D80で、サムスンのを従ってまたは自己設定し、コードを上書きしないように設定すればOKです。

2. led.c
led.cは、2つのC関数があります、led_blink()はLEDの点滅、delay()は遅延機能を実現します、コードは次の通りです::
void delay(int r0) // 遅延
{
volatile int count = r0;
while (count--)
;
}
void led_blink() // LED 点滅
{
GPJ2CON = 0x00001111; // ピン・コンフィギュレーション
while(1)
{
GPJ2DAT = 0; // LED on
delay(0x100000);
GPJ2DAT = 0xf; // LED off
delay(0x100000);
  }
 }
コード内のコメントは明白です。アセンブリと比較して、C言語でLEDを動作させるは効率的です、以後のコードは出来るだけ低C言語でプログラミングします。




---続く
dwtechadm
 
記事: 60
登録日時: 月 2 25, 2013 1:35 pm

Return to Cortex-A8関連

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[0人]

cron