计算机实验室之树莓派:课程 5 OK05

Robert Mullins 的头像

·

·

·

3,684 次阅读

OK05 课程构建于课程 OK04 的基础,使用它来闪烁摩尔斯电码的 SOS 序列(......。我使用 0 表示一个时间单元的 LED 灭灯,而 1 表示一个时间单元的 LED 亮。这样,我们可以像这样编写一些代码在数据中显示一个序列,然后要显示不同序列,我们所有需要做的就是修改这段数据。下面是一个非常简单的例子,操作系统必须一直执行这段程序,解释和展示数据。

复制下面几行到 main.s 中的标记 loop$ 之前。

ptrn .req r4 %重命名 r4 为 ptrn
ldr ptrn,=pattern %加载 pattern 的地址到 ptrn
ldr ptrn,[ptrn] %加载地址 ptrn 所在内存的值
seq .req r5 %重命名 r5 为 seq
mov seq,#0 %seq 赋值为 0

这段代码加载 pattrern 到寄存器 r4,并加载 0 到寄存器 r5r5 将是我们的序列位置,所以我们可以追踪我们已经展示了多少个 pattern

如果 pattern 的当前位置是 1 且仅有一个 1,下面的代码将非零值放入 r1

mov r1,#1 %加载1到 r1
lsl r1,seq %对r1 的值逻辑左移 seq 次
and r1,ptrn %按位与

这段代码对你调用 SetGpio 很有用,它必须有一个非零值来关掉 LED,而一个 0 值会打开 LED。

现在修改 main.s 中你的全部代码,这样代码中每次循环会根据当前的序列数设置 LED,等待 250000 毫秒(或者其他合适的延时),然后增加序列数。当这个序列数到达 32 就需要返回 0。看看你是否能实现这个功能,作为额外的挑战,也可以试着只使用一条指令。

2、当你玩得开心时,时间过得很快

你现在准备好在树莓派上实验。应该闪烁一串包含 3 个短脉冲,3 个长脉冲,然后 3 个短脉冲的序列。在一次延时之后,这种模式应该重复。如果这不工作,请查看我们的问题页。

一旦它工作,祝贺你已经抵达 OK 系列教程的结束点。

在这个系列我们学习了汇编代码,GPIO 控制器和系统定时器。我们已经学习了函数和 ABI,以及几个基础的操作系统原理,已经关于数据的知识。

你现在已经可以准备学习下面几个更高级的课程的某一个。

  • Screen 系列是接下来的,会教你如何通过汇编代码使用屏幕。
  • Input 系列教授你如何使用键盘和鼠标。

到现在,你已经有了足够的信息来制作操作系统,用其它方法和 GPIO 交互。如果你有任何机器人工具,你可能会想尝试编写一个通过 GPIO 管脚控制的机器人操作系统。


via: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/ok05.html

作者:Robert Mullins 选题:lujun9972 译者:ezio 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注