2012-01-20 7 views
2

私はARMv6ベアメタルアプリケーションでusermodeとSVCを使用しようとしていますが、このために割り込みハンドラに分岐するARMv6割り込みベクタテーブルのSVCエントリを設定する必要があります。しかし、私はこれを行う方法の良い例を見つけることができません(つまり、どのメモリアドレスを正確に設定する必要があり、どのようなものにするか)。私は過去にも同様のことをやったことがありますが、いつもより包括的なブートローダ(RedBoot)を使って、これをいくつか設定しました。どんな助けもありがとう。割り込みベクトルテーブル、ARMv6の設定

私が使用して自分のアプリケーションをテストしています:

qemu-system-arm -M versatilepb -cpu arm1176 

答えて

3

あなたはSWI割り込みについて話していますか?または他の1つ(FIQ、IRQ)。どちらの場合でも、問題の内容を知っていると思います。 Qemuはlinuxを実行するためのもので、バイナリはアドレス0x00000にロードされないので、エントリポイントはqemuによって例外を処理するために使用されません。

私はqemuを使用してソリューションを実装する例があります。 http://github.com/dwelch67/yagbatのqemuディレクトリに移動します。 qemuの例は実際にyagbatリポジトリのgbaに関係していないので、gbaは32ビットARMのものなので、コードを借りるのは簡単でした。

この例では、この方法でqemuを使用する方法を理解しようとしたので、具体的にあなたの質問のために書かれました。アドレス0x00000000はRAMとしてシミュレートされているように見えるので、qemu例外テーブルを書き直し、バイナリがロードされる0x10000アドレス空間に例外コール・コードを持たせることができます。

クイックで汚れた解決策は、バイナリのエントリポイント(0x10000にロードするqemu)をアドレス0x00000のベクタテーブルに似せることです。 ldr pc命令はプログラムカウンタを基準にしているため、0x10000にアドレスがロードされていることを示すかもしれませんが、実際にはpcと相対的です。

.globl _start 
_start: 
    ldr pc,start_vector_add 
    ldr pc,undef_vector_add 
    ldr pc,swi_vector_add 


start_vector_add: .word start_vector 
undef_vector_add: .word undef_vector 
swi_vector_add: .word swi_vector 

次に、割り込みを発生させる前に、swi命令を使用してswi割り込みを発生させます。 0x10000から0x00000までのコードを十分にコピーして、例外テーブルとPCにロードするアドレスのリストを含めます。プログラムを0x10000にリンクすると、それらのアドレスは0x10000の範囲にあります。割り込みが発生すると、変更した例外ハンドラは0x10000ベースのアドレスをpcにロードし、0x10000のハンドラが呼び出されます。私の例では、バイナリを実行するには、このコマンドラインを使用し

qemu-system-arm -M versatilepb -m 128M -kernel hello_world.bin 

、その後、Ctrl + Alt + 3(F3ではないが、3)は、シリアルコンソールに切り替わり、あなたが出力を見ることができ、そして近いですそのウィンドウはqemuを閉じてシミュレーションを停止します。

+0

私は関連する問題に遭遇したので、まだ私のアプリケーションでこれをすべて動作させることはできませんでした: - 一度解決したら(うまくいけば)私はこの仕事をすることができますし、私はあなたの答えを受け入れるでしょう:) – singpolyma

+0

あなたは私の例を見ましたか?それはあなたが他のバグ、ブートアーム、Cから腕などを呼び出すことを試みています。私のコードはライブラリを使用していないので、gccコンパイラを私のものとは別のビルドで使うことができるはずです。 –

+0

この行をCROSS_COMPILE = arm-none-eabiに変更します。使用しているコンパイラ(gcc)には、arm-linux-gnueabi –

関連する問題