CS140e 是 Stanford 的一门操作系统课程。与其他操作系统课程相比,该课程使用现代的程序设计语言 Rust 来编写实验代码;且所有代码运行在 Raspberry Pi 3 上,通过真实硬件进行实验,学习起来应该更有乐趣。
目前有进一步熟悉操作系统基础知识的想法,而且手上刚好有一块正在吃灰的 Raspberry Pi,所以打算从这门课开始学习。
本文主要记录 Assignment 0: Blinky 的学习经过。
文章目录:
- Stanford CS140e 学习笔记 (1):Rust 基础、LED 闪烁
- Stanford CS140e 学习笔记 (2):驱动、bootloader、shell
- Stanford CS140e 学习笔记 (3):文件系统
- Stanford CS140e 学习笔记 (4):用户态程序的运行
Rust 基础知识学习
之前没有接触过 Rust,首先通过通读 The Rust Programming Language,学习 Rust 基础知识。
阅读 The Rust Programming Language 的过程中,最大的感觉是不少概念比较奇特,例如 lifetime,尤其是 lifetime annotations,从来没在其他语言中见到过。不过也基本明白了,类似的许多做法,主要是尽可能多地将错误暴露在编译过程中,而不是运行的时候。
目前只是对 Rust 有了一个初步的了解,希望能通过后面的课程,进一步熟悉 Rust.
Raspberry Pi 准备
实验之前,需要准备如下的模块和元器件:
- 一块 Raspberry Pi 3 (树莓派 3)
- 一块 1/2 尺寸的面包板(根据实验内容,尺寸大一点或者小一点,应该不会有太大影响)
- 一张 4GiB 的 Micro SD 卡
- 一个 USB Micro SD 读卡器
- 一个 CP2102 USB 转 TTL 模块
- 10 个彩色 LED
- 4 个 100 欧电阻
- 4 个 1K 欧电阻
- 10 根公对公杜邦线
- 10 根母对母杜邦线
这些模块和元器件,都能在淘宝同一家店铺内比较容易地买到。除了 Raspberry Pi,其他元器件价格都比较便宜。对于 LED、电阻、杜邦线等,可能达不到大部分店铺的起售数量,可以多买一些备用。
最终的连线,是将 Raspberry Pi 的 GPIO16 与 LED 相连,通过控制 GPIO16 的高低电平,来点亮或者熄灭 LED:
LED 闪烁(C 语言版本)
Raspberry Pi 使用内存映射的方式对 GPIO 进行操作,只需要在指定的内存地址中写入对应的值,即可设置 GPIO 的工作模式、使 GPIO 输出高低电平等。
本次作业需要实现 GPIO16 所连 LED 的闪烁效果。首先需要设置 GPIO16 为输出模式,然后在一个死循环中,交替在 GPIO16 上输出高电平和低电平。由于程序运行较快,需要使用代码中实现好的延时函数 spin_sleep_ms()
,控制 LED 闪烁的周期,使 LED 闪烁肉眼可见。
代码实现较为简单,大部分单片机的入门教程中,都会有类似的程序。如果熟悉单片机编程,参考 datasheet,应该能很快完成。
具体代码暂不公开,如需参考,请在评论中留言,或邮件联系。
点亮 LED (Rust 版本)
接下来主要就是将前面用 C 实现的 LED 闪烁程序,使用 Rust 重写一遍。程序中不会用到太多 Rust 新特性,稍加修改即可运行。
另外在实验的过程中,发现 xargo 最新版本是 0.3.11,安装后在我的电脑 (macOS High Sierra 10.13.3) 上无法正常工作。可通过 cargo install xargo --version 0.3.10
命令安装 0.3.10 版本来避免这个问题。
小结
Assignment 0 主要是用来熟悉本课程的软硬件环境,并完成了「LED 闪烁」这一个比较经典的入门程序。
其他类似的课程:
CS140e 相关文章:
- CS140e: (1) 准备与 Blinky
- Stanford CS140e: An Experimental Course on Operating Systems课程推荐
- 知乎:如何评价斯坦福的新操作系统课程CS140e?
Rust 相关文章:
您好,我是北航一名计算机在读研究生丁一峰,想趁着假期学习下rust,但是如今新的cs140e已经改成了c语言版了,去年官方的github链接也已经失效,网上找到的repositories只有实验结果没有具体的实验步骤(我找了好久实在是找不到。。。),您看如果方便的话,能不能发一份全套的代码(可以包含实验结果)给我,跪求。。。。。。谢谢您了。。。。
这里有原课程页面和 Git 仓库的备份:
https://cs140e.sergio.bz
对于实验结果,建议还是看一看 GitHub 上其他人更完善的代码。
非常感谢🙏