2012-02-02 11 views
3

ARMベアメタルプログラムでCコードで%を使用しようとすると、libgccからラッパーが必要です。問題なく、私はリンクすることができます。リンカーは不平を言いますが、モデムの使用時にプログラムがハングアップします(レジストリが実際には不可解な方法でサイクルを開始するのを見ます)。 %で行をコメントアウトすると、プログラムはこのようにハングしないので、間違いなく問題です。ARMv6でlibgccでベアメタルモード(%)がハングする

私は私が使用してテストを実行https://gist.github.com/1724746

で問題の簡単な例を構築した。その後^斧はそれを終了する

qemu-system-arm -M versatilepb -cpu arm1176 -nographic -kernel kernel.elf | xxd 

、およびコメントアウト%ラインと私はバイトを取得私はアウトプットを期待していますが、そこにあるラインでは私はそのような出力を得ません。

ここで何が起こっているのでしょうか?

編集:私が使用しているクロスコンパイラがUbuntuの上のデフォルトである:https://launchpad.net/gcc-linaro

+0

あなたは逆アセンブリを調べる必要がありますあなたが作成したプログラムですか? qemuではなく、実際のハードウェアでこれを実行しましたか? –

+0

https://singpolyma.net/test.asmで解体し​​たコードを掲載しました(警告:非常に大きい!) - 実際のハードウェアにはアクセスできません。私の目標はQEMUです。 – singpolyma

答えて

2

だから、2(まあ、それは現在のタスク+ 1

にプラス一つのことをしてR0とR1をロードします
10648: e1a00003 mov r0, r3 
1064c: e51b1010 ldr r1, [fp, #-16] 
10650: eb00fd36 bl 4fb30 <____aeabi_uidivmod_veneer> 

私は、彼らがARMからThumbに切り替えるために_veneerを使用推測、それはモードを切り替えるためのトランポリンです:

0004fb30 <____aeabi_uidivmod_veneer>: 
    4fb30: e51ff004 ldr pc, [pc, #-4] ; 4fb34 <____aeabi_uidivmod_veneer+0x4> 
    4fb34: 00010905 .word 0x00010905 

、ここでは実際の剰余演算をあなたを取ること、これはThumbコードであります、親指モード

00010904 <__aeabi_uidivmod>: 
    10904: 2900  cmp r1, #0 
    10906: d0f8  beq.n 108fa <__aeabi_uidiv+0x252> 
    10908: e92d 4003 stmdb sp!, {r0, r1, lr} 
    1090c: f7ff fecc bl 106a8 <__aeabi_uidiv> 
    10910: e8bd 4006 ldmia.w sp!, {r1, r2, lr} 
    10914: fb02 f300 mul.w r3, r2, r0 
    10918: eba1 0103 sub.w r1, r1, r3 
    1091c: 4770  bx lr 
    1091e: bf00  nop 

だから、それは通常の除算を行うことになります、その結果を乗算し、問題が親指モードである場合、私は疑問に思う例えば

12345 % 100 = 12345 - ((12345/100)*100) = 12345 - (123*100) = 12345 - 12300 = 45 

を減算します。 arm1176は間違いなく親指モードを持っていて、私はqemuが親指をすることができます。

あなたは、アセンブル、リンクを見つけるためにかかわらず、実験を試みることができる:

.thumb 
.thumb_func 
.globl thumb_test 
thumb_test: 
    add r0,#1 
    bx lr 

arm-none-linux-gnueabi-as thumb_test.s -o thumb_test.o 

か、どのようなツールチェーンの接頭辞があればあり、そして他のすべてと中の.oファイルをリンクします。 Cコードで

unsigned int thumb_test (unsigned int); 

と何でもあなたがあなたの代わりにモジュロのこれを試して...その値プラスワンバックを取得する必要があり、それを渡すとしてそれを宣言する。

もう1つ試してみると分かりますが、除算はモジュロではなく分かりますか、多分問題は乗算命令ですか?知るか。

うーむが、私は問題を参照してくださいと思う:それは親指を実行しようとしたとき

0004fb30 <____aeabi_uidivmod_veneer>: 
    4fb30: e51ff004 ldr pc, [pc, #-4] ; 4fb34 <____aeabi_uidivmod_veneer+0x4> 
    4fb34: 00010905 .word 0x00010905 

あなたはそれがBXまたはBLXにする必要がありLDRでモードを切り替えるカント、それはおそらく未定義のハンドラに起こっていますアームモードのコード。

私は、スイッチングモードがどのように動作する必要があるかの例を挙げています。特に、qemu用に書かれています。今これは低レベルの例です。例えばprintfはありません。私は、uartの出力を持っています。これが問題の場合(親指モードに切り替える)、プログラムのコンパイルとリンクの方法を調べる必要があります。インタワークを指定する必要があるかもしれませんし、以前はコードソーシング(現在はメンターグラフィックスによって消費されている)ツールチェーンを使用していない場合、ツールチェーンの構築方法を理解する必要があります。これはgnu/gccベースのものを使用していると仮定しています。

未定義のハンドラを置く方法がある場合、またはトレースを見て、おそらく起こっているアドレス0x0000000の近くにあるPCのドロップを見ることができる場合は、あなたが私の小さなthumb_testのもので構築すると、bxの代わりにldrを使用してそこに着くと、それはまだクラッシュするはずはないでしょう...

+0

thumb_test.sコードをリンクして呼び出しても機能します。 CFLAGSに-mthumb-interworkを追加しても機能しません。うーん、あなたのテストから ".thumb_func"を削除すると、同じ問題が発生します。だから、この他のコードが、おそらく何とか親指であることを認識していません。だから私はコンパイラに親指コードを呼んでいることを納得させる方法を見つける必要があるので、正しいトランポリンが生成されるでしょう。 – singpolyma

+0

親指モードでコンパイルするメインコードを変更しても、それは修正されません。 Dissasembly:http://singpolyma.net/test2.asm – singpolyma

+0

そこにはthumb2をサポートしていないarm11がたくさんあります。モジュロを削除してこのサムバージョンでコンパイルするとどうなりますか? –

関連する問題