You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何运行基于裸机ARM构建的无main函数Rust应用程序

解决裸机ARM Rust程序运行段错误的方案

核心问题分析

你的程序出现段错误的根本原因有三点:

  1. 裸机程序无法通过Shell直接执行:./app是依赖操作系统加载程序的方式,但裸机环境没有OS支撑,直接执行会因内存未初始化、栈未正确设置等问题崩溃。
  2. 缺少裸机启动代码:#![no_std]和#![no_main]意味着需要完全接管程序启动流程,默认Rust启动代码依赖操作系统,你必须自行提供栈初始化、硬件基础配置的启动逻辑。
  3. 未使用自定义链接脚本:rustc默认的链接脚本是为带OS的目标设计的,裸机场景需要指定内存布局(如RAM起始地址、栈大小),否则链接器生成的ELF文件内存映射不符合硬件要求。

具体解决步骤

1. 添加裸机入口点与启动代码

修改app.rs,引入cortex-m-rt crate提供的入口宏,同时补充必要的异常处理:

// app.rs
#![no_main]
#![no_std]

use cortex_m_rt::{entry, exception, ExceptionFrame};
use core::panic::PanicInfo;

// 定义裸机程序的入口点,替代依赖OS的main函数
#[entry]
fn main() -> ! {
    // 此处编写你的裸机业务逻辑,比如初始化外设、硬件操作等
    loop {}
}

#[panic_handler]
fn panic(_info: &PanicInfo<'_>) -> ! {
    loop {}
}

// 处理硬件异常,避免未捕获异常导致崩溃
#[exception]
fn HardFault(ef: &ExceptionFrame) -> ! {
    panic!("HardFault at {:#?}", ef);
}

2. 编写自定义链接脚本

创建link.x文件,根据你的ARM硬件平台指定内存布局(以下示例为Cortex-A9平台,RAM起始地址0x80000000,大小128MB):

MEMORY
{
    RAM : ORIGIN = 0x80000000, LENGTH = 128M
}

SECTIONS
{
    .text : {
        *(.text.entry)
        *(.text .text.*)
    } > RAM

    .rodata : {
        *(.rodata .rodata.*)
    } > RAM

    .data : {
        *(.data .data.*)
    } > RAM AT > RAM

    .bss : {
        *(.bss .bss.*)
        *(COMMON)
    } > RAM
}

3. 正确编译程序

推荐使用cargo管理项目,也可以直接用rustc编译:

方式1:使用Cargo(更便捷)

创建Cargo.toml配置文件:

[package]
name = "baremetal-arm-app"
version = "0.1.0"
edition = "2021"

[dependencies]
cortex-m-rt = "0.7.3"

[profile.release]
codegen-units = 1
opt-level = "z"
debug = false

执行编译命令:

cargo build --target armv7a-none-eabi --release

编译产物位于target/armv7a-none-eabi/release/baremetal-arm-app。

方式2:直接用rustc编译

rustc --target armv7a-none-eabi app.rs -o app -C link-arg=-Tlink.x -C linker=arm-none-eabi-ld

注:需提前安装arm-none-eabi-binutils交叉编译工具链

4. 正确部署到裸机平台

不能通过Shell的./app命令运行,需通过以下方式加载程序:

  • 使用JTAG/SWD调试器(如OpenOCD)将ELF文件下载到目标板的RAM或Flash
  • 制作成Bootloader可识别的镜像(如u-boot的uImage),通过Bootloader引导启动

额外注意事项

  • 确保安装完整的ARM交叉编译工具链:arm-none-eabi-gcc、arm-none-eabi-ld等
  • 根据你的具体ARM芯片(如Cortex-A7、A9)调整link.x中的内存布局参数
  • 若使用Cortex-M系列芯片,目标架构应改为thumbv7m-none-eabi,而非armv7a-none-eabi(后者针对Cortex-A系列)

内容的提问来源于stack exchange,提问作者cnm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:41:28