|
社区组织 嵌入式Rust修炼营:动手写串口烧录工具和MCU例程,Rust达人Hunter直播带你入门Rust 以来,根据个人的学习,完成了
任务一:【新提醒】[嵌入式Rust修炼营] 初级 任务1:冒泡排序法实现排序 - 嵌入式Rust活动专区 - 电子工程世界-论坛
任务二:【新提醒】[嵌入式Rust修炼营] 初级 任务2:读写Cargo.toml 文件 - 嵌入式Rust活动专区 - 电子工程世界-论坛
今天来学习任务三:烧录单片机
第一步:git clone 大咖的源码
第二步:编译example hello_world
表示编译成功,但找不到设备,原因在于我的ubuntu没有安装stlink驱动,找不到设备,暂时先不管,暂时先用pyisp烧录
git clone pyisp的源码
git clone javascript:;
cd pyisp
编译 cargo run
第三步,把第一步ubuntu下编译好的hello_wold 转化为bin档,为了方便,我自己写了一个elf 转化为bin的工程,代码如下
/*
Cargo.toml 内容
[dependencies]
goblin = "0.6" # ELF 文件解析库
anyhow = "1.0" # 错误处理库
*/
//source code
use std::path::Path;
use std::fs;
use anyhow::{Context, Result};
use goblin::elf::Elf;
fn main() -> Result<()>{
let elf_file = "hello_world"; // 输入文件名
let bin_file = "hello_world.bin"; // 输出文件名
// 检查输入文件是否存在
if !Path::new(elf_file).exists() {
return Err(anyhow::anyhow!("输入文件 {} 不存在", elf_file));
}
// 读取 ELF 文件内容
let elf_data = fs::read(elf_file)
.context(format!("无法读取文件 {}", elf_file))?;
// 解析 ELF 文件
let elf = Elf::parse(&elf_data)
.context("解析 ELF 文件失败")?;
// 收集所有可加载段(LOAD segments)
let mut binary_data = Vec::new();
for segment in elf.program_headers {
if segment.p_type == goblin::elf::program_header::PT_LOAD {
let start = segment.p_offset as usize;
let end = start + segment.p_filesz as usize;
binary_data.extend_from_slice(&elf_data[start..end]);
}
}
// 写入 BIN 文件
fs::write(bin_file, &binary_data)
.context(format!("无法写入文件 {}", bin_file))?;
println!("转换成功: {} → {}", elf_file, bin_file);
Ok(())
}
cargo run 编译后,把hello_world 放到工程目录下,
到此为止,烧录基本完成。
总结一下:
问题点在于开发环境的大家,AP环境和嵌入式环境可以共存,但注意切换,由于是开源,可能使用的软件的版本略有不同的,应当区别对待,
后面继续深入学习
加油!!