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#...
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 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...
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...
device driver
您好!我是在浏览 GitHub 开源项目时,偶然发现并了解到 LINUX DO 这个充满活力的技术社区的。作为一个初入编程世界的小白新人,这是我第一次接触此类技术社区。在认真浏览了社区里的几篇帖子后,我被大家分享的技术干货和友好的交流氛围深深吸引,觉得非常有趣且充满干货,因此十分渴望加入。此前因为注册必须满足 GitHub 账号满三年的硬性条件,当时我还差最后半个月,今天终于满期,特来提交申请,希望能和大家一起学习、共同进步!
ethermet socket
TCP/UDPTCP保证可靠性 序列号、确认应答、超时重传 数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明它下一次需要接收的数据序列号。如果发送方迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是2*RTT(报文段往返时间)+一个偏差值 窗口控制与高速重发控制/快速重传(重复确认应答) TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定要等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每一个没收到确认应答的数据都要重发。使用窗口控制,如果数据段1001-2000丢失,后面数据每次传输,确认应答都会不停地发送序号为1001的应答,表示我要接收1001开始的数据,发送端如果收到3次相同应答,就会立刻进行重发;但还有种情况有可能是数据都收到了,但是有的应答丢失了,这种情况不会进行重发,因为发送端知道,如果是数据段丢失,接收端不会放过它的,会疯狂向它提醒… TCP...
linux driver
linux驱动模型字符设备驱动模型 驱动初始化驱动初始化中涉及到一个设备描述结构的概念。在任何一种驱动模型中,设备都会用内核中的一种结构来描述,这种结构称为设备描述结构。字符设备在内核中使用 struct cdev这种结构来描述 struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; //设备操作集 struct list_head list; dev_t dev; //设备号 unsigned int count; //设备数 }; count表明该类型设备的数目,如有两个串口,则count的值为2。dev是设备号,包含有主设备号和次设备号的信息。主设备号用于区分设备的类型,次设备号用于标记相同类型的设备的不同个体。如串口1和串口2使用同一驱动程序,则其主设备号相同,但次设备号不同。Linux内核中使用 dev_t 类型来定义设备号,dev_t 这种类型其实质为32位的 unsigned...
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...
