CS140e 是 Stanford 的一门操作系统课程。与其他操作系统课程相比,该课程使用现代的程序设计语言 Rust 来编写实验代码;且所有代码运行在 Raspberry Pi 3 上,通过真实硬件进行实验,学习起来应该更有乐趣。

目前有进一步熟悉操作系统基础知识的想法,而且手上刚好有一块正在吃灰的 Raspberry Pi,所以打算从这门课开始学习。

本文主要记录 Assignment 0: Blinky 的学习经过。


文章目录:

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 相关文章:

Rust 相关文章:

最后修改日期: 2021-05-13

留言

丁一峰 

您好,我是北航一名计算机在读研究生丁一峰,想趁着假期学习下rust,但是如今新的cs140e已经改成了c语言版了,去年官方的github链接也已经失效,网上找到的repositories只有实验结果没有具体的实验步骤(我找了好久实在是找不到。。。),您看如果方便的话,能不能发一份全套的代码(可以包含实验结果)给我,跪求。。。。。。谢谢您了。。。。

    这里有原课程页面和 Git 仓库的备份: https://cs140e.sergio.bz 对于实验结果,建议还是看一看 GitHub 上其他人更完善的代码。

丁一峰 

非常感谢🙏

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据