使用STM32F3DISCOVERY

一个 STM32F303VCT6 微控制器。这个微控制器具有
- 一个单核 ARM Cortex-M4F 处理器,支持单精度浮点运算,最高时钟频率为 72 MHz。
- 256 KiB 的“Flash”内存。(1 KiB = 1024 字节)
- 48 KiB 的 RAM。
- 各种集成外设,如定时器、I2C、SPI 和 USART。
- 通用输入输出 (GPIO) 以及其他类型的引脚,可通过板子两侧的两排接口访问。
- 可通过标有“USB USER”的 USB 端口访问的 Mini-USB 接口。
- LSM303DLHC 芯片有加速度计,磁力计,陀螺仪。
- 8 个用户 LED,排列成指南针形状。
- 第二个微控制器:STM32F103。这个微控制器实际上是板载编程器/调试器的一部分,并连接到名为“USB ST-LINK”的 Mini-USB 端口。
为了获取更详细的功能列表和板卡的进一步规格,请访问 STMicroelectronics 网站。
#![no_std]
嵌入式编程这一术语涵盖了广泛的不同类别的编程。从仅使用几 KB RAM 和 ROM 编程的 8 位微控制器(如 ST72325xx),到拥有 32/64 位 4 核 Cortex-A53 @ 1.4 GHz 和 1GB RAM 的系统如 Raspberry Pi (Model B 3+)。根据你的目标和使用场景不同,编写代码时将面临不同的限制/局限性。
Hosted Environments宿主环境
环境接近于普通 PC 环境。这意味着将获得一个系统接口帮,例如 POSIX,它为你提供了与各种系统交互的基础设施,如文件系统、网络、内存管理、线程等。标准库通常会依赖这些基础设施来实现其功能。你可能有某种形式的 sysroot,以及 RAM/ROM 使用的限制,或许还有一些特殊的硬件或 I/O。总的来说,感觉就像在特殊用途的 PC 环境中编程。
简单来说就是有些最基础的事情不用自己考虑由宿主系统代为管理,如内存分配/调度,核心线程任务调度等。只需使用宿主系统给的接口就能基于系统来避免做“重复造轮子”的任务来减少开发负荷。
Bare Metal Environments 裸机环境
在一个裸机环境中,在您的程序之前没有加载任何代码。没有操作系统提供的软件,无法加载标准库。相反,程序及其使用的 crates 只能使用硬件(裸机)来运行。为了防止 rust 加载标准库,使用 no_std 。标准库的平台无关部分通过 libcore 提供。libcore还排除了在嵌入式环境中并非指的使用的内容。其中之一是用于动态内存分配的内存分配器。如果您需要这个或其他任何功能,通常有 crates提供这些功能。
The libstd
所以libstd是Rust的标准库,提供在有操作系统支持下开发应用所需的的基础功能的集合。默认链接标准库,封装操作系统能力并提供通用数据结构与工具(如 网络 std::net)。
所以在我们使用裸机环境(#![no_std])时是无法调用listd的
总结
#![no_std] 是一个 crate 级别的属性,表示该 crate 将链接到 core-crate 而不是 std-crate。libcore crate 本身是 std crate 的平台无关子集,它不对程序运行的系统做任何假设。它提供了用于语言基本类型(如浮点数、字符串和切片)的 API,以及用于暴露处理器特性的 API(如原子操作和 SIMD 指令)。但它缺乏涉及平台集成的 API。因为这些特性,no_std 和 libcore 代码可用于任何类型的引导(阶段 0)代码,如引导加载程序、固件或内核。
| feature | no_std | std |
|---|---|---|
| heap (dynamic memory) | * | ✓ |
| collections (Vec, BTreeMap, etc) | ** | ✓ |
| stack overflow protection | ✘ | ✓ |
| runs init code before main | ✘ | ✓ |
| libstd available | ✘ | ✓ |
| libcore available | ✓ | ✓ |
| writing firmware, kernel, or bootloader code | ✓ | ✘ |
* 仅当你使用 alloc crate 并使用合适的分配器(如 alloc-cortex-m)时。
** 只有在使用 collections crate 并配置全局默认分配器时才可用。
** 由于缺少安全的随机数生成器,HashMap 和 HashSet 无法使用。
发表回复