计算机实验室之树莓派:课程 5 OK05
创始人
2024-03-02 01:54:04
0

OK05 课程构建于课程 OK04 的基础,使用它来闪烁摩尔斯电码的 SOS 序列(...---...)。这里假设你已经有了 课程 4:OK04 操作系统的代码作为基础。

1、数据

到目前为止,我们与操作系统有关的所有内容提供的都是指令。然而有时候,指令只是完成了一半的工作。我们的操作系统可能还需要数据。

一些早期的操作系统确实只允许特定文件中的特定类型的数据,但是这通常被认为限制太多了。现代方法确实可以使程序变得复杂的多。

通常,数据就是些很重要的值。你可能接受过培训,认为数据就是某种类型的,比如,文本文件包含文本,图像文件包含图片,等等。说实话,这只是你的想法而已。计算机上的全部数据都是二进制数字,重要的是我们选择用什么来解释这些数据。在这个例子中,我们会用一个闪灯序列作为数据保存下来。

main.s 结束处复制下面的代码:

.section .data %定义 .data 段
.align 2 %对齐
pattern: %定义整形变量
.int 0b11111111101010100010001000101010

.align num 确保下一行代码的地址是 2 num 的整数倍。

.int val 输出数值 val

要区分数据和代码,我们将数据都放在 .data 区域。我已经将该区域包含在操作系统的内存布局图。我选择将数据放到代码后面。将我们的指令和数据分开保存的原因是,如果最后我们在自己的操作系统上实现一些安全措施,我们就需要知道代码的那些部分是可以执行的,而那些部分是不行的。

我在这里使用了两个新命令 .align.int.align 保证接下来的数据是按照 2 的乘方对齐的。在这个里,我使用 .align 2 ,意味着数据最终存放的地址是 2 2=4 的整数倍。这个操作是很重要的,因为我们用来读取内存的指令 ldr 要求内存地址是 4 的倍数。

命令 .int 直接复制它后面的常量到输出。这意味着 11111111101010100010001000101010 2 将会被存放到输出,所以该标签模式实际是将这段数据标识为模式。

关于数据的一个挑战是寻找一个高效和有用的展示形式。这种保存一个开、关的时间单元的序列的方式,运行起来很容易,但是将很难编辑,因为摩尔斯电码的 -. 样式丢失了。

如我提到的,数据可以代表你想要的所有东西。在这里我编码了摩尔斯电码的 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中国 荣誉推出

相关内容

通过Linux串口实现树莓...
目录 一  串口说明 二  USB—TTL模块 ● usb-ttl...
2025-06-01 20:44:00
嵌入式Linux入门必看!...
最近总有人问我:想学嵌入式Linux,到底该买哪块开发板?这问题就...
2025-05-10 12:17:26
不明白为什么在树莓派上使用...
在树莓派上使用join()函数会导致TypeError错误的原因是...
2024-12-26 22:02:04
不明白为什么我的树莓派3没...
要解决树莓派3没有向服务器发送RSSI数据的问题,以下是一些可能的...
2024-12-26 21:30:46
步进电机在工作一段时间后停...
步进电机在工作一段时间后停止工作,尽管代码仍然正常,可能有以下几个...
2024-12-25 21:02:03
笔记本电脑无法通过串口通信...
要解决笔记本电脑无法通过串口通信接收树莓派发送的数据,需要进行以下...
2024-12-15 20:31:00

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
从 Yum 更新中排除特定/某... 作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。如果是,如...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...
如何检查你的 Linux 系统... 不知道在使用哪个初始化系统?以下是方法。每个主流 Linux 发行版(包括 Ubuntu、Fedor...