OK05 色々試してみた (4)
差分を確認しつつもう少しもごもごしてみます。
とりあえず original なナニとの差分を取ってみたのですが、以下な部分が
ptrn .req r4 ldr ptrn,=pattern ldr ptrn,[ptrn] seq .req r5 mov seq,#0
こうなってるカンジ。
ldr r4,=0b11111111101010100010001000101010 seq .req r5 mov seq,#0
あとは SetGpio を呼び出す前に r1 と and してる元が ptrn なのか r4 なのか、という違いになっています。とりあえず original を make して再度動作確認をしてみます。
これで正常動作したら嫌だなorz
結果
ACT な LED が点きっぱ。目が痛い。
とりあえず original なソレについて diff を取り易いように git init して云々して以下にしてみました。
diff --git a/source/main.s b/source/main.s index e03235A..F00654C 100755 --- a/source/main.s +++ b/source/main.s @@ -61,7 +61,6 @@ bl SetGpioFunction */ ptrn .req r4 ldr ptrn,=pattern -ldr ptrn,[ptrn] seq .req r5 mov seq,#0
ちかちかしてますが SOS なトンツーにはなってません。んではこうしてみる。
diff --git a/source/main.s b/source/main.s index e03235a..28f881a 100755 --- a/source/main.s +++ b/source/main.s @@ -60,8 +60,7 @@ bl SetGpioFunction * sequence. */ ptrn .req r4 -ldr ptrn,=pattern -ldr ptrn,[ptrn] +ldr ptrn,=0b11111111101010100010001000101010 seq .req r5 mov seq,#0
これで SOS なトンツーになったな。ちなみに以下にしてみるとどうなるか。多分駄目でしょうけど。つか、これって間接参照なアドレスから代入ではないのかと。
diff --git a/source/main.s b/source/main.s index e03235a..4895c37 100755 --- a/source/main.s +++ b/source/main.s @@ -60,8 +60,7 @@ bl SetGpioFunction * sequence. */ ptrn .req r4 -ldr ptrn,=pattern -ldr ptrn,[ptrn] +ldr ptrn,=0b11111111101010100010001000101010 +ldr ptrn,[ptrn] seq .req r5 mov seq,#0
点滅してますが一定タイミングになってます。これは一体どーゆー意味なのかな。
そりゃ良いのですが、対処としては
- pattern なシンボルから代入せず即値を代入
- [ptrn] を ldr しない
ということになるのかな。もうひとつ気になる箇所があるので一旦 checkout してリトライしてみます。差分が以下。
diff --git a/source/main.s b/source/main.s index e03235a..7de583a 100755 --- a/source/main.s +++ b/source/main.s @@ -99,6 +99,6 @@ b loop$ * on the LED. */ .section .data -.align 2 +.align 4 pattern: .int 0b11111111101010100010001000101010
駄目か。そもそも的に根拠が無かったりして (を
つうか ok05 なソレをちゃんと読んでなかったりするかも。確認します。
む
ldr ptrn,=pattern
は pattern なアドレスを ptrn の load するのか。なので
ldr ptrn,[ptrn]
として間接参照したナニをレジスタに入れてるんですね。ふむ。つうことは例えば以下にしてみるとどうか。
diff --git a/source/main.s b/source/main.s index e03235a..537eb9f 100755 --- a/source/main.s +++ b/source/main.s @@ -60,8 +60,8 @@ bl SetGpioFunction * sequence. */ ptrn .req r4 -ldr ptrn,=pattern -ldr ptrn,[ptrn] +ldr r5,=pattern +ldr ptrn,[r5] seq .req r5 mov seq,#0
うーん、点きっぱ。ちょっと確認、ってことで以下にしたらやっぱ SOS なトンツーになります。
diff --git a/source/main.s b/source/main.s index e03235a..28f881a 100755 --- a/source/main.s +++ b/source/main.s @@ -60,8 +60,8 @@ bl SetGpioFunction * sequence. */ ptrn .req r4 -ldr ptrn,=pattern -ldr ptrn,[ptrn] +ldr ptrn,=0b11111111101010100010001000101010 seq .req r5 mov seq,#0
ぐぬぬ。理屈てきに pattern なアドレスを r4 に一旦格納して間接参照でその番地に格納されてるビットパターンを r4 に置いてるはずなのだけれど、何が悪いのか。
つうか、何故に
ldr ptrn,=pattern ldr ptrn,[ptrn]
が動かない。こうしてみるか。
diff --git a/source/main.s b/source/main.s index e03235a..306fe5 100755 --- a/source/main.s +++ b/source/main.s @@ -60,8 +60,8 @@ bl SetGpioFunction * sequence. */ ptrn .req r4 -ldr ptrn,=pattern -ldr ptrn,[ptrn] -ldr r4,=pattern -ldr r4,[r4] seq .req r5 mov seq,#0
うーん、点滅さえしない。
おかしすぎる
ldr ptrn,=0b11111111101010100010001000101010
任意の直値をレジスタにセット、とありますね。アセンブラが領域確保して値を設定してる模様。とりあえず良いっちゃ良いのですが
ptrn .req r4 ldr ptrn,=pattern ldr ptrn,[ptrn]
が動かない訳が分からぬorz
とりあえず
これは継続的に確認する方向ってことで次に進めます。