2

私は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 パターンを表すビットマップです。高水準言語で定期的に使用しているので、ビットマップとビットマスクに慣れているので、ロジックは問題ないと思いますが、保存/パディングの方法に何か問題がありますか?SetGpioEORloop$.int

上記のロジックで間違っていると飛び出すものはありますか? の契約SetGpioは次のとおりです。

  • r0 は GPIO ピン番号に設定する必要があります。この場合は 16 です。
  • LED をオンにする場合は r1 をゼロ以外に設定する必要があります。それ以外の場合はオフにします。
  • 戻り値は重要ではありません

関数は次のWaitようになります。

/* Sleep for 500 milliseconds */
Wait:
  push {lr}
  ldr r0,=500
  bl SleepForDelay
  pop {pc}

編集 | 実際、私のソリューションと家庭教師のソリューションの両方での動作は次のとおりです。

  1. LEDが短い間隔で点灯します(ドットだと思います)
  2. LEDが再びオフに戻ります
  3. LEDが点灯し、永久に点灯し続ける

実際、最初の点滅はブートローダーが動作しているだけだと思っていましたが、プログラムの早い段階で意図的にクラッシュを導入すると、LED はまったく点灯しません。

4

1 に答える 1