Rust嵌入式开发神器:rust-raspberrypi-OS-tutorials工具链使用指南

【免费下载链接】rust-raspberrypi-OS-tutorials :books: Learn to write an embedded OS in Rust :crab: 【免费下载链接】rust-raspberrypi-OS-tutorials 项目地址: https://gitcode.com/gh_mirrors/ru/rust-raspberrypi-OS-tutorials

你还在为嵌入式系统开发调试困难而烦恼吗?还在为复杂的硬件配置和代码调试耗费大量时间吗?本文将带你全面了解rust-raspberrypi-OS-tutorials工具链,让你轻松掌握Rust嵌入式开发的精髓,快速上手树莓派操作系统开发。读完本文,你将能够:搭建完整的Rust嵌入式开发环境、使用JTAG进行硬件调试、掌握内核编译与烧录方法、了解项目代码结构与模块划分。

项目简介

rust-raspberrypi-OS-tutorials是一个基于Rust语言的树莓派操作系统开发教程项目,旨在帮助开发者学习如何编写嵌入式操作系统。项目提供了一系列逐步进阶的教程章节,从最基础的环境搭建到复杂的内核功能实现,涵盖了嵌入式开发的各个方面。

项目结构采用模块化设计,每个章节对应一个独立的功能模块,便于开发者逐步学习和实践。官方文档:README.md,中文教程:00_before_we_start/README.CN.md

环境准备

前置要求

在开始使用rust-raspberrypi-OS-tutorials工具链之前,需要确保你的系统满足以下要求:

  • 安装Rust开发环境,包括Cargo包管理器
  • 安装Git版本控制工具
  • 安装交叉编译工具链
  • 准备一张至少4GB的SD卡
  • 树莓派开发板(推荐Raspberry Pi 3或4)

克隆仓库

项目仓库地址为:https://gitcode.com/gh_mirrors/ru/rust-raspberrypi-OS-tutorials,使用以下命令克隆项目到本地:

git clone https://gitcode.com/gh_mirrors/ru/rust-raspberrypi-OS-tutorials.git
cd rust-raspberrypi-OS-tutorials

项目结构解析

整体架构

rust-raspberrypi-OS-tutorials项目采用清晰的模块化结构,主要包含以下几个部分:

  • 教程章节:以数字编号的文件夹,如00_before_we_start、01_wait_forever等,每个文件夹对应一个教程章节,包含该章节的源代码、Makefile和说明文档。
  • 公共代码:common文件夹中包含了各个章节共用的代码和工具。
  • 文档资源:doc文件夹中存放了项目相关的图片、图表等资源文件。
  • 工具脚本:utils文件夹中包含了一些辅助开发的脚本工具。

代码组织

项目的代码组织遵循一定的规范,以便于开发者理解和维护。以内存子系统为例,其代码分布如下:

  • src/memory.rssrc/memory/**/*:与目标处理器体系结构和“BSP”特性无关的通用代码,例如将大块内存归零的函数,以及通过archBSP代码实现的内存子系统接口。
  • src/bsp/__board_name__/memory.rssrc/bsp/__board_name__/memory/**/*:BSP具体代码,如主板内存映射(DRAM物理地址和MMIO设备)。
  • src/_arch/__arch_name__/memory.rssrc/_arch/__arch_name__/memory/**/*:处理器架构的具体代码,如为特定处理器架构实现的MMU接口。

从命名空间角度来看,内存子系统代码在:

  • crate::memory::*
  • crate::bsp::memory::*

代码组织结构

快速上手

编译第一个示例

以01_wait_forever章节为例,演示如何编译第一个内核示例:

  1. 进入章节目录:cd 01_wait_forever
  2. 编译内核:make
  3. 生成的内核镜像文件为kernel8.img

编译配置文件:01_wait_forever/Makefile,项目依赖:01_wait_forever/Cargo.toml

烧录镜像

将编译生成的内核镜像烧录到SD卡中,步骤如下:

  1. 将SD卡连接到电脑
  2. 确定SD卡设备名称(如/dev/sdb)
  3. 使用dd命令烧录镜像:dd if=kernel8.img of=/dev/sdb bs=4M
  4. 等待烧录完成后,将SD卡插入树莓派

启动树莓派

连接树莓派的电源、显示器和键盘,启动树莓派,你将看到内核启动信息输出。此时内核会进入一个无限等待状态,这是01_wait_forever章节的预期功能。

硬件调试

JTAG调试介绍

JTAG(Joint Test Action Group)是一种国际标准测试协议,主要用于芯片内部测试。在嵌入式开发中,JTAG调试是一种非常强大的硬件调试手段,可以实现对目标板的实时调试、断点设置、内存查看等功能。

rust-raspberrypi-OS-tutorials工具链提供了完善的JTAG调试支持,通过JTAG调试器可以在真实硬件上逐步执行内核代码,方便开发者定位和解决问题。JTAG调试章节:08_hw_debug_JTAG/README.CN.md

硬件连接

进行JTAG调试需要准备以下硬件:

  • JTAG调试器(推荐OLIMEX ARM-USB-TINY-H)
  • 杜邦线若干
  • 树莓派开发板

JTAG接线图如下表所示:

GPIO # Name JTAG # Note
VTREF 1 to 3.3V
GND 4 to GND
22 TRST 3
26 TDI 5
27 TMS 7
25 TCK 9
23 RTCK 11
24 TDO 13

JTAG接线图

实际连接效果如下图所示:

JTAG连接实物图

软件设置

在SD卡的config.txt文件中添加以下配置,启用JTAG功能:

arm_64bit=1
init_uart_clock=48000000
enable_jtag_gpio=1

调试步骤

  1. 运行make jtagboot命令,加载JTAG引导程序:
$ make jtagboot
Minipush 1.0

[MP] ⏳ Waiting for /dev/ttyUSB0
[MP] ✅ Serial connected
[MP] 🔌 Please power the target now
 __  __ _      _ _                 _
|  \/  (_)_ _ (_) |   ___  __ _ __| |
| |\/| | | ' \| | |__/ _ \/ _` / _` |
|_|  |_|_|_||_|_|____\___/\__,_\__,_|

           Raspberry Pi 3

[ML] Requesting binary
[MP] ⏩ Pushing 7 KiB ==========================================🦀 100% 0 KiB/s Time: 00:00:00
[ML] Loaded! Executing the payload now

[    0.394532] Parking CPU core. Please connect over JTAG now.
  1. 打开新终端,运行make openocd启动OpenOCD调试服务器:
$ make openocd
[...]
Open On-Chip Debugger 0.10.0
[...]
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 1000 kHz
Info : JTAG tap: rpi3.tap tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : rpi3.core0: hardware has 6 breakpoints, 4 watchpoints
Info : rpi3.core1: hardware has 6 breakpoints, 4 watchpoints
Info : rpi3.core2: hardware has 6 breakpoints, 4 watchpoints
Info : rpi3.core3: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
Info : Listening on port 3334 for gdb connections
Info : Listening on port 3335 for gdb connections
Info : Listening on port 3336 for gdb connections
  1. 打开第三个终端,运行make gdb启动GDB调试器:
$ make gdb
[...]
>>> target remote :3333                          # Connect to OpenOCD, core0
>>> load                                         # Load the kernel into the RPi's DRAM over JTAG.
Loading section .text, size 0x2454 lma 0x80000
Loading section .rodata, size 0xa1d lma 0x82460
Loading section .got, size 0x10 lma 0x82e80
Loading section .data, size 0x20 lma 0x82e90
Start address 0x0000000000080000, load size 11937
Transfer rate: 63 KB/sec, 2984 bytes/write.
>>> set $pc = 0x80000                            # Set RPI's program counter to the start of the kernel binary.
>>> break main.rs:158
Breakpoint 1 at 0x8025c: file src/main.rs, line 158.
>>> cont
>>> step                                         # Single-step through the kernel
>>> step
>>> ...

JTAG引导程序:X1_JTAG_boot,调试演示:doc/09_demo.gif

内核开发进阶

内存管理

内存管理是操作系统的核心功能之一,rust-raspberrypi-OS-tutorials项目对内存管理进行了详细的讲解和实现。项目中的内存管理模块包括物理内存管理、虚拟内存管理、页表管理等功能。

内存管理相关代码位于src/memory.rs文件及其子目录中,不同架构和板级支持包的内存管理实现分别位于src/_archsrc/bsp目录下。内存管理模块:src/memory.rs,页表结构示意图:doc/11_page_tables_64KiB.png

中断处理

中断处理是嵌入式系统中不可或缺的部分,项目通过异常处理机制实现了对硬件中断的响应和处理。中断控制器驱动代码位于src/driver.rs文件中,不同处理器架构的中断处理实现位于对应的_arch目录下。

中断处理模块:src/driver.rs,GICv2驱动架构图:doc/14_GICv2_driver.png

定时器功能

定时器是实现操作系统任务调度、时间管理等功能的基础。项目中的定时器功能模块位于src/time.rs文件中,通过对硬件定时器的编程,实现了高精度的时间测量和定时中断功能。

定时器模块:src/time.rs,定时器回调功能:20_timer_callbacks

项目资源与支持

文档资料

社区支持

虽然项目本身没有明确的社区链接,但你可以通过以下方式获取支持:

  • 在项目的Git仓库提交issue
  • 参与Rust嵌入式开发社区讨论
  • 参考项目中的示例代码和测试用例

测试工具

项目提供了丰富的测试工具和示例,位于common/tests目录下,包括引导测试、控制台IO测试、退出代码测试等。测试脚本:common/tests/boot_test.rb,测试调度工具:common/tests/dispatch.rb

总结与展望

rust-raspberrypi-OS-tutorials工具链为Rust嵌入式开发提供了全面的支持,从环境搭建到内核开发,从硬件调试到功能实现,涵盖了嵌入式系统开发的各个方面。通过本文的介绍,你已经对该工具链有了基本的了解,并掌握了其主要功能的使用方法。

未来,随着Rust语言在嵌入式领域的不断发展,rust-raspberrypi-OS-tutorials项目也将不断完善和更新,为开发者提供更加丰富和先进的功能。我们期待看到更多基于该项目的创新应用和扩展开发。

如果你觉得本文对你有所帮助,请点赞、收藏、关注三连,以便获取更多关于Rust嵌入式开发的优质内容。下期预告:Rust嵌入式开发高级技巧之多任务调度实现。

【免费下载链接】rust-raspberrypi-OS-tutorials :books: Learn to write an embedded OS in Rust :crab: 【免费下载链接】rust-raspberrypi-OS-tutorials 项目地址: https://gitcode.com/gh_mirrors/ru/rust-raspberrypi-OS-tutorials

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐