- 博客(64)
- 收藏
- 关注
原创 try-throw-catch异常捕获流程
throw 可以抛出任何类型的对象(基本类型、字符串、类对象),但最好是抛出派生自 std::exception 的类对象,因为它们有统一的 what() 成员函数来获取错误描述。当 throw 语句执行时,程序控制流会立即离开当前函数,并沿着调用链向上回溯,这个过程称为。是一种警报和恢复机制,它允许程序在遇到无法在局部处理的错误(如文件不存在、内存不足、除零错误)时,跳出当前执行流,将错误信息“抛”给上层调用者处理,而不是让程序崩溃。catch 块紧随 try 块之后,用于捕获并处理特定类型的异常。
2026-07-04 20:34:19
195
原创 调试排查工具介绍(gdb、strace、Valgrind等)
使用gdb,在程序崩溃时查看调用栈(bt命令),定位最后执行的函数,检查该函数中是否有异常内存操作。使用GDB调试之前,需要用-g选项编译程序,这样可执行文件中才会包含符号表(变量名、函数名、行号等信息)g++ -g -o myprogram myprogram.cpp。运行Valgrind检测,valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all ./leak。:基于 ptrace,跟踪进程执行时的 系统调用 和 接收到的信号。
2026-07-04 20:32:20
335
原创 Linux系统调用与C库I/O的底层奥秘
fopen fwrite fread fclose ... 属于标准C库/ 标准 I/O,定义在 C 标准头文件 <stdio.h> 中,所属层级在用户空间,有缓冲,内部会调用底层的 open/read/write/close 等系统调用。行缓存 ,遇到换新行(\n),或者写满缓存时,即调用系统调用函数,如::fgets,gets,printf,fprintf,sprintf,fputs,puts,scanf。1.遇到\n 时,会将库缓存的内容写到内核缓存中,即调用了系统调用函数。
2026-06-05 21:16:13
251
2
原创 揭秘Linux中断处理的核心步骤
不能msleep、kmalloc(GFP_KERNEL),还有mutex_lock(互斥锁)、copy_to_user(用户空间拷贝,可能阻塞)等,会导致睡眠。中断上下文是指 CPU 执行中断服务程序(ISR)时所处的运行环境。阻塞其他中断:很多单片机的中断优先级可配置,但如果当前 ISR 执行时间过长,同级或低优先级中断会被长期挂起,导致响应延迟甚至丢失中断事件。造成数据丢失:例如串口接收中断,如果 ISR 处理时间过长,下一个字节已经到来,而接收寄存器没有被及时读取,数据就会被覆盖(溢出错误)。
2026-06-05 21:14:38
525
原创 poll、epoll、select的详解
1.select是有三个fds集合,对应三种不同类型(读事件、写事件、异常事件),ndfs是读取字节数,timeout是超时时间。返回就绪的IO,然后需要遍历队列(数组)的就绪事件,要一个个判断fd是否就绪。效率上,因为select/poll是复制所有fd去轮询检查的,大量fd却只有少量是活跃的说明系统会调用大量资源只为了给那几个fd服务,开销大,性能肯定低。epoll就反过来。epoll_wait取出的是已经就绪的事件(活跃的 fd),不需要轮询那些没有就绪的事件了,不同于上面两个。
2026-05-26 20:17:41
370
原创 I2C介绍
一开始主从之间没有任何消息,由于上拉电阻的存在,此时SDA和SCL都为高电平,或者说空闲状 态为高电平 当主设备需要读或写从设备时,主设备在时钟线SCL为高电平的时候拉低数据线的电平SDA,这个 就是开始信号,表示主设备准备传输数据 之后SCL就开始以周期的方式输出高低变化的电平信号,由主设备接管SCL控制权 对于此时的SDA,会配合SCL的信号进行传输数据。答:如果使用推挽输出,那么当一个设备尝试输出高电平,而另外一个设备尝试输出低电平时,可能会 形成电源到地的直接路径,会产生短路的风险。
2026-03-27 12:33:55
350
原创 关于STL容器里的“细节”
STL容器主要分为三类:顺序容器(vector、list、deque等)、关联容器(set、map等)和容器适配器(stack、queue等)。顺序容器保持元素插入顺序,关联容器自动排序或哈希,适配器提供特定访问方式。
2026-03-27 11:07:58
508
原创 嵌入式算法——位运算专题
在嵌入式开发中,外设(GPIO、UART、ADC、定时器等)通常通过控制。这些寄存器的每一位或几位代表特定功能(如使能、方向、中断标志等),不用位运算,就无法精确控制某一位而不影响其他位。又或者,设置 GPIOA 的第 5 位为输出高电平。
2026-02-09 16:17:21
527
原创 static 关键字在 C 和 C++ 中的四种作用
在 C 和 C++ 中,static 关键字具有不同的作用,具体取决于它修饰的对象类型和上下文。下面分别说明 static 对 C 语言中的全局变量、局部变量、函数,以及 C++ 类成员(变量和函数) 的作用。
2026-02-09 15:55:07
501
原创 在用VSCode的ssh协议连接虚拟机ubuntu时,出现Bad owner or permissions on `C:\Users\Lenovo\.ssh\config,解决方法
把 `.ssh\config` 文件权限改成“只有我自己能访问”,OpenSSH 才会接受它。4. 验证权限 执行: ```powershell icacls "C:\Users\Lenovo\.ssh\config" ```你应该只看到类似这样的输出: ``` C:\Users\Lenovo\.ssh\config Lenovo:(F) ```不应该出现 `Everyone`、`Users`、`Authenticated Users` 等字样。
2025-12-30 17:31:05
516
原创 C/C++ 内存分配函数详解
由于交换空间(Swap Space),当物理内存不足时,操作系统会将一些不常用的物理页面移动到磁盘上的交换空间,从而腾出物理内存给需要的页面。当程序再次访问被换出的页面时,操作系统会将其从磁盘换入物理内存(可能需要换出其他页面)。因此,1.2G的虚拟内存中,只有一部分(最近被访问的)放在物理内存中,其余部分可能放在交换空间中。真正的限制是虚拟地址空间大小和交换空间大小,而不仅仅是物理内存大小。操作系统为每个进程提供的虚拟地址空间(通常很大,如32位系统4GB,64位系统更大),地址空间布局为。
2025-12-17 21:42:53
304
原创 C语言关键字详解
本文总结了C/C++中五个关键关键字的主要特性:1) static用于修饰变量/函数的存储周期和作用域;2) const定义常量,提供类型安全;3) volatile防止编译器优化变量访问;4) sizeof计算数据类型内存大小;5) register建议变量存储在寄存器中。重点对比了const与#define的区别,以及sizeof与strlen的不同特性,并分析了各关键字的使用场景和注意事项。这些关键字在变量声明、内存管理和性能优化等方面具有重要作用。
2025-12-17 21:13:41
647
原创 程序的特权级机制
x86提供了特权级机制,用于将不同的代码划分成不同的特权级。其中操作系统运行于最高特权级0,可以执行很多系统指令,如开关中断等。而应用程序工作在最低特权级模式3,只能执行不需要特权的代码。在计算机上电启动进入保护模式后,默认为特权级0。手册中有给出权限相关的详细说明,这里只是简单的略做简介。如下图所示,CPU当前运行的程序位于CS指向的代码段,因此CS的最低两位CPL就代表了当前程序所具备的特权级。例如,其值为0时,为最高特权级,可能执行任何指令,如关中断。
2025-11-24 10:30:48
495
原创 操作系统中两个任务切换的原理
根据手册中要求,切换到特权级的要求,还需要专门为特权级0模式下的代码运行提供单独的栈空间,因此代码中增加了task?有了TSS结构之后,CPU从一个任务切换到另一个任务运行时,就只需要用到JMP TSS来实现。这里的任务其实更像是在Windows/Linux平台上编程时的线程,两个线程共享相同的地址空间,并且可能同时各自运行自己的程序。这样,每个任务都可以只关心自己的存在,而不需要知道其它任务的存在。为了实现两个任务能同时运行,就需要实现强制打断CPU的执行工作,让CPU转而去执行另一个任务的代码。
2025-11-24 10:24:16
263
原创 I2C协议解析
当从设备需要更多时间处理数据(如执行内部操作或响应延迟),可通过拉低SCL线(clock stretching)强制主设备进入等待状态,直到从设备释放SCL线恢复通信。SCL:串行时钟线,提供时钟信号。同步串行半双工通信协议。
2025-11-16 13:38:33
243
原创 UART串口通信解析
通用异步收发器Universal Asynchronous Receiver and Transmitter:UART就是两根线(TX 和 RX),一边发一边收,不用时钟线,你说一句,我听一句,咱俩靠约定好的节奏通话。ARM机器将内存中的数据放置在FIFO中,UART将FIFO中的数据放置在移位器中,移位器逐位通过TxD发送。它只能检错,不能纠错。串口COM4,波特率115200,数据位8,停止位1,校验位None,流控Xon/Xoff。波特率115200,8数据位,没有校验位,1个停止位,
2025-11-16 13:34:52
1138
原创 git分支管理详解
假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了git又学会了其他!每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
2025-11-04 12:08:58
675
原创 git简介和常用方法
不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
2025-11-04 11:50:39
975
原创 通信的经典知识点和问题(3)
一个样本函数可以用频谱分析,得到这个频谱无意义,因为它无法反应整个随机过程。香农公式是扩频技术的基础,当信息传输率确定时,带宽和信噪比可以互换。带宽、信号功率、噪声功率。熵:(平均自信息)随机变量的每个可能取值的自信息的统计平均值,用来描述信源的平均不确定性。7. 香农三大定理(三个定理的内容也要记住,这应该是信息论最重要的内容了)离散傅里叶变换,针对的是离散的信号和频谱,是在频域上的分析。物理意义:当信号带宽和信噪比确定时,信息传输率不会大于某值。频谱分析针对的是确定信号,因为要满足狄利克雷条件。
2025-10-31 20:02:59
516
原创 通信的经典知识点和问题(2)
矩形波导不能穿TEM的原因:如果矩形波导内存在TEM波,则要求磁场应完全存在于导体的横截面内且为闭合的曲线。由于矩形波导中不存在传播方向的传导电流,则要求位移电流在传播方向上,即传播方向上有电场,这和矩形波导不存在传播方向上的电场、磁场矛盾。对电场有要求,电场只有垂直于传播方向的分量,磁场有垂直和平行传播方向的分量。引入冲激响应的原因:任意信号都可以分解为具有不同时延的冲激信号的叠加。TEM:电场和磁场分量都垂直于传播方向,在传播方向上没有电场和磁场。标准答案:对信号的所有频成分,系统的延时相同。
2025-10-31 20:00:44
393
原创 通信的经典知识点和问题
一个样本函数可以用频谱分析,得到这个频谱无意义,因为它无法反应整个随机过程。(5)拥塞控制:防止过多的数据注入网络,使网络中的路由器和链路不过载;和高数联系:高数讲过傅里叶级数,正是傅里叶级数的展开分解为我们研究信号做了铺垫。边发送边监听,遇冲则停,随机等待一段时间后再发送。(1)确认应答(ACK):确认号=序号+1,希望收到的下一个序号。带宽是脉冲长度(脉冲持续时间)的倒数,谱线间隔是周期的倒数。门函数也称矩形方波,傅里叶变换是一个Sa()函数。频谱分析针对的是确定信号,因为要满足狄利克雷条件。
2025-10-27 19:41:22
410
原创 用#if 0...#endif注释代码相较于/* .. */的优点
总结:#if 0...#endif更适合用于开启某个功能,比如用它功能控制。在大段屏蔽、需要频繁开关、或者内部已含注释/字符串的代码块里,#if 0 …#endif 是安全做法;*/ 只适用于短行、无嵌套、无内部注释的小段代码。*/ 不能嵌套自己,一旦里面再出现 /* 或 */,编译器看到的第一个 */ 就把外层注释提前结束,后面代码会被意外暴露,造成诡异的编译错误甚至编译通过但行为异常。*/ 也会把字符串里的 */ 当成注释结束符,导致同样的问题。第五点,不怕代码里带字符串/字符字面量里的 “*/”
2025-10-27 17:10:13
356
原创 c++最常用的几种设计模式
在 C++ 里,最“接地气”、面试问得最多、代码里真正天天能见到的,其实集中在下面 6 种。掌握它们就能覆盖 80% 的日常设计场景。表格复制。
2025-10-14 15:29:14
527
原创 社会现实场景中“真实问题”解决例子
当主叫用户呼叫被叫用户,软交换收到主叫方来的呼叫后即到HLR查询用户属性,当查询到被叫用户具备非个性化彩铃业务属性时则呼叫进入特殊回铃音的控制流程:软交换首先将呼叫接续到被叫市话局,在被叫市话局回送表示用户空闲的信令时,软交换申请特殊回铃音播放端口,并与特殊回铃音关联起来,然后使主叫用户听默认特殊回铃音。充分使用交换的事件日记功能,通过配置网管的事件日记,来监控网络中的异常行为,为网络管理人员在网络安全方法提供强有力的排错及查询能力,跟踪网络的异常行为来源。如何解决彩铃业务的网络资源不足的问题?
2025-09-26 17:36:59
513
原创 解码Android 系统蓝牙音频全流程
视频格式:MP4(H.264编码) 压缩效率高:MP4使用H.264编码,能显著减小视频文件体积,适合蓝牙传输的低带宽场景。兼容性好:几乎所有安卓设备原生支持解码MP4格式,无需额外依赖。分包传输友好:文件结构支持分块读取和重组。3GP:专为移动设备设计,体积更小,但画质较低。视频压缩策略降低分辨率:将视频分辨率压缩至160×120或者更低,减少文件体积。降低帧率:5-10fps,平衡流畅度和体积。调整码率:使用较低的比特率(64-128kbps),但需确保画面不明显卡顿。
2025-09-26 17:33:20
1479
原创 论文研读:mmPoint: Dense Human Point Cloud Generation from mmWave
以一个N×3的点云P作为输入,lift可以将点的数量增加r倍得到P′ Deform:预测得到位移张量∆P′,输出变形点云P′′= P′+∆P′,使其接近真值。在生成的3D网格上采样3D点,最后得到密集的人类点云。输入的点云和信号首先通过由雷达信号编码器和点云编码器组成的多模态编码器(MME)转换成特征表示向量。核心思想:(a)将毫米波雷达信号产生点云的问题表述为点云的变形问题。输入:预先定义的点云模板和单帧毫米波雷达信号Im 输出:模板点云到目标点云的偏差,从而得到人体形状的密集点云Q。
2025-09-25 15:04:38
541
原创 论文研读:HuPR :A Benchmark for Human Pose Estimation Using Millimeter Wave Radar
图卷积网络(GCN) 传统卷积神经网络中的卷积操作只能处理规则的数据结构,例如卷积神经网络处理图像领域的数据、N循环神经网络处理语言序列数据。但是现实有很多不规则的数据结构,典型的就是图结构,或称拓扑结构。图结构是十分不规则的,传统的CNN、RNN无法处理。所以需要GCN处理。
2025-09-25 14:51:25
1395
原创 一种基于 IWR6843 雷达的跌倒检测系统的设计和实现
传统的雷达方案主要利用了人在跌倒过程中的速度变化特征(Doppler signature),首先对雷达回波信号进行时-频域的联合变换,然后从中提取出和跌倒有关的特征,最后通过模型分类器来判断是否跌倒。基于 TI 提供的IWR6843 3D people counting,采用了基于人员点云高度变化判断跌倒的高效算法,可以在室内环境中检测出人员的跌倒。通过速度信息来区别人和室内其他的静止物体 (比如桌子,床等),速度分辨率越高雷达就越容易把人从室内复杂的环境中提取出来,并生成更多的点云进行跌倒检测。
2025-09-25 11:22:16
581
原创 论文精读:mmDrive: Fine-grained Fatigue Driving Detection Using mmWave Radar
信号预处理:从雷达信号中检测驾驶员的运动状态,并降低噪声。身体区域分离:分离从不同身体区域反射的信号。疲劳特征检测:检测点头、打哈欠、眨眼的存在,并估计眨眼率、ECD、呼吸率和心率。疲劳测定:将检测到的特征输入到疲劳确定算法中以决定驾驶员是否处于疲劳状态。
2025-09-24 22:00:40
1673
原创 论文精读:3D Self-Localization of Drones using a Single Millimeter-Wave Anchor 无人机在黑暗室内的精准定位
麻省理工学院的研究人员开发出了一种新方法,能让无人机在室内、黑暗以及低能见度环境中实现自主定位,研究人员开发的这个系统名为“MiFly”,在这个系统中,无人机借助射频波,通过放置在周围环境中的单个标签反射的信号,就能实现自主定位。文章介绍了一种名为MiFly的无人机自主定位系统,该系统能够在室内和室外环境中,包括低能见度、黑暗和GPS信号被阻断的情况下,实现6自由度(6DoF)的自我定位。MiFly通过利用单个毫米波锚点来实现这一功能。
2025-09-24 21:46:56
917
原创 C++类型转换:static_cast、const_cast、reinterpret_cast、dynamic_cast
C++提供了四种类型转换操作符替代C风格强制转换:static_cast用于基础类型转换和继承体系向上转换,编译时检查;dynamic_cast用于多态类安全向下转型,运行时检查;const_cast用于修改const/volatile属性;reinterpret_cast用于底层位操作和指针转换,风险最高。这些转换操作符比C风格转换更安全明确,应优先使用。
2025-09-11 10:54:52
1046
原创 函数指针的用法
函数的二进制代码存放在内存四区中的代码段,函数的地址是它在内存中的起始地址。如果把函数的 地址作为参数传递给函数,就可以在函数中灵活的调用其它函数。声明普通指针时,必须提供指针的类型。同样,声明函数指针时,也必须提供函数类型,函数的类型。pfa、pfb、pfc 是函数指针名,必须用括号,否则就成了返回指针的函数。b)让函数指针指向函数的地址;(*函数指针名)(实参);c)通过函数指针调用函数。函数名就是函数的地址。(函数名和形参名不是)函数指针名=函数名;函数指针名(实参);
2025-09-11 10:29:36
258
原创 ELF文件的组成格式的详细介绍
节是 ELF 文件中的基本组成单位,它包含了特定类型的数据。ELF 文件的各种信息和数据都存储在不同的节中,如代码节存储了可执行代码,数据节存储了全局变量和静态数据等。每个节头表条目描述了一个节的属性和位置信息,如节的名称、类型、大小、在文件中的偏移等。ELF文件的开头是一个固定大小的ELF头部,它包含了文件的基本信息和属性,如ELF文件的类型、目标体系结构、入口点地址、程序头表和节头表的偏移和大小。符号表是一个特殊的节,它包含了程序中定义和引用的符号(如变量、函数等)的信息,如符号的名称、类型、地址等。
2025-09-10 22:02:21
415
原创 编写cmakelists文件常用语句
aux_source_directory(路径 变量名) 搜索路径下的源文件,存储到变量,${ }取值。add_library(库名字 STATIC/SHARED 源文件) 制作静态库/动态库,名字为lib+库名字+.a/so。target_link_libraries(可执行程序名 动态库名字) 程序链接动态库/静态库。link_directories( path ) 若静态库/动态库不是系统的,需要将路径指定出来。set(MAIN_EXEC_NAME dwarf_parser) 定义变量。
2025-09-10 21:59:41
466
原创 C 语言链表数据结构
链表是 C 语言中一种常用且灵活的数据结构,它通过节点的链接方式存储数据元素。每个节点包含数据域和指向下一个节点的指针域。与数组不同,链表在内存中并非连续分配空间,这种独特的存储方式赋予链表诸多优势,如动态扩展性强、插入删除操作高效等。int data;// 数据域,可根据实际需求定义类型// 指针域,指向下一个节点} Node;int data;// 指向后继节点// 指向前驱节点} Node;
2025-08-08 21:38:51
421
原创 Linux异常与信号处理
信号是一种进程间通信的机制,信号都有一个默认的处理行为,对应于某种系统事件。完整流程:os发送信号,pending位置写入,处理信号的时候先到pending的位图中找1,找到了再查看block位图中对应信号位置是否为1,若为1,则不进行当前位信号的后续处理,为0才去handler中执行后续处理操作。异常模块实现功能:在系统平台发生异常时,对异常进行截获,保存异常现场信息,定位异常的发生点,对异常进程的堆栈进行回溯分析以获取异常时的函数调用关系,提供应用层函数调用接口以自定义开发的异常处理策略。
2025-07-22 12:24:09
1206
1
原创 Linux常用命令大全:快速掌握30个核心技巧
(1)chmod u/g/a/a +/-/= r/w/x 文件/目录。/dev:类似于Windows的设备管理器,把所有硬件用文件形式存储,管理诸如CPU、硬盘登设备。/media:linux系统会自动识别一些设备,如u盘、光驱,识别后将这些设备挂载到该目录下。/boot:存放启动linux系统时使用的一些核心文件,包括一些连接文件与镜像文件。/lib:系统开机所需的基本动态链接共享库,其作用类似windows的dll文件。/usr:存放用户的应用程序和文件。
2025-07-14 10:05:51
566
原创 C++面向对象编程核心指南
3 复制构造函数(也称为拷贝构造函数) 复制构造函数参数为类对象本身的引用,用于根据一个已存在的对象复制出一个新的该类的对象,一般在函数中会将已存在对象的数据成员的值复制一份到新创建的对象中 , 若没有显示的写复制构造函数,则系统会默认创建一个复制构造函数,但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险。在C++中,继承就是在一个已存在的类的基础上建立一个新的类,已存在的类成为基类,又成为父类;新建立的类成为派生类,又称为子类。(6)运算符函数可以是类的成员函数,也可以是类的友员函数。
2025-07-10 16:34:28
681
原创 git打补丁的方法
当你在git中提交代码变更时,git会生成一个包含了所有修改的文件的patch文件,并将其保存在提交的历史记录中。这样,其他开发者可以通过查看patch文件来了解代码的变更内容,也可以应用patch文件来将代码变更应用到自己的代码库中。在Git中,git diff命令主要用于显示工作目录和暂存区(也就是git add命令将要提交的文件)之间的差异,或者两个不同版本之间的差异。想生成一个patch文件,即一个可以应用这些更改的文本文件,可以使用git diff命令结合--patch选项。
2025-07-10 15:35:02
664
通信实验课程-移动通信技术的实践研究:从理论到实操的全面解析
2025-03-24
讲述了计算机网络实验的多个方面,包括从基础的网线制作到高级的路由协议配置和网络安全控制等
2025-03-24
通信系统综合实验,使用SystemView仿真软件进行的设计与仿真
2025-03-24
基于C语言的程序设计实验:学生成绩管理、订票系统及五子棋游戏的实现与实践
2025-03-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅