2013-06-22 205 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