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...
NXP OS System
yocto 编译nxp系统检查 Yocto 编译出来的 .wic 镜像内容查看分区信息# 查看分区信息fdisk -l core-image-*.wic 挂载 .wic 镜像分区unzstd ./tmp/deploy/images/imx8mpevk/core-image-base-*.wic.zstsudo losetup -Pf --show ./tmp/deploy/images/imx8mpevk/core-image-base-*.wicsudo mkdir ./wicrootsudo mount /dev/loop0p2 ./wicrootls ./wicroot/ls ./wicroot/usr/bin/# 卸载并释放 loop 设备sudo umount ./wicrootsudo losetup -d /dev/loop0 扩展rootfs分区边界fdisk /dev/mmcblk2# 输入 p查看当前分区,记下第2分区的 Start(起始扇区)数值# 输入 d,然后输入 2 删除第2分区。# 输入 n 新建分区,输入 p,编号输入 2#...
无标题
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", ...
cpp note
操作符字符串化(#)& 符号连接操作符 (##)#define example( instr ) printf("xxx %s\n", #instr) // “把参数 instr 直接转为字符串字面量”。#define example1(instr) #instr // 把参数文本直接转成字符串字面量,替换到调用处#define example2(n) num ## nint main() { example(TEST::LIC_EDFA); // xxx TEST::LIC_EDFA std::string str = example1(abc); printf("%s\n", str.c_str()); // abc printf("xxx %s\n", example1(yesai)); // yesai int num = 9; int num9 = example2(9); return...
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 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 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(…)) 返回给调用者。
