- 博客(55)
- 收藏
- 关注
原创 C/C++ 内存分配函数详解
由于交换空间(Swap Space),当物理内存不足时,操作系统会将一些不常用的物理页面移动到磁盘上的交换空间,从而腾出物理内存给需要的页面。当程序再次访问被换出的页面时,操作系统会将其从磁盘换入物理内存(可能需要换出其他页面)。因此,1.2G的虚拟内存中,只有一部分(最近被访问的)放在物理内存中,其余部分可能放在交换空间中。真正的限制是虚拟地址空间大小和交换空间大小,而不仅仅是物理内存大小。操作系统为每个进程提供的虚拟地址空间(通常很大,如32位系统4GB,64位系统更大),地址空间布局为。
2025-12-17 21:42:53
243
原创 C语言关键字详解
本文总结了C/C++中五个关键关键字的主要特性:1) static用于修饰变量/函数的存储周期和作用域;2) const定义常量,提供类型安全;3) volatile防止编译器优化变量访问;4) sizeof计算数据类型内存大小;5) register建议变量存储在寄存器中。重点对比了const与#define的区别,以及sizeof与strlen的不同特性,并分析了各关键字的使用场景和注意事项。这些关键字在变量声明、内存管理和性能优化等方面具有重要作用。
2025-12-17 21:13:41
544
原创 程序的特权级机制
x86提供了特权级机制,用于将不同的代码划分成不同的特权级。其中操作系统运行于最高特权级0,可以执行很多系统指令,如开关中断等。而应用程序工作在最低特权级模式3,只能执行不需要特权的代码。在计算机上电启动进入保护模式后,默认为特权级0。手册中有给出权限相关的详细说明,这里只是简单的略做简介。如下图所示,CPU当前运行的程序位于CS指向的代码段,因此CS的最低两位CPL就代表了当前程序所具备的特权级。例如,其值为0时,为最高特权级,可能执行任何指令,如关中断。
2025-11-24 10:30:48
437
原创 操作系统中两个任务切换的原理
根据手册中要求,切换到特权级的要求,还需要专门为特权级0模式下的代码运行提供单独的栈空间,因此代码中增加了task?有了TSS结构之后,CPU从一个任务切换到另一个任务运行时,就只需要用到JMP TSS来实现。这里的任务其实更像是在Windows/Linux平台上编程时的线程,两个线程共享相同的地址空间,并且可能同时各自运行自己的程序。这样,每个任务都可以只关心自己的存在,而不需要知道其它任务的存在。为了实现两个任务能同时运行,就需要实现强制打断CPU的执行工作,让CPU转而去执行另一个任务的代码。
2025-11-24 10:24:16
197
原创 I2C协议解析
当从设备需要更多时间处理数据(如执行内部操作或响应延迟),可通过拉低SCL线(clock stretching)强制主设备进入等待状态,直到从设备释放SCL线恢复通信。SCL:串行时钟线,提供时钟信号。同步串行半双工通信协议。
2025-11-16 13:38:33
196
原创 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
1019
原创 git分支管理详解
假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了git又学会了其他!每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
2025-11-04 12:08:58
636
原创 git简介和常用方法
不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
2025-11-04 11:50:39
937
原创 通信的经典知识点和问题(3)
一个样本函数可以用频谱分析,得到这个频谱无意义,因为它无法反应整个随机过程。香农公式是扩频技术的基础,当信息传输率确定时,带宽和信噪比可以互换。带宽、信号功率、噪声功率。熵:(平均自信息)随机变量的每个可能取值的自信息的统计平均值,用来描述信源的平均不确定性。7. 香农三大定理(三个定理的内容也要记住,这应该是信息论最重要的内容了)离散傅里叶变换,针对的是离散的信号和频谱,是在频域上的分析。物理意义:当信号带宽和信噪比确定时,信息传输率不会大于某值。频谱分析针对的是确定信号,因为要满足狄利克雷条件。
2025-10-31 20:02:59
462
原创 通信的经典知识点和问题(2)
矩形波导不能穿TEM的原因:如果矩形波导内存在TEM波,则要求磁场应完全存在于导体的横截面内且为闭合的曲线。由于矩形波导中不存在传播方向的传导电流,则要求位移电流在传播方向上,即传播方向上有电场,这和矩形波导不存在传播方向上的电场、磁场矛盾。对电场有要求,电场只有垂直于传播方向的分量,磁场有垂直和平行传播方向的分量。引入冲激响应的原因:任意信号都可以分解为具有不同时延的冲激信号的叠加。TEM:电场和磁场分量都垂直于传播方向,在传播方向上没有电场和磁场。标准答案:对信号的所有频成分,系统的延时相同。
2025-10-31 20:00:44
345
原创 通信的经典知识点和问题
一个样本函数可以用频谱分析,得到这个频谱无意义,因为它无法反应整个随机过程。(5)拥塞控制:防止过多的数据注入网络,使网络中的路由器和链路不过载;和高数联系:高数讲过傅里叶级数,正是傅里叶级数的展开分解为我们研究信号做了铺垫。边发送边监听,遇冲则停,随机等待一段时间后再发送。(1)确认应答(ACK):确认号=序号+1,希望收到的下一个序号。带宽是脉冲长度(脉冲持续时间)的倒数,谱线间隔是周期的倒数。门函数也称矩形方波,傅里叶变换是一个Sa()函数。频谱分析针对的是确定信号,因为要满足狄利克雷条件。
2025-10-27 19:41:22
356
原创 用#if 0...#endif注释代码相较于/* .. */的优点
总结:#if 0...#endif更适合用于开启某个功能,比如用它功能控制。在大段屏蔽、需要频繁开关、或者内部已含注释/字符串的代码块里,#if 0 …#endif 是安全做法;*/ 只适用于短行、无嵌套、无内部注释的小段代码。*/ 不能嵌套自己,一旦里面再出现 /* 或 */,编译器看到的第一个 */ 就把外层注释提前结束,后面代码会被意外暴露,造成诡异的编译错误甚至编译通过但行为异常。*/ 也会把字符串里的 */ 当成注释结束符,导致同样的问题。第五点,不怕代码里带字符串/字符字面量里的 “*/”
2025-10-27 17:10:13
290
原创 c++最常用的几种设计模式
在 C++ 里,最“接地气”、面试问得最多、代码里真正天天能见到的,其实集中在下面 6 种。掌握它们就能覆盖 80% 的日常设计场景。表格复制。
2025-10-14 15:29:14
400
原创 社会现实场景中“真实问题”解决例子
当主叫用户呼叫被叫用户,软交换收到主叫方来的呼叫后即到HLR查询用户属性,当查询到被叫用户具备非个性化彩铃业务属性时则呼叫进入特殊回铃音的控制流程:软交换首先将呼叫接续到被叫市话局,在被叫市话局回送表示用户空闲的信令时,软交换申请特殊回铃音播放端口,并与特殊回铃音关联起来,然后使主叫用户听默认特殊回铃音。充分使用交换的事件日记功能,通过配置网管的事件日记,来监控网络中的异常行为,为网络管理人员在网络安全方法提供强有力的排错及查询能力,跟踪网络的异常行为来源。如何解决彩铃业务的网络资源不足的问题?
2025-09-26 17:36:59
437
原创 解码Android 系统蓝牙音频全流程
视频格式:MP4(H.264编码) 压缩效率高:MP4使用H.264编码,能显著减小视频文件体积,适合蓝牙传输的低带宽场景。兼容性好:几乎所有安卓设备原生支持解码MP4格式,无需额外依赖。分包传输友好:文件结构支持分块读取和重组。3GP:专为移动设备设计,体积更小,但画质较低。视频压缩策略降低分辨率:将视频分辨率压缩至160×120或者更低,减少文件体积。降低帧率:5-10fps,平衡流畅度和体积。调整码率:使用较低的比特率(64-128kbps),但需确保画面不明显卡顿。
2025-09-26 17:33:20
1240
原创 论文研读: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
455
原创 论文研读:HuPR :A Benchmark for Human Pose Estimation Using Millimeter Wave Radar
图卷积网络(GCN) 传统卷积神经网络中的卷积操作只能处理规则的数据结构,例如卷积神经网络处理图像领域的数据、N循环神经网络处理语言序列数据。但是现实有很多不规则的数据结构,典型的就是图结构,或称拓扑结构。图结构是十分不规则的,传统的CNN、RNN无法处理。所以需要GCN处理。
2025-09-25 14:51:25
1265
原创 一种基于 IWR6843 雷达的跌倒检测系统的设计和实现
传统的雷达方案主要利用了人在跌倒过程中的速度变化特征(Doppler signature),首先对雷达回波信号进行时-频域的联合变换,然后从中提取出和跌倒有关的特征,最后通过模型分类器来判断是否跌倒。基于 TI 提供的IWR6843 3D people counting,采用了基于人员点云高度变化判断跌倒的高效算法,可以在室内环境中检测出人员的跌倒。通过速度信息来区别人和室内其他的静止物体 (比如桌子,床等),速度分辨率越高雷达就越容易把人从室内复杂的环境中提取出来,并生成更多的点云进行跌倒检测。
2025-09-25 11:22:16
391
原创 论文精读:mmDrive: Fine-grained Fatigue Driving Detection Using mmWave Radar
信号预处理:从雷达信号中检测驾驶员的运动状态,并降低噪声。身体区域分离:分离从不同身体区域反射的信号。疲劳特征检测:检测点头、打哈欠、眨眼的存在,并估计眨眼率、ECD、呼吸率和心率。疲劳测定:将检测到的特征输入到疲劳确定算法中以决定驾驶员是否处于疲劳状态。
2025-09-24 22:00:40
1524
原创 论文精读:3D Self-Localization of Drones using a Single Millimeter-Wave Anchor 无人机在黑暗室内的精准定位
麻省理工学院的研究人员开发出了一种新方法,能让无人机在室内、黑暗以及低能见度环境中实现自主定位,研究人员开发的这个系统名为“MiFly”,在这个系统中,无人机借助射频波,通过放置在周围环境中的单个标签反射的信号,就能实现自主定位。文章介绍了一种名为MiFly的无人机自主定位系统,该系统能够在室内和室外环境中,包括低能见度、黑暗和GPS信号被阻断的情况下,实现6自由度(6DoF)的自我定位。MiFly通过利用单个毫米波锚点来实现这一功能。
2025-09-24 21:46:56
808
原创 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
986
原创 函数指针的用法
函数的二进制代码存放在内存四区中的代码段,函数的地址是它在内存中的起始地址。如果把函数的 地址作为参数传递给函数,就可以在函数中灵活的调用其它函数。声明普通指针时,必须提供指针的类型。同样,声明函数指针时,也必须提供函数类型,函数的类型。pfa、pfb、pfc 是函数指针名,必须用括号,否则就成了返回指针的函数。b)让函数指针指向函数的地址;(*函数指针名)(实参);c)通过函数指针调用函数。函数名就是函数的地址。(函数名和形参名不是)函数指针名=函数名;函数指针名(实参);
2025-09-11 10:29:36
234
原创 ELF文件的组成格式的详细介绍
节是 ELF 文件中的基本组成单位,它包含了特定类型的数据。ELF 文件的各种信息和数据都存储在不同的节中,如代码节存储了可执行代码,数据节存储了全局变量和静态数据等。每个节头表条目描述了一个节的属性和位置信息,如节的名称、类型、大小、在文件中的偏移等。ELF文件的开头是一个固定大小的ELF头部,它包含了文件的基本信息和属性,如ELF文件的类型、目标体系结构、入口点地址、程序头表和节头表的偏移和大小。符号表是一个特殊的节,它包含了程序中定义和引用的符号(如变量、函数等)的信息,如符号的名称、类型、地址等。
2025-09-10 22:02:21
372
原创 编写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
421
原创 C 语言链表数据结构
链表是 C 语言中一种常用且灵活的数据结构,它通过节点的链接方式存储数据元素。每个节点包含数据域和指向下一个节点的指针域。与数组不同,链表在内存中并非连续分配空间,这种独特的存储方式赋予链表诸多优势,如动态扩展性强、插入删除操作高效等。int data;// 数据域,可根据实际需求定义类型// 指针域,指向下一个节点} Node;int data;// 指向后继节点// 指向前驱节点} Node;
2025-08-08 21:38:51
375
原创 Linux异常与信号处理
信号是一种进程间通信的机制,信号都有一个默认的处理行为,对应于某种系统事件。完整流程:os发送信号,pending位置写入,处理信号的时候先到pending的位图中找1,找到了再查看block位图中对应信号位置是否为1,若为1,则不进行当前位信号的后续处理,为0才去handler中执行后续处理操作。异常模块实现功能:在系统平台发生异常时,对异常进行截获,保存异常现场信息,定位异常的发生点,对异常进程的堆栈进行回溯分析以获取异常时的函数调用关系,提供应用层函数调用接口以自定义开发的异常处理策略。
2025-07-22 12:24:09
1133
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
547
原创 C++面向对象编程核心指南
3 复制构造函数(也称为拷贝构造函数) 复制构造函数参数为类对象本身的引用,用于根据一个已存在的对象复制出一个新的该类的对象,一般在函数中会将已存在对象的数据成员的值复制一份到新创建的对象中 , 若没有显示的写复制构造函数,则系统会默认创建一个复制构造函数,但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险。在C++中,继承就是在一个已存在的类的基础上建立一个新的类,已存在的类成为基类,又成为父类;新建立的类成为派生类,又称为子类。(6)运算符函数可以是类的成员函数,也可以是类的友员函数。
2025-07-10 16:34:28
651
原创 git打补丁的方法
当你在git中提交代码变更时,git会生成一个包含了所有修改的文件的patch文件,并将其保存在提交的历史记录中。这样,其他开发者可以通过查看patch文件来了解代码的变更内容,也可以应用patch文件来将代码变更应用到自己的代码库中。在Git中,git diff命令主要用于显示工作目录和暂存区(也就是git add命令将要提交的文件)之间的差异,或者两个不同版本之间的差异。想生成一个patch文件,即一个可以应用这些更改的文本文件,可以使用git diff命令结合--patch选项。
2025-07-10 15:35:02
605
原创 揭秘内存越界与泄露:高效维测实战指南
内存作为操作系统最基础的最复杂模块之一,其错误的使用常常会引发各类问题。针对内存使用越界以及内存泄露有专项维测,但是很多人对内存越界相关维测并不熟悉,无法对现有日志进行有效分析并应用到实际编码测试环节,进而无法针对内存使用进行重点测试和有效防护。
2025-07-10 15:27:29
875
原创 GDB调试详细参考手册
GDB是UNIX及UNIX-like下的强大调试工具,可调式C、C++等多种语言。它可以帮助我们以自己的方式调试程序并且在想暂停的位置暂停运行,并查看程序运行状况,帮助我们定位问题。命令汇总:把源文件filename编译为可调试文件outputfilenamegdb 文件名查看文件是否可调式readelf -S 文件名 |grep dubug查看文件是否可调式启动gdb调试工具,-q可减少输出信息run (r)运行不带参程序运行带参程序运行带参程序attach 进程id。
2025-07-10 15:21:31
1070
原创 C/S模型-TCP
因此,服务器从accept()返回后立刻调用read(),读socket就像读管道一样,如果没有数据到达就阻塞等待,这时客户端调用write()发送请求给服务器,服务器收到后从read()返回,对客户端的请求进行处理,在此期间客户端调用read()阻塞等待服务器的应答,服务器调用write()将处理结果发回给客户端,再次调用read()阻塞等待下一条请求,客户端收到后从read()返回,发送下一条请求,如此循环下去。注意,任何一方调用close()后,连接的两个传输方向都关闭,不能再发送数据了。
2025-03-19 15:52:42
503
原创 Google C++编码规范指南(含pdf)
**`struct` 与 `class` 的区别**:仅当类仅包含数据成员且无行为时使用 `struct`,其他情况一律使用 `class`(例如:`struct Point { int x, y;- **智能指针**:推荐使用 `std::unique_ptr` 或 `std::shared_ptr` 管理动态内存,避免原始指针直接操作。- **成员声明顺序**:类内成员按 `public`、`protected`、`private` 顺序声明,函数在数据成员之前。
2025-03-19 15:42:00
1552
原创 一句话总结一种排序算法,精炼
常见的应该包括冒泡、选择、插入、快速、归并、堆排序、希尔、计数、桶排序和基数排序这些。:选一个基准,将数组分为“小基准”和“大基准”两部分,递归处理子数组。:构建最大堆,每次取堆顶元素(最大值),再调整堆结构,重复直到有序。:两两比较相邻元素,每次循环将最大的元素“冒泡”到末尾。:将元素分到多个有序的桶中,桶内排序后按顺序合并所有桶。:冒泡(相邻交换)、快速(基准分治)。:选择(挑最小)、堆排序(堆顶最大)。:归并(拆了再合)、快速(分基准)。:插入(直接插)、希尔(分组插)。具体细节可见我的另一个文章。
2025-02-11 10:41:43
617
原创 C++命名空间
如果声明区域有相同的名字,局部版本将隐藏命名空间中的名字,不过,可以使用域名解析符使用命名空间中的名称。在实际开发中,较大型的项目会使用大量的全局名字,如类、函数、模板、变量等,很容易出现名字冲突的情况。)不要在头文件中使用using编译指令,如果非要使用,应将它放在所有的#include之后。在同一命名空间内的名字可以直接访问,该命名空间之外的代码则必须明确指出命名空间。命名空间分割了全局空间,每个命名空间是一个作用域,防止名字冲突。)匿名的命名空间,从创建的位置到文件结束有效。)命名空间可以嵌套。
2025-02-02 16:00:54
219
原创 C/C++中整数的书写(不同进制的书写)
注意,C++标准并不支持上面的二进制写法,只是有些编译器自己进行了扩展,才支持二进制数字。换句话说,并不是所有的编译器都支持二进制数字,只有一部分编译器支持,并且跟编译器的版本有关系。十六进制由数字 0~9、字母 A~F 或 a~f(不区分大小写)组成,书写时必须以0x或0X(不区分大小写)开头。八进制由 0~7 八个数字组成,书写时必须以0开头(注意是数字 0,不是字母 o)。整数默认是十进制,一个表示十进制的数字不需要任何特殊的格式。在C++中,不要在十进制数前面加0,会被编译器当成八进制。
2025-02-02 15:54:18
561
原创 C++内存模型(四个区)
是否产生碎片:对于栈来说,进栈和出栈都有着严格的顺序(先进后出),不会产生碎片;而堆频繁的分配和释放,会造成内存空间的不连续,容易产生碎片,太多的碎片会导致性能的下降。)分配效率不同:栈是系统提供的数据结构,计算机在底层提供了对栈的支持,进栈和出栈有专门的指令,效率比较高;)管理方式不同:栈是系统自动管理的,在出作用域时,将自动被释放;堆需手动释放,若程序中不释放,程序结束时由操作系统回收。)增长方向不同:栈向下增长,以降序分配内存地址;存储可执行程序的代码和常量(例如字符常量),此存储区不可修改。
2025-02-01 15:08:24
327
原创 深度学习练手小例子——cifar10数据集分类问题
测试集的loss:210.63251876831055,准确率:0.5252999663352966。测试集的loss:202.65885722637177,准确率:0.5475999712944031。测试集的loss:195.93554836511612,准确率:0.5615000128746033。测试集的loss:184.76930475234985,准确率:0.5831999778747559。测试集的loss:176.2480058670044,准确率:0.6036999821662903。
2025-02-01 15:00:48
1251
1
原创 Linux系统下配置防火墙
常用服务的端口:ssh(22)、HTTP(80、8080)、MySQL(3306)、Oracle(1521)、ftp(21)、)查看防火墙已开通的服务(CentOS缺省开通ssh和dhcpv6-client服务)。)重新加载防火墙配置参数(修改配置后要重新加载防火墙配置或重启防火墙服务)。)查看防火墙服务状态(普通用户可执行),CentOS缺省启用防火墙。)查看防火墙已开通的端口,CentOS缺省不开通任何端口。)查看防火墙支持的服务的列表(普通用户可执行)。)启动、重启、关闭防火墙服务。
2025-01-20 11:07:14
576
通信实验课程-移动通信技术的实践研究:从理论到实操的全面解析
2025-03-24
讲述了计算机网络实验的多个方面,包括从基础的网线制作到高级的路由协议配置和网络安全控制等
2025-03-24
通信系统综合实验,使用SystemView仿真软件进行的设计与仿真
2025-03-24
基于C语言的程序设计实验:学生成绩管理、订票系统及五子棋游戏的实现与实践
2025-03-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅