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$
これ、明日朝ヨユーがあればコンパイルして動作を見てみたいと思います。