烤派宝典第二章之OK02

#烤派宝典第二章之OK02 OK02 这一章建立在OK01的基础上,将反复点亮/熄灭’OK’或’ACT’ LED。我们假定你已经有了第一章烤派宝典第一章之OK01提到过的操作系统知识作为基础。

内容
1 等待
2 整合

###等待 出乎意料的是,等待在操作系统开发里是一个非常有用的特性。通常操作系统发现自己无事可做时,会选择等待。在我们的例子里,我们需要让LED一闪一灭。如果你只是把管脚状态置为on或是off,那么LED在我们视线里依然是可见的,因为计算机在一秒内会成千上万次的开关该GPIO端口。在以后的章节里我们会涉及到精准定时,但是现在为了效率起见,我们可以简单的把CPU的时间浪费掉。

	mov r2,#0x3F0000
	wait1$:
	sub r2,#1
	cmp r2,#0
	bne wait1$

上述的代码简单的通过计算一个大数的减法创建了一个延迟,得益于每一块Raspberry Pi基本上都相同,上面得到的延迟时间也差不多。上述代码可以简单解释为,使用mov指令把十六进制数0x3F0000传递给r2,然后对此数执行减1运算,直到变为0。这里引入了3个新指令分别是sub,cmp和bne。

sub是减法指令(substract)的简写,从第一个参数中减第二个参数的值。

sub reg,#val 意思是从reg存储的值中减掉val大小。

cmp是一条有意思得多的指令。它比较第一个参数和第二个参数的值,将比较的结果存入到一个特殊的寄存器中,这个寄存器叫CPSR寄存器,意思是当前处理器状态寄存器(Current Processor Status Register)。你不需要太担心这个,简单的说,她就是能记住两个数字谁比谁大或是谁比谁小,或是相等[^1]。

cmp reg,#val 意思是把寄存器reg中的值和数值val做比较。比较的结果在CPSR中。

bne事实上是分支命令的变种。在ARM汇编语言家族里,所有的指令都可以条件执行。这也就是说,指令只有在上一条比较指令有确切的结果才会被执行到。以后的教程中我们将频繁的在有趣的场合使用到它,但现在我们在b指令后加上ne代表只有上一次比较的结果不相等时候才会执行bne后的指令。ne后缀可以在任意命令后被使用,有多达16个条件可以供选择,比较常用的有eq(用于判断是否相等),和lt(小于)。

ne后缀使得该条命令只会在上一次比较的结果不等时才会被执行到。

###整合 我以前提起过LED状态可以通过写入GPIO控制器后28位移的地址置为开启状态,也可以通过写入GPIO控制器后40位移的地址置为关闭状态。据此你可以修改OK01中的代码,首先把LED点亮,而后运行等待代码,再将其关闭,再次运行等待代码,而后调用分支代码回到初始状态,以继续循环。需要注意的是,我们不需要再次激活GPIO16口,激活一次就足够了。如果你追求高效的话,我强烈建议你重用r1的值。在所有的课程里,你都可以在下载页面找到完整的解决方案。注意你需要保证在你的代码里,标号都是唯一的。如果你已经定义了wait1$,那么你不能再将另一行也定义为wait1$。

在我的Raspberry Pi上,闪烁频率大约是一秒钟两次。闪烁频率可以很方便的通过改变r2的初始值来调节。然而,不幸的是我们现在还不能非常精确的控制LED灯的闪烁频率。如果你没有得到预期的结果,请翻阅troubleshooting页,如果你成功了,恭喜你!

本章中我们学习了两个汇编指令,sub和cmp,还领略了ARM中的条件执行方法。

下一章烤派宝典之OK03中,,我们将评估我们编程的方式,我们将建立我们的代码规则,以便我们可以重用代码,如果可以的话,我们将同时使用使用C/C++代码来工作。

烤派宝典第零章-介绍

#第零章 介绍 本章为介绍环节,不包含实战环节,主要用于介绍一个操作系统所涉及到的基本概念、什么是汇编语言,以及其他重要的基础性概念。如果你想一步到位直接进入实战环节,你可以忽略掉这一章。

内容
1 操作系统
2 汇编语言

##1 操作系统 操作系统是非常复杂的程序。它负责协调计算机上的程序,包括共享计算机时间、内存、硬件和其他资源。你可能听说过的计算机上的大型桌面操作系统包括GNU/Linux, Mac OS X和Microsoft Windows。 其他设备,譬如手机上可能也使用操作系统,譬如Android, iOS和Windows Phone等1

既然操作系统需要直接和计算机系统的硬件打交道,那它就必须了解系统的硬件配置。为了让系统能运行于不同的计算机平台上,驱动程序的概念被引入。所谓驱动,就是一小段程序,可以被操作系统所调用和挪除,以使得操作系统可以直接和特定的硬件进行“对话”。 在本课程中,我们不会涉及到太多如何创建这种可卸载的驱动程序的话题,我们将专注于Raspberry Pi平台本身。

操作系统设计博大精深,市面上已经有多种不同的设计理念,这门课程只能触及其表面。本门课程里我们只关注于让操作系统通过各种特定的硬件位来直接操作硬件,这通常是最棘手的做法,因为参考文档只能来自于有限的文档,网上也很难找到现成的帮助。

##2 汇编语言 本课程仅使用汇编语言。汇编语言是最接近机器底层的语言,也最容易被机器所理解。计算机工作的原理其实是源自于存在一个叫处理器的小设备用于时刻不停地执行简单的工作,譬如加数操作,同时有一系列或多系列的被称之为RAM(内存)的集成电路用于存储运算数字。计算机加电后,处理器运行传给它的一系列指令,这一系列指令将导致内存中存储的数字发生变化,以便和连接的其他硬件相交互。汇编代码就是被翻译成人类可读格式的这些指令的文字。

通常我们使用编程语言来编程,譬如C++,Java,C#,Basic等语言,程序员撰写的程序通过编译器被转换为汇编语言,接着被转换为二进制代码2。二进制代码是机器能理解的语言,但是不具备可读性,无法被人类理解。汇编语言就好多了,但令人沮丧的是它只有有限的条数,很难被扩展。我们需要记住一个原则:任何一个你输入的汇编指令都能被处理器直接理解,因为汇编指令设计时遵循了精炼的原则,物理电路必须理解并处理每一条指令。

compiler

和普通编程语言一样,有许多不同的汇编语言。而与普通编程语言不同的是,汇编语言的多样性是因为存在很多种不同架构的处理器,每种处理器只能理解特定的语言。因而用一种汇编语言代码编写出的程序在另一种机器体系上就完全不能被执行。在大多数情况下,不能重用代码简直是一场灾难,因为为该种机器体系编写的程序都需要被重写,但引入操作系统后问题就变得容易多了,很多操作系统都是用C/C++编写的,它可以很容易被移植到不同的硬件平台上,只有完全用汇编语言编写的程序部分才需要完全重写。

现在你已经完成了第0课,可以挪步到第一章: OK01了。


  1. 详细的操作系统列表可以参阅: List of operating systems - Wikipedia, the free encyclopaedia ↩︎

  2. 这里我简化了关于通用编程的解释,事实上编程重度依赖于编程语言和机器平台。如果你感兴趣,你可以参考: [Compiler - Wikipedia, the free encyclopedia](Compiler - Wikipedia, the free encyclopedia)。 ↩︎

烤派宝典(序)

#烤派宝典-操作系统开发 欢迎来到烤派宝典之操作系统开发!这门课由Alex Chadwick撰写,当前版本为V1.0c(2013年7月)。

本宝典将指引你在Raspberry Pi上开发出一个非常基本的操作系统!本宝典主要针对16岁以上读者,当然对未满16岁的小朋友我们也未作访问限制,你可以在助手的引导下访问本网站。适当时候本课程将增加更多的内容。

本宝典将指引你用汇编语言构建出一个基本的操作系统。我们假定手持本宝典的诸位大侠都是初出江湖之辈,之前从未接触过操作系统开发和汇编语言的知识。有编程经验固然可以让你如虎添翼,但是本宝典的设计门槛应该是针对一穷二白完全没有经验的读者。Raspberry Pi论坛中藏龙卧虎,遍布着热心之极的人们,一个个望穿秋水般等着随时给予你以援手,所以当你碰到问题时,尽管去提问好了。本宝典被划分为一系列“章节”,按顺序列举如下。每一“章节”里在介绍理论的同时也将给出一些实际的练习,双管齐下助你事半功倍多快好省的掌握武功秘籍。

本宝典不会涉及到过于细节的内容,也不会顾及到关于创建操作系统知识的方方面面,本宝典中的一系列指南将关注于完成一系列小的任务。我们希望读者在通读并完成本宝典练习的最后,能融汇贯通自己所学,最终具备独立创建一个个性化的操作系统的“神功”。尽管本宝典的章节大多关注于特定的功能实现,但其中也留有大片空间供读者自行发挥。比如,在学习完关于函数的章节后,你可以构思出一种更好的汇编代码组织方式。比如,在阅读完有关图形的章节后,你可以设想下如何开发一个3D操作系统。因为本宝典是讲述操作系统的牛逼内容,你完全可以拥有设计出你喜爱的事情的能力。如果你有了灵光一闪的瞬间,抓住并实现它!计算机科学仍然是一门新兴学科,有的是空间任君遨游。

内容

1 要求
2 章节

1 要求

你需要具备下列物品以完成本宝典:一块附带有SD卡的Raspberry Pi及电源, 一台运行Linux, Microsoft Windows或Mac OS X的开发机, SD卡读写器及读写软件。如果你的Raspberry Pi能连接屏幕就更好了,当然这不是必需条件。

软件方面,你需要准备基于ARMv6的GNU编译工具链。在下载页面里你可以找到下载链接,该页面中也提供了所有练习的参考答案。

2 章节

  <th>名称</th>

  <th>描述</th>
</tr>
  <td><a href="introduction.html">介绍</a></td>

  <td>本章节不包含实战环节,主要用于介绍一个操作系统所涉及到的基本概念、什么是汇编语言,以及其他重要的基础性概念。如果你想一步到位直接进入实战环节,你可以忽略掉这一章。
  </td>
</tr>

<tr>
  <th colspan="3">OK LED 系列 (初级)</th>
</tr>

<tr>
  <td>1</td>

  <td><a href="ok01.html">OK01</a></td>

  <td>OK01 这一章内容涉及了如何起步,并将教会你如何点亮Raspberry PI开发板上的'OK'或是'ACT' LED灯,这个LED灯靠近RCA和USB口。
  </td>
</tr>

<tr>
  <td>2</td>

  <td><a href="ok02.html">OK02</a></td>

  <td>OK02 这一章建立在OK01的基础上,将反复点亮/熄灭'OK'或'ACT' LED。
  </td>
</tr>

<tr>
  <td>3</td>

  <td><a href="ok03.html">OK03</a></td>

  <td>OK03 这一章基于OK02,将教会你在汇编语言中如何使用函数,函数的引入将使得汇编代码可用性大大提升,并提升代码的可读性。
  </td>
</tr>

<tr>
  <td>4</td>

  <td><a href="ok04.html">OK04</a></td>

  <td>OK04 这一章基于OK03,将教会你如何使用定时器(timer)来精确控制'OK'或'ACT'灯的闪烁频率。
  </td>
</tr>

<tr>
  <td>5</td>

  <td><a href="ok05.html">OK05</a></td>

  <td>OK05这一章基于OK04, 将教会你如何根据摩尔斯码来控制LED的闪烁。LED的闪烁将发出SOS信号,此信号的格式如下:(...---...).</td>
</tr>

<tr>
  <th colspan="3">屏幕系列 (高阶)</th>
</tr>

<tr>
  <td>6</td>

  <td><a href="screen01.html">Screen01</a></td>

  <td>Screen01这一章讲述了一些基本的图像处理理论,我们将在这一章里,在屏幕上或是电视机(TV)上显示出一个渐变颜色的格式。
  </td>
</tr>

<tr>
  <td>7</td>

  <td><a href="screen02.html">Screen02</a></td>

  <td>Screen02这一章基于Screen01,将教会你如何在屏幕上画直线,还将教会你一个如何生成随机数的技巧。
  </td>
</tr>

<tr>
  <td>8</td>

  <td><a href="screen03.html">Screen03</a></td>

  <td>Screen03这一章基于Screen02,本章将教会你如何在屏幕上画出字符,还将介绍给你内核命令行的概念。
  </td>
</tr>

<tr>
  <td>9</td>

  <td><a href="screen04.html">Screen04</a></td>

  <td>Screen04这一章基于Screen03,将教会你如何操纵字符,并将计算出来的值显示在屏幕上。
  </td>
</tr>

<tr>
  <th colspan="3">Input 系列(高阶)</th>
</tr>

<tr>
  <td>10</td>

  <td><a href="input01.html">Input01</a></td>

  <td>Input01这一章将教给你关于设备驱动的理论,如何链接驱动程序库,比如键盘。本章过后你将可以在屏幕上看到输入的字符。</td>
</tr>

<tr>
  <td>11</td>

  <td><a href="input02.html">Input02</a></td>

  <td>Input02这一章基于Input01,将教会你如何创建一个和操作系统打交道的命令行接口。
  </td>
</tr>

Things to be done(5)

Following things should be done in recent days:

  • RaspberryPI’s Operating System make
  • How to change the default theme of octopress
  • Translation of RaspberrPI Cambridge lessons
  • Setup a repository on github which holds raspberryPI relasted code
  • How to view sound card parameters

Chinese Localization in ArchLinux

1. Soving the chinese Garbled in vim:

	set fileencodings=utf8,cp936,gb18030,big5

2. Install chinese fonts:

	wqy-bitmapfont
	wqy-zenhei
	ttf-arphic-ukai
	ttf-arphic-uming
	ttf-fireflysung
	wqy-microhei(AUR中)
	wqy-microhei-lite(AUR中

3. Copy files from linux to windows or other systems:
You should do like following:

mount /dev/sdc /mnt
#copy all of the pdf into the directory
	export LANG="zh_CN.utf8"
	export LC_ALL="zh_CN.utf8"
	mount /dev/sdc /mnt -t vfat -o iocharset=utf8
	cp /chinese/*** /YourDestination

4. Using ftp for uploading files.
In filezilla, Choose charset to gb2312, like following:

charset

5. mount in specified charset

	mount -t vfat -o  iocharset=gb2312 -o  codepage=936 /dev/sdc /mnt

6. Changing existing names:

	convmv -f UTF-8 -t GBK --notest utf8编码的文件名