我正在關注Baking Pi,在Rasvberry Pi的ARMv6組件中構建了一個非常基本的操作系統。我們已經通過GPIO控制器將OK LED點亮,並使用系統定時器閃爍,使其按照存儲在.int
值中的位圖表示的模式閃爍。這最後的解決方案似乎不起作用。起初我以爲我一定是錯誤地解決了這個問題,但無論我用功能解決方案provided here檢查我的解決方案的多少,我都看不出有什麼顯着差異。Raspberry Pi OK LED上的SOS莫爾斯電碼
我放下並最終下載了實際的解決方案,編譯並安裝到我的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
現在我知道了Wait
和SetGpio
功能正常工作,因爲以前的教訓只是眨了眨眼睛在設定的時間間隔,我被EOR
做通和關斷LED「在loop$
的每次迭代中將1或0加1。這裏介紹的唯一新的重要概念是代表SOS模式的位圖。我對位圖和位掩碼很滿意,因爲我經常在高級語言中使用它們,所以我認爲邏輯是好的,但還有其他問題,比如.int
是如何存儲/填充的?
因爲上述邏輯錯誤而跳出什麼東西?的SetGpio
的合同是:
- R0必須設置爲GPIO引腳數,在這種情況下,16
- R1必須設置爲非零值,如果該指示燈應開啓,否則爲零將其關閉
- 返回值是不顯著
的Wait
功能如下:
/* Sleep for 500 milliseconds */
Wait:
push {lr}
ldr r0,=500
bl SleepForDelay
pop {pc}
編輯|事實上,在這兩個礦山的beavhiour和導師的解決方案是:
- LED燈亮起一個短暫的時間間隔(一個點,我猜)
- LED追溯到再次起飛
- LED燈亮起,並停留在永遠的
我實際上認爲第一次眨眼就是引導程序的運行,但如果我在程序的早期引入了故意的崩潰,LED根本就不會出現。
你的等待功能是否需要參數?在r0? –
@dwelch不直接。它調用另一個函數,但是,它自己設置它。 – d11wtq
在問題中添加了Wait實現。 – d11wtq