私はBaking Piに従い、Raspberry Pi 用の ARMv6 アセンブリで非常に基本的なオペレーティング システムを構築しています。GPIO コントローラーを介して OK LED をオンにすることから、システム タイマーを使用して点滅させること、.int
値に格納されたビットマップによって表されるパターンに従って点滅させることへと移行しました。この最後の解決策は機能していないようです。最初は問題を間違って解決したに違いないと思っていましたが、ここで提供されている機能的なソリューションで自分のソリューションをいくらチェックしても、大きな違いは見られません。
私は最終的に実際のソリューションをダウンロードし、コンパイルしてPiにインストールしました。私自身のソリューションと同じ壊れた動作を示します。つまり、LED はオンになりますが、オンのままです。プログラムがクラッシュしたand
か、チューターがやりたいことを命令が実行していないと思います。
このような解決策:
bitmap .req r4
seq .req r5
ldr bitmap,=pattern
ldr bitmap,[bitmap]
mov seq,#0 /* start at the zeroth bit */
loop$:
mov r0,#16 /* set gpio pin 16: OK LED */
mov r1,#1 /* bitmask starts with a 1 */
lsl r1,seq /* shift to the correct bit */
and r1,bitmap /* mask according to the pattern */
bl SetGpio /* set the LED state (r1 zero = off, non-zero = on) */
bl Wait /* wait for a short interval */
add seq,#1 /* increment the sequence counter */
and seq,#0b11111 /* reset seq to 0 if >= 32 */
b loop$ /* loop forever */
.section .data
.align 2
pattern:
.int 0b11111111101010100010001000101010
前のレッスンでは、設定された間隔で LED を点滅させただけだったので、 関数Wait
と関数が正しく動作することがわかりました。ここで導入された唯一の新しい重要な概念は、SOS パターンを表すビットマップです。高水準言語で定期的に使用しているので、ビットマップとビットマスクに慣れているので、ロジックは問題ないと思いますが、保存/パディングの方法に何か問題がありますか?SetGpio
EOR
loop$
.int
上記のロジックで間違っていると飛び出すものはありますか? の契約SetGpio
は次のとおりです。
- r0 は GPIO ピン番号に設定する必要があります。この場合は 16 です。
- LED をオンにする場合は r1 をゼロ以外に設定する必要があります。それ以外の場合はオフにします。
- 戻り値は重要ではありません
関数は次のWait
ようになります。
/* Sleep for 500 milliseconds */
Wait:
push {lr}
ldr r0,=500
bl SleepForDelay
pop {pc}
編集 | 実際、私のソリューションと家庭教師のソリューションの両方での動作は次のとおりです。
- LEDが短い間隔で点灯します(ドットだと思います)
- LEDが再びオフに戻ります
- LEDが点灯し、永久に点灯し続ける
実際、最初の点滅はブートローダーが動作しているだけだと思っていましたが、プログラムの早い段階で意図的にクラッシュを導入すると、LED はまったく点灯しません。