Rust Testing
Testing Patterns and Strategies 测试类型 描述 示例 #[should_panic] 测试预期失败,验证代码在特定条件下会触发 panic。 #[should_panic(expected = "index out of bounds")] #[ignore] 标记缓慢或依赖硬件的测试,默认跳过,需手动运行。 #[ignore = "requires GPU hardware"] 返回 Result 的测试 使用 Result 替代 unwrap,更清晰地处理错误。 fn test_config_parsing() -> Result<(), Box<dyn std::error::Error>> { ... } 测试夹具 (Fixtures) 使用构建器模式和 Drop 自动清理测试资源。 struct TestFixture { temp_dir: PathBuf, ... } 模拟特征 (Mocking...
Rust clousure
错误传播运算符?let socket = UdpSocket::bind(bind_addr).map_err(MSG::Io)?; 如果表达式(如 UdpSocket::bind(bind_addr).map_err(MSG::Io))返回 Ok(val),就把 val 取出来继续执行后面的代码。如果返回 Err(e),就立刻把 Err(e) 返回,终止当前函数,不再往下执行。 如果 bind 成功,socket 就是绑定好的 UdpSocket。如果 bind 失败,错误会被 map_err(MSG::Io) 转换成 MSG::Io,然后 ? 直接把 Err(MSG::Io(…)) 返回给调用者。
Rust async
async/awaitRust 的 async/await 是一种协作式(Cooperative)异步编程模型。它允许你在等待 I/O 操作(如网络请求、数据库查询)时,挂起当前任务并释放 CPU,去处理其他任务,从而实现高并发。 Featureasync 函数不会立即执行,而是返回一个实现了 Future trait 的对象 懒惰性(Lazy):Future 本质上是一个状态机(State Machine)。当调用一个 async 函数时,它只会创建一个结构体,记录需要做什么,但不会执行任何代码。 驱动(Polling):只有当通过 .await 显式调用它,或者交给一个异步运行时(如 Tokio)去 poll(轮询)时,这个任务才开始真正向前推进。 async & await async fn:定义一个异步函数。它会将函数体编译为一个包含所有局部变量的状态机 .await:告诉运行时:“我在这里暂停,直到这个任务完成。如果没完成,请先去运行别的任务” 协作式调度Rust 的异步模型有一个显著特点:Rust...
Rust
代码注释// 行注释/* 块注释*/ 文档注释 文档注释需要位于 lib 类型的包中,例如 src/lib.rs 中 文档注释可以使用 markdown语法!例如 # Examples 的标题,以及代码块高亮 被注释的对象需要使用 pub 对外可见,记住:文档注释是给用户看的,内部实现细节不应该被暴露出去 /// 文档注释/// `add_one` 将指定值加1////// # Examples////// ```/// let arg = 5;/// let answer = my_crate::add_one(arg);////// assert_eq!(6, answer);/// ```pub fn add_one(x: i32) -> i32 { x + 1} 文档块注释 /** `add_two` 将指定值加2# Examples let arg = 5;let answer = my_crate::add_two(arg); assert_eq!(7, answer); */pub fn...
Rust generics
Implementation实现 impl const 泛型fn display_array<T: std::fmt::Debug, const N: usize>(arr: [T; N]) { println!("{:?}", arr);}fn main() { let arr: [i32; 3] = [1, 2, 3]; display_array(arr); let arr: [i32; 2] = [1, 2]; display_array(arr);} 假设某段代码需要在内存很小的平台上工作,因此需要限制函数参数占用的内存大小,此时就可以使用 const 泛型表达式来实现: // 目前只能在nightly版本下使用#![allow(incomplete_features)]#![feature(generic_const_exprs)]fn something<T>(val: T)where Assert<{...
Rust
typeOptionOption: 枚举类型,处理缺失值的核心, 取代 null // Option 定义enum Option<T> { Some(T), // 盒子装了一个类型为 T 的值 None, // 盒子是空的} Some(T):代表“有值”。T 是具体的数据类型(比如 i32、String 等)None:代表“没值”。它是专门用来表示“什么都没有”的占位符 生命周期静态生命周期 'static#![allow(unused)]fn main() {// String literals are always 'static — they live in the binary's read-only sectionlet s: &'static str = "hello"; // Same as: static const char* s = "hello"; in C// Constants are also...
OS System
linux常用指令 systemctl petalinux 系统制作 系统引导和文件系统的制作 initram临时系统文件制作 ext4文件系统制作 编译结果的文件解释 BOOT.bin image.ub system.bit(bitstream) rootfs_cpio.tar.gz zynqmp_fsbl.elf u-boot SysMonPSU pgrep 获取指定进程信息 驱动创建 应用创建 gdb 远程调试 create modules 驱动 linuxptp 内核配置 rootfs设置 设置自动登录 PetaLinux patch生成和应用方法整理 patch 2021.1及以后的版本 清除patch 清理 devtool modify (linux-xlnx) 产生的源码与补丁 petalinux-build 清理 清理所有构建输出和缓存 或者使用 清理特定组件 清理内核 清理 u-boot 清理根文件系统 清理设备树 preboot 通过 mdio...
gdb & core-dump
gdb基础操作gdb ./program# 退出用q或者quit list 或 l # :查看当前行附近的源代码。l 20 # :查看第 20 行附近的代码。run 或 r:开始运行程序。如果程序需要输入参数:r arg1 arg2 断点管理break 15 或 b 15:在第 15 行设断点。b func_name:在进入某个函数时停下。info breakpoints:查看所有断点。delete 1:删除编号为 1 的断点。 推进执行 (Step/Next)next (n): 单步执行(不进入函数内部,直接跳过)。step (s): 单步执行(进入函数内部)。continue (c): 继续运行,直到遇到下一个断点或程序结束。finish: 运行完当前函数并返回到调用处。 查看变量 (Print/Watch)print var (p var): 查看变量 var 的当前值。display var: 每次程序暂停时都自动显示该变量。watch var: 监视变量。一旦 var 的值发生变化,程序立即停下。 查看调用栈 (Backtrace)***...
NXP OS System
standalone 编译各模块uboot拉取uboot仓库# clone 自己的仓库后,将官方的仓库subtree下来 注意可能需要代理git remote add uboot-imx https://github.com/nxp-imx/uboot-imx.gitgit subtree add --prefix=uboot-imx uboot-imx lf_v2025.04 --squash # --squash 是将remote仓库的所有提交commint成一个# 拉取atf信任固件git remote add imx-atf https://github.com/nxp-imx/imx-atf git subtree add --prefix=imx-atf imx-atf lf_v2.12 --squash# 下载ddr training binmkdir firmware-imxwget -P ./firmware-imx...
Hawaii Yocto System
yocto 编译nxp系统 使用google的repo工具来管理整个项目的仓库代码 uboot建好仓库后拉取imx官方的uboot仓库代码并修改 git remote add uboot-imx https://github.com/nxp-imx/uboot-imx.gitgit fetch uboot-imx lf_v2025.04git merge --squash --allow-unrelated-histories uboot-imx/lf_v2025.04git commit -m "Squash merge uboot-imx/lf_v2025.04" 编译make distcleanmake imx8mp_evk_defconfigmakemake dtbs kernel同样fork imx的仓库过来修改 git remote add linux-imx https://github.com/nxp-imx/linux-imx.gitgit fetch linux-imx lf-6.12.ygit merge --squash...
