2013-06-22 203 views
2

我正在關注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 

現在我知道了WaitSetGpio功能正常工作,因爲以前的教訓只是眨了眨眼睛在設定的時間間隔,我被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和導師的解決方案是:

  1. LED燈亮起一個短暫的時間間隔(一個點,我猜)
  2. LED追溯到再次起飛
  3. LED燈亮起,並停留在永遠的

我實際上認爲第一次眨眼就是引導程序的運行,但如果我在程序的早期引入了故意的崩潰,LED根本就不會出現。

+1

你的等待功能是否需要參數?在r0? –

+0

@dwelch不直接。它調用另一個函數,但是,它自己設置它。 – d11wtq

+1

在問題中添加了Wait實現。 – d11wtq

回答

1

原來,這與代碼無關,實際上是Raspberry Pi上的配置設置。

/config.txt需要kernel_old=1