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