无标题
httphttp请求格式Method Request-URI HTTP-Versionheaders CRLFmessage-body example [ "GET / HTTP/1.1", "Host: 127.0.0.1:7878", "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:99.0) Gecko/20100101 Firefox/99.0", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language: en-US,en;q=0.5", "Accept-Encoding: gzip, deflate, br", "DNT: 1", ...
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
代码注释// 行注释/* 块注释*/ 文档注释 文档注释需要位于 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 smart point
声明式宏 macro_rules!模式解析简化的vec! #[macro_export] // 宏导出macro_rules! vec { // 宏定义 ( $( $x:expr ),* ) => { // 模式匹配 { let mut temp_vec = Vec::new(); $( temp_vec.push($x); )* temp_vec } };} ( $( $x:expr ),* )的含义圆括号 () 将整个宏模式包裹其中。紧随其后的是 $(),跟括号中模式相匹配的值(传入的 Rust 源代码)会被捕获,然后用于代码替换。在这里,模式 $x:expr 会匹配任何 Rust 表达式并给予该模式一个名称:$x $() 之后的逗号说明 $() 所匹配的代码使用逗号分隔符分割,紧随逗号之后的 * 说明 *...
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...
Rust smart point
Box 堆对象分配表达式不能隐式地解引用 特意的将数据分配在堆上fn main() { let a = Box::new(3); println!("a = {}", a); // a = 3 // 下面一行代码将报错 // let b = a + 1; // cannot add `{integer}` to `Box<{integer}>`} 智能指针往往都实现了 Deref 和 Drop 特征,因此:println! 可以正常打印出 a 的值,是因为它隐式地调用了 Deref 对智能指针 a 进行了解引用最后一行代码 let b = a + 1 报错,是因为在表达式中,我们无法自动隐式地执行 Deref 解引用操作,你需要使用 * 操作符 let b = *a + 1,来显式的进行解引用a 持有的智能指针将在作用域结束(main 函数结束)时,被释放掉,这是因为 Box 实现了 Drop 特征 ...
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...
无标题
kernel 调试及优化启动分析内核启动过程分析 (Kernel Boot Analysis)# 可读时间dmesg -T bootgraph (内核自带绘图工具)# Linux 内核源码树中提供了一个脚本 scripts/bootgraph.pl。# 捕获数据: dmesg > boot.log# 生成 SVG: perl scripts/bootgraph.pl boot.log > boot.svg# 这会生成一张矢量图,直观展示哪些内核函数(如 pci_init, ext4_init)执行时间最长。 用户态服务启动分析 (Systemd Analysis)一旦内核完成初始化并启动 init 进程(通常是 systemd),性能分析的重心就转向了服务加载。systemd 自带了极其强大的分析工具族 # 总体耗时概览systemd-analyze# 服务耗时排行榜 (Blame) 它会按耗时降序排列所有单元。注意:耗时长不代表它阻塞了启动,因为它可能是异步运行的。systemd-analyze blame 关键路径分析...
无标题
IMX8MP-EVK MCUuboot启动M7进入uboot后 查看mmc设备 mmc list 看到如下 FSL_SDHC: 1 # SDFSL_SDHC: 2 (eMMC) 再查看emmc 第一个分区的内容,会有m7的程序 fatls mmc 2:1 直接运行 对于编译出来的运行在 TCM上的固件 TCM (Tightly Coupled Memory) - 紧耦合存储器位置:通常位于核心处理器芯片内部或非常靠近核心的地方(片上内存,OCRAM/SRAM)。速度:极快,通常与 CPU 核心时钟同步,访问速度接近 L1 Cache,无延迟。用途:主要用于存储 关键代码(如实时操作系统 RTOS 内核、中断处理程序、设备驱动程序)和 实时数据。在异构系统(如 i.MX M7 核心)中,M7 的代码通常被复制到 TCM 中执行。大小:较小(通常为几十 KB 到几 MB)。特性:不可缓存。处理器直接访问它,因此访问是可预测的,非常适合 实时 应用。 fatload mmc 2:1 0x48000000...
