- 2025-04-01
-
发表了日志:
[嵌入式Rust修炼营] 初级 任务2:读写Cargo.toml 文件
-
发表了主题帖:
[嵌入式Rust修炼营] 初级 任务2:读写Cargo.toml 文件
跟着hunter老师学习了几天Rust,今天小试一下,来完成任务2 ,用fs的API trait来读写一下 Cargo.toml文件
我先写的code是这样的:
在terminal 中 cargo run 一下,如下
看一下,仅仅println!() 就少了好几个“!”,小菜鸟起步的必经之路,呜呜。。。
Rust编译非常好用和友善,错误都有提示,根据错误提示一步一步改bug,
得到了下面的code
这一步有遇到了一个问题,就是所有权问题,使用clone 就可以了,看看提示
修改这个问题后,接下来应该ok了吧,no no no...
追查了一下发现,错误发生在尝试将 Rust 数据结构序列化回 TOML 格式时,原因是 TOML 格式要求所有的值(values)必须在表(tables)之前出现。继续修改,最终code如下:
use anyhow::{Context, Result};
use serde::{Deserialize, Serialize};
use std::fs;
use std::path::Path;
/*
// define a struct to represent Cargo.tom file
#[derive(Debug, Serialize, Deserialize)]
struct CargoTom {
package: Package,
dependencies: Option<toml::value::Table>,
#[serde(rename = "dev-dependencies")]
dev_dependencies: Option<toml::value::Table>,
#[serde(rename = "build-dependencies")]
build_dependencies: Option<toml::value::Table>,
}
*/
// define a struct to represent Cargo.toml file
#[derive(Debug, Serialize, Deserialize)]
struct CargoTom {
package: Package,
dependencies: Option<toml::value::Table>,
#[serde(flatten)]
other: toml::value::Table,
}
#[derive(Debug, Serialize, Deserialize)]
struct Package {
name: String,
version: String,
authors: Option<Vec<String>>,
edition: Option<String>,
}
fn main() -> Result<()> {
let cargo_toml_path = Path::new("./Cargo.toml") ;
// read the Cargo.toml file
let content = fs::read_to_string(cargo_toml_path).context("Failed to read Cargo.toml")?;
// parse the Cargo.toml file
let mut cargo_toml: CargoTom = toml::from_str(&content).context("Failed to parse Cargo.toml")?;
// print the parsed Cargo.toml file
println!(" == original Cargo.toml file ==");
println!("{:#?}", cargo_toml);
// modify the parsed Cargo.toml file
cargo_toml.package.version = "0.2.0".to_string();
// add a new dependency to the parsed Cargo.toml file
if let Some(deps) = cargo_toml.other.get_mut("dependencies") {
if let Some(table) = deps.as_table_mut() {
table.insert("new_dep".to_string(), toml::value::Value::String("1.0.36".to_string()));
}
} else {
let mut deps = toml::value::Table::new();
deps.insert("new_dep".to_string(), toml::value::Value::String("1.0.36".to_string()));
cargo_toml.other.insert("dependencies".to_string(), toml::value::Value::Table(deps));
}
// serialize the modified Cargo.toml file to string
let mut update_content = String::new();
// firstly, serialize the package section
let package_toml = toml::to_string(&cargo_toml.package).context("Failed to serialize package section")?;
update_content.push_str(&package_toml);
// then, serialize the dependencies section
if let Some(deps) = cargo_toml.other.get("dependencies") {
let deps_toml = toml::to_string(deps).context("Failed to serialize dependencies section")?;
update_content.push_str("\n");
update_content.push_str(&deps_toml);
}
// finally, serialize the rest sections
/*for (key, value) in cargo_toml.other.iter() {
if key != "dependencies" {
let section_toml = toml::to_string(value).context(format!("Failed to serialize section {}", key))?;
update_content.push_str("\n");
update_content.push_str(§ion_toml);
}
}*/
// 然后序列化其他部分
for (key, value) in cargo_toml.other {
update_content.push_str(&format!("\n[{}]\n", key));
let section_toml = toml::to_string(&value)
.context(format!("Failed to serialize {}", key))?;
update_content.push_str(§ion_toml);
}
// print the modified Cargo.toml file
println!(" == modified Cargo.toml file ==");
println!("{:#?}", update_content);
// write the modified Cargo.toml file back to disk
//fs::write(cargo_toml_path, update_content).context("Failed to write Cargo.toml")?;
Ok(())
}
/*
Cargo.toml file content:
[package]
name = "task3"
version = "0.1.0"
edition = "2021"
[dependencies]
toml = "0.7"
serde = { version = "1.0", features = ["derive"] }
anyhow = "1.0"
*/
来看看我的最终结果吧
看看,虽然不算完美,但也算是一个历程,后续继续加油!!
- 2025-03-29
-
发表了主题帖:
[嵌入式Rust修炼营] 初级 任务1:冒泡排序法实现排序
初步入门Rust,跟着大咖学习Rust
算法逻辑(使用双循环):
1.外层循环控制排序轮数
2.内层循环比较相邻数据大小
3.使用一个标志位,表示当前轮排序是否有变动,若没有变动,数据已经有序,可以提前结束
简单粗暴,直接上code:
fn optimized_bubble_sort<T: PartialOrd>(arr: &mut [T]) {
let len = arr.len();
// 外层循环控制排序轮数
for i in 0..len {
// 设置标志位,表示本轮是否发生交换
let mut swapped = false;
// 内层循环比较相邻元素
for j in 0..len - i - 1 {
// 如果前一个元素比后一个大,则交换它们
if arr[j] > arr[j + 1] {
arr.swap(j, j + 1);
swapped = true;
}
}
// 如果本轮没有发生交换,说明数组已经有序,可以提前结束
if !swapped {
break;
}
}
}
fn main() {
// 测试整数
let mut numbers = [64, 34, 25, 12, 22, 11, 90];
println!("排序前数组: {:?}", numbers);
optimized_bubble_sort(&mut numbers);
println!("排序后数组: {:?}", numbers);
// 测试已经有序的数组
let mut already_sorted = [1, 2, 3, 4, 5];
println!("排序前数组: {:?}", already_sorted);
optimized_bubble_sort(&mut already_sorted);
println!("排序后数组: {:?}", already_sorted);
}
测试结果如下:
实验心得:
基本语法的学习,初步使用泛型写函数,极大提升了编写效率
-
发表了日志:
[嵌入式Rust修炼营] 初级 任务1:冒泡排序法实现排序
- 2025-03-13
-
回复了主题帖:
嵌入式Rust修炼营入围名单来啦,一起度过嵌入式Rust学习时光的小伙伴集合啦~
个人信息无误
- 2025-03-03
-
回复了主题帖:
嵌入式Rust修炼营:动手写串口烧录工具和MCU例程,Rust达人Hunter直播带你入门Rust
-参与理由&个人编程基础:
本人在做嵌入式开发,可以用c,c++,python做项目。业余了解过Rust也初略学习过,当时没有着手做项目,想找机会试试
-查看修炼任务和活动时间表,预估可以跟着完成几级任务(初级、中级、高级):
如果时间比较宽松的话,想一步一步来从初级到中级,再到高级,
-如探索过Rust,请说明Rust学习过程遇到难点,希望在参与活动中收获什么?
学习Rust的最难的是对概念的理解和运用,需要循序渐进,就如张汉东老师所说,Rust学习要逐步层次递进式学习
如果有机会,愿意跟随大咖一步步来
- 2025-01-06
-
回复了主题帖:
【嵌入式AI挑战营 】scrfd模型剪枝尝试,以及添加到摄像头例程
大咖有新发现啊,学习了
- 2024-12-23
-
发表了日志:
嵌入式AI人脸识别之---- insightface 之移植到 Luckfox Pico Max上
- 2024-12-10
-
发表了主题帖:
嵌入式AI人脸识别之----Luckfox Pico Max 的开箱小试
感谢EEWORD提供的活动(https://bbs.eeworld.com.cn/thread-1297648-1-1.html),居然有机会拿到Luckfox Pico Max的开发板,第一次玩这个板子,先来试试手。
申请参与活动之后,就从 https://gitee.com/LuckfoxTECH/luckfox-pico.git 上下载了 Luckfox的SDK,至于与原厂的SDK有啥区别,请参见https://bbs.eeworld.com.cn/thread-1300247-1-1.html大咖的分析。
作为新手,当然是从搭建Luckfox的开发环境开始
1.Ubuntu 22.04 开发环境搭建
我使用的是win11 WSL Linux开发,遇到的第一问题是ubuntu 24.04的源的问题,因为大家总所周知的问题,需要更换国内的镜像源,
安装ubuntu 24.04的版本是:
于是找了如下源,通过 sudo vim /etc/apt/sources.list 更换为aliyun 源,如下
然后 运行sudo apt update之后,根据 上手教程 | LUCKFOX WIKI上的提示安装开发依赖库包:
sudo apt-get install -y git ssh make gcc gcc-multilib g++-multilib module-assistant expect g++ gawk texinfo libssl-dev bison flex fakeroot cmake unzip gperf autoconf device-tree-compiler libncurses5-dev pkg-config bc python-is-python3 passwd openssl openssh-server openssh-client vim file cpio rsync
2. git 拉取最新源码
git clone https://gitee.com/LuckfoxTECH/luckfox-pico.git
3. 配置编译源码,根据host配置不同,编译时间可能会有不同,最后,顺利编译成功。
4.烧录SPI NAND Flash
1.打开下载的 Rockchip Soc ToolKit, 按着板子的boot button,使用type-C cable 连接开发板,选择对应的设备,添加刚刚编译的镜像,点击Download,我第一次烧录完成如下图:
4.验证摄像头
感谢Ai群友Mr.j 提供的vlc 网络播放器,得以验证摄像头的完好
刚拿到板子,初步尝试还算完美,验证摄像头正常使用,记录一下,
后续加用Insightface在Luckfox上实现人脸检测
再次感谢各位群友的帮助!!
- 2024-12-06
-
回复了主题帖:
Luckfox Pico Max 从开箱速通到自带的人脸识别例程
过来跟大咖学习一下
- 2024-11-22
-
回复了主题帖:
入围名单公布:嵌入式工程师AI挑战营(进阶)的挑战者们,领取板卡啦
个人信息已确认,领取板卡,可继续完成任务
- 2024-11-18
-
回复了主题帖:
嵌入式工程师AI挑战营(进阶):在RV1106部署InsightFace算法的多人实时人脸识别实战
本帖最后由 brack 于 2024-11-18 08:12 编辑
申请理由:
之前想玩嵌入式边缘AI没有机会,感谢主办方提供的机会。
insightFace:
InsightFace是由旷视科技(Megvii)开发的一款高效的人脸识别、人脸检测和人脸对齐算法库。它基于深度学习框架(如MXNet、OneFlow等),采用卷积神经网络(CNN)作为基础网络结构,通过多层卷积层、池化层和全连接层,提取输入图片中的人脸特征。InsightFace针对训练和部署进行了优化,支持多种硬件平台,包括CPU和GPU,能够实现快速、准确的人脸识别。同时,它提供了丰富的API,支持人脸检测、人脸识别、人脸对齐等多种功能,在多个领域得到了广泛应用,如金融支付、安防监控和手机解锁等。
1.环境准备:
确保RV1106开发板上的操作系统支持C/C++和相关依赖库的安装
评估RV1106的性能,选择合适的依赖库
2.Insightface 安装:
根据RV1106的硬件特性,选择合适的insightface版本进行安装,确保在CPU上高效运行
安装后,对insightface进行配置,主要针对人脸检测、识别和对齐功能的参数。
3.摄像头驱动与图象采集:
在RV1106上部署摄像头模块,实现图象采集。
配置摄像头参数,以满足多人实时人脸识别的需求。
4.算法优化与调试:
针对硬件特性,适当对insightface算法进行优化,以提高算法的运行效率
5.多人实时人脸识别:
利用insifhtface提供的API,实现多人实时人脸的识别。适当处理以区分不同的人脸
6.部署与测试
将优化后的算法部署到RV1106开发板上,进行测试确保其稳定性和可靠性。根据实际状况,进行验证和调试,满足实际需求。
感谢主办方提供的活动