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

とりあえず

これは継続的に確認する方向ってことで次に進めます。