SDK 架构
SDK 目录结构
rust/
├── ameba-hal/ HAL 驱动层:GPIO、I2C、SPI、UART、Timer 等外设抽象
│ ├── src/
│ ├── ld/ 主链接脚本(ameba.x)及内存布局定义
│ └── pac/ amebagreen2-pac(svd2rust 生成的寄存器访问层)
├── ameba-rom-sys/ ROM FFI 绑定层:extern "C" 声明 + ROM 符号链接脚本
│ ├── src/
│ ├── ld/ ameba_rom_symbol.x(ROM 函数地址映射)
│ └── bin/ 预编译固件缓存(boot.bin、WiFi 核固件)
├── ameba-rt/ 运行时层:Bootloader 入口表、cortex-m-rt 扩展
├── ameba-wifi/ WiFi 网络层:WHC IPC 驱动 + smoltcp 协议栈
│ └── ld/ ameba_rom_symbol_wifi.x(WiFi ROM 符号地址映射)
├── examples/ 示例工程(hello-world、gpio、tim、shell、wifi-connect)
├── xtask/ 编译编排工具(cargo xtask build-amebagreen2)
├── scripts/ 辅助脚本(工具链安装等)
├── doc/ SDK 内部技术文档
├── rust-toolchain.toml 锁定 nightly 工具链版本及交叉编译 target
└── Cargo.toml workspace 根配置
Crate 分层
SDK 按职责分为五层,从上到下依次为:
Crate |
层次 |
职责 |
|---|---|---|
|
网络层 |
WHC IPC 通道驱动(AP ↔ NP 核间通信)+ smoltcp 协议栈(DHCP、TCP、UDP) |
|
硬件抽象层 |
封装 GPIO、I2C、SPI、UART、Timer 等外设,实现 |
|
外设访问层 |
svd2rust 生成的寄存器类型安全访问,含 |
|
FFI 绑定层 |
裸 |
|
运行时层 |
提供 Bootloader 入口表、VTOR |
编译流水线
cargo xtask build-amebagreen2 完成以下三个阶段:
阶段 |
工具 |
输出 |
|---|---|---|
1 |
|
ELF 固件(含调试符号) |
2 |
|
|
3 |
|
|
ROM FFI 机制
SDK 底层通过 FFI 直接调用芯片 ROM 中固化的 C 函数。链接时,ameba_rom_symbol.x
将函数名解析为 ROM 固定地址,Rust 调用最终编译为一条跳转指令,无额外开销。
// ameba-rom-sys 中的声明
extern "C" {
pub fn DiagPrintf(fmt: *const u8, ...) -> i32;
}
// 用户代码调用(需 unsafe)
unsafe { ameba_rom_sys::DiagPrintf(b"Hello\n\0".as_ptr()); }
ameba-hal 将 ROM 调用封装在内部,对外提供安全的 Rust API,用户通常无需直接使用 unsafe。