BakingPi (5)

なんとなく手続きの作り方が把握できたところで微妙に何かをスルー気味ながらも次に進めてみることに。マニュアルの 172p に出てくる System Timer なナニを使う模様。

ldrd

ええと GetTimeStamp なる手続きが以下な定義。

.globl GetTimeStamp
GetTimeStamp:
        push {lr}
        bl GetSystemTimerBase
        ldrd r0,r1,[r0,#4]
        pop {pc}

ldrd は上の例で言うと GetSystemTimerBase が戻す 0x20003000 番地 +4 な Counter なソレから lower な 4 byte を r0 に、higher な 4 byte を r1 に格納な模様。
これを踏まえて Wait な手続きを確認してみます。呼び出しは以下な形な模様。

ldr r0,=100000
bl Wait

とりあえず最初に以下な命令が実行されます。

.globl Wait
Wait:
        delay .req r2
        mov delay,r0
        push {lr}
        bl GetTimeStamp
        start .req r3
        mov start,r0

引数を r2 に退避して GetTimeStamp 手続きを呼び出して戻りを r3 に格納してますね。lower なソレだけを持っておけばなんとかなるのかどうか。
で、繰り返しな記述が以下。

        loop$:
                bl GetTimeStamp
                elapsed .req r1
                sub elapsed,r0,start
                cmp elapsed,delay
                .unreq elapsed
                bls loop$

elapsed な r1 に差分が格納されて delay より大きくなったかどうかで判断か。

32 bit な以下のパターンで LED を点滅らしい。

.section .data
.align 2
pattern:
.int 0b11111111101010100010001000101010

ええと以下な事してるんですが最初すぐに分かりませんでした。

mov r0,#16
mov r1,#1
lsl r1,seq
and r1,ptrn
bl SetGpio

SetGpio では 0 か非 0 かで点灯が決まるのか。そして wait は 250ms らしい。

/* NEW
* We wait for 0.25s using our wait method.
*/
ldr r0,=250000
bl Wait

そして、32 bit な幅になってるという意味でこんな限定の方法を使ってます。面白い。

add seq,#1
and seq,#0b11111
b loop$

これ、明日朝ヨユーがあればコンパイルして動作を見てみたいと思います。