文章预览: [color=var(--fg)]嵌入式宝典嵌入式宝典带领你经历从零创造一个 #![no_std] 应用的过程,经历为Coterx-M微控制器搭建架构特定的功能的迭代过程。 [color=var(--fg)]目的通过阅读这本书你将会学到 搭建一个 #![no_std] 应用。这比搭建一个 #![no_std] 库更复杂,因为目标系统可能没有运行一个OS(或者你的目标就是搭建一个OS!),而且你的程序可能是目标中运行的唯一进程(或者第一个进程)。在这种情况下,程序可能需要为目标系统进行定制。 精细控制一个Rust程序的存储布局的技巧。你将学到链接器(linkers),链接器脚本和Rust中那些能让你控制Rust程序某些ABI的功能。 实现可以被静态重载(没有运行时消耗)的默认功能的一个技巧。
[color=var(--fg)]目标读者这本书主要面向两个读者: [color=var(--fg)]要求这本书是自洽的。读者不需要熟悉Cortex-M架构,也不需要一个Cortex-M微控制器 -- 这本书里包含 的所有例子能在QEMU中测试。然而,你需要安装下面的工具来运行和检查这本书中的示例:
[color=var(--fg)]#![no_std] 是什么意思?#![no_std] 是一个crate层的属性,其指出crate将链接到 [color=var(--links)]core 而不是 [color=var(--links)]std crate,但是这对应用来说意味着什么呢? std crate 是Rust的标准库。它包含的功能需要假设程序将运行在一个操作系统上而不是[直接运行在裸机]上。std 也假设操作系统是一个通用目的操作系统,像是会在服务器和桌面看到的那些系统。因此,std 在通常会在操作系统中的找到的那些功能:线程,文件,套接字,一个文件系统,进程,等等之上,提供一个标准的API 。 换句话说,core crate是std crate的一个子集,其不对将运行程序的系统做任何假设。它提供与语言的基本类型,像是浮点数,字符串和切片有关的APIs,也提供像是原子操作和SIMD指令这样暴露处理器特性的APIs 。然而它缺少涉及到堆内存分配和I/O有关的APIs。 对于一个应用来说,std 不仅仅只是提供一种方法访问OS抽象。std 在某些情况下,也提供栈溢出保护,处理命令行参数,在一个程序的main函数被启动前打开主线程。一个 #![no_std] 应用缺少上述的所有运行时,因此它必须初始化它自己的运行时,如果有需要的话。 由于这些特点,一个 #![no_std] 应用可以成为第一个或者是唯一一个运行在一个系统上的代码。它可以成为许多一个标准Rust应用无法成为的东西,比如:
简体中文 PDF 版本,想看最新的请直接看在线版本:
《Rust 嵌入式宝典 -- The Embedonomicon》.pdf
(5.73 MB, 下载次数: 147)
|