烤派宝典第五章之OK05

TurnToJPG -->


#烤派宝典第五章之OK05 OK05这一章基于OK04, 将教会你如何根据摩尔斯码来控制LED的闪烁。LED的闪烁将发出SOS信号,此信号的格式如下:(…—…).我们假设你之前已经拥有了烤派宝典第四章里的所有代码作为基础。

内容
1 数据
2 你享受乐趣时,光阴似箭
###数据
迄今为止,我们所传递给Raspberry Pi的都是单纯的指令。 然而某些时候,指令只是故事的一般。我们的操作系统需要数据。

有些早期的操作系统不允许在文件中包含数据,这让使用者觉得很受限制。现代的方式让应用程序有更大的灵活性。

通常来说数据指的是重要的数值。你大可把数据想象成一个给定的类型,比如,一个包含有文字的文本文件,一幅含有图像信息的图像文件,等等。事实上这只是概念上的差别而已。计算机中的所有数据都是二进制数,我们和它们打交道的方式就是通过数数字。在本章的例子中,我们要储存的数据是一段用于控制闪烁节奏的数据。

在’main.s'文件的最后拷贝入下列代码:

	.section .data
	.align 2
	pattern:
	.int 0b11111111101010100010001000101010

数据和代码的区别在于,我们把所有的代码都放在.data段。我已经在操作系统内存布局图中描述了这一点。这里我把数据段(data)放在代码的最结尾位置。把代码和指令分开放置,以便于我们最终能在操作系统中实现安全机智,我们需要知道代码的哪些部分是可以执行的,哪些是不可以被执行的。

我在这里使用了两个., .align和.inig。 .align确保下列字节以2的2次方对齐。在这个例子中,我使用的就是2的2次方对齐。.align 2意味着数据肯定是在2的2次方,即可整除4的内存位置。我们需要特别注意这一点,因为用于从内存中读取内容的ldr指令之工作在能整除4的内存位置。

.align num确保下一行地址可以整除2的num次方

.int命令把其后带的常量直接拷贝到输出。这以为者11111111101010100010001000101010将会被放入到输出,因而标签形式事实上把这部分数据标注成了标签。

.int val输出数字val

正如我以前所提及的,数字可以包含任何你想要的东西。在本例中我们把摩尔斯电码所表示的SOS序列,即…—…用这些方式表达出来。我使用0以代表LED熄灭的时间,用1代表LED点亮的时间。这样一来,我们就可以写出用于表示时间序列的代码,接下来我们要的就是改变数据以显示不同的显示方式了。这是一个很简单的例子,可以用来说明操作系统在任何时候应该做什么;交互和显示数据。

这里有个挑战就是找出有效而游泳的表达方式。我们这种用于表达开/关状态的存储序列的方式运行起来很简单,但是很难编辑,因为我们无法在0和1的组合中体现出摩尔斯代码的-或.的含义。

拷贝下面的代码行到’main.s'中,代码应该放置在 loop$ 标签之前:

	ptrn .req r4
	ldr ptrn,=pattern
	ldr ptrn,[ptrn]
	seq .req r5
	mov seq,#0

上面的代码将闪烁的样式加载到寄存器r4中,同时把r5的值加载为0. r5将用于表征我们的序列位置,以便我们可以跟踪我们已经运行完了多少个样式。

下面的代码则是将一个非0值加载到了r1中,仅限于当前的样式部分为1时。

	mov r1,#1
	lsl r1,seq
	and r1,ptrn

代码作用于你调用SetGpio时候,这时候必须给定一个非0值以熄灭LED,给定0值以点亮LED。

现在修改你代码中的’main.s’,以便代码根据当前序列的值设置LED的亮/灭,而后等待250000微秒(或是其他你觉得合适的延迟时间),接着运行下一个序列中的样式。当序列记数达到32时,需要返回到0. 你可以试一下,看你是否可以自己实现之,另外再添加一点额外的挑战,看你是否能用仅仅一条指令实现之(解决方案在下载页面中)。

###你享受乐趣时,光阴似箭 现在你可以在Raspberry Pi上测试这一章的例子了。它应该先短闪烁3次,然后再来3次长闪烁,接着再来3次短闪烁。再经过一段时间后,闪烁格式会重复。如果它没有工作,请参阅troubleshooting页面。

如果它正常工作的话,恭喜你,你已经完成了OK系列指南的所有部分!

在这个系列中,我们主要学习了汇编语言、GPIO控制器、系统定时器。我们学习了函数和ABI的概念,我们还杰出了许多基本的操作系统的概念,最后还接触了数据的概念。

现在你可以移步到更为高阶的话题中了。

现在你已经活得了很多关于操作系统相关的消息,也学习到了和GPIO口打交道的一种最基本也是最直接的方法。如果你手头有机器人制作套件,你可以试着写一个机器人上的操作系统,用它来控制机器人的GPIO口!