- 博客(428)
- 资源 (46)
- 收藏
- 关注

原创 项目中写代码的注意事项总结
1,c++中怎么使用c语言中声明的函数,c语言中使用c++中声明的函数;2,函数返回值一般用于返回错误码,不要用于直接返回函数的执行结果。3,有符号和无符号数据类型的混合运算,应注意类型转换;4,不要把子程序的参数用作工作变量,如果需要,另设一个临时变量来处理;5,项目中禁止直接使用全局变量,一般用set/get函数来实现对全局变量的读写;6,防止字符串拷贝时,存储空间不够,应保证有NULL结束符,既是在获取拷贝字符串时,应该意识到存储空间的大小,宁可截断,也不要越界。7,函数返回值
2021-04-24 22:24:38
1278
2
原创 寄存器被改写问题总结
B、之后去掉平台软件,使用特殊读写测试工具(增加多进程,提高光模块轮询速度)跟正常出机gpio版本,测试半小时后出现3台设备,个别端口出现端口down跟光模块访问显示异常情况,读光模块寄存器,确实发现有发送控制寄存器跟页寄存器被改写的情况,其中第3,4通道光模块出现概率较高;挂测业务过程中,发现端口会出现接口down的过程,读光模块信息发现模块信息被改写,切页寄存器和模块端口使能寄存器被改写,光模块的访问是通过gpio 模拟iic 访问的。软件有人操作寄存器,检查代码,发现没人操作端口使能寄存器。
2025-06-10 23:14:31
157
原创 linux 错误码总结
在Linux系统中,当一个系统调用或库函数执行失败时,除了返回特定的错误值(如-1或NULL)外,还会通过。在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。Linux系统定义了一系列错误码宏,每个错误码对应一个特定的错误类型。的值在每次系统调用或函数调用失败时会被更新,而成功调用则可能不会修改。由操作系统维护,保存最近一次发生的错误信息。的值,确定具体发生了什么错误,并采取相应的处理措施。2,错误码与程序错误处理的关系。3,常见错误码及其含义。
2025-06-10 23:13:42
92
原创 c语言面试之使用函数指针实现一个通用的冒泡排序
本文展示了一个通用冒泡排序算法的C语言实现。该算法通过typedef定义比较函数指针类型CompareFunc,实现了对不同数据类型(整数、浮点数、字符串)的排序功能。bubbleSort函数使用void指针和元素大小参数实现通用性,并通过字节交换完成元素位置调整。测试部分分别对整数数组{5,2,8,1,3}、浮点数组{5.5,2.2,8.8,1.1,3.3}和字符串数组{"banana","apple"...}进行排序验证,输出各自的排序结果。该实现体现了C语言指针和内存操作的灵活性,展示了通用算法设计方
2025-06-09 12:03:06
94
原创 linux cgroup内存/io/cpu/网络使用总结
cgroups是Linux内核提供的一种可以限制、记录和隔离进程组使用的物理资源(如CPU、内存,io,网络等)的机制。
2025-06-09 12:02:35
1059
原创 ds280 phy芯片调式总结
DS125/DS280芯片配置需通过I2C访问寄存器,重点包括通道选择、速率设置及复位操作。配置时需匹配硬件端口与通道映射,参考手册设置CFE/DFE/CTLE参数。若寄存器未生效,需检查写后读校验、初始化时序及延时合理性,建议在每次配置前复位芯片。测试流程通过I2C命令读写寄存器并验证数据一致性,针对速率不生效问题,可优化延时、增加校验或复位后重配置寄存器。
2025-06-08 08:28:40
132
2
原创 linux 内存meminfo分析(内存水位线和内存回收机制分析)
Linux 提供了多个与虚拟内存管理相关的参数,这些参数可以通过 /proc/sys/vm/ 文件系统进行调整,从而影响内存回收行为,内存水位用于监控和管理系统的空闲内存,cat /proc/zoneinfo可查看内存水位线。
2025-06-08 08:26:59
538
原创 linux进程管理之从内存/cpu角度使用setrlimirt/rlimit
因此,如果栈指针尝试移动到超过RLIMIT_STACK设置的地址以下的位置,它会触发SIGSEGV。其他的RLIMIT_CPU,RLIMIT_FSIZE,RLIMIT_DATA使用方法类似。信号 ,在许多系统中,栈是从高地址向低地址增长的,栈指针指向栈顶。时,内核会在栈底设置保护页(Guard Page),触发访问时抛出。RLIMIT_STACK可能设置了一个最大地址,栈不能超过该地址。1,setrlimirt/rlimit的使用。# 查看系统日志中的OOM Killer记录。使用时需要设置相关参数。
2025-06-07 14:54:58
273
原创 linux 用户态时间性能优化工具perf/strace/gdb/varlind/gprof
本文介绍了Linux环境下五种常用的程序性能分析工具:1)使用perf top分析CPU占用高的函数;2)通过gdb的info proc stat查看进程时间信息;3)利用strace的-tt和-c选项跟踪系统调用耗时;4)valgrind callgrind工具生成函数调用图;5)gprof统计函数调用次数和时间。这些工具分别从不同维度(CPU、系统调用、内存、函数调用等)帮助开发者定位性能瓶颈,其中perf适合分析CPU使用,strace专注系统调用,valgrind侧重内存分析,gprof提供函数级统
2025-06-07 14:52:24
617
原创 linux 的devmem2 调式使用说明
中的数据变化,以此来检测驱动中对内存或者相关配置的正确性验证。devmem2的方式是提供给驱动开发人员,在应用层能够侦测。安装成功后会有/dev/mem 这个目录。
2025-06-02 19:37:56
1635
2
原创 linux用户态内存泄露问题从进程角度跟踪举例
本文通过测试程序test_malloc演示了Linux系统下内存泄漏的检测方法。程序每2秒分配10KB内存并赋值,通过ps命令观察到进程的VSZ(虚拟内存)从2.5MB增长到20MB,RSS(物理内存)从0.5MB增长到19MB,同时系统MemFree值减少了约20MB。文章详细介绍了通过/proc/meminfo、/proc/pid/statm和/proc/pid/status等文件监控内存使用情况的方法,包括如何解读进程的虚拟内存、物理内存、共享内存等关键指标.
2025-05-31 18:26:12
863
原创 linux nm/objdump/readelf/addr2line命令详解
本文以rk3568开发板为例,详细介绍了如何利用nm、objdump、readelf和addr2line工具分析Linux内核文件、动态库及.o文件。主要内容包括:1)addr2line定位内核函数地址对应源码位置,强调编译时需保留调试信息;2)readelf查看符号表信息;3)objdump反汇编分析函数调用关系;4)nm工具解析符号类型。文章还系统总结了各工具的核心参数和适用场景,如objdump的-d反汇编参数、nm的-C解码C++符号功能等,并演示了交叉编译环境下工具链的使用方法,为开发者提供了全面
2025-05-31 18:09:16
1200
原创 linux 内核态和用户态定时器函数使用总结
本文总结了Linux系统中的定时器类型及其适用场景,包括用户态和内核态的实现方式。用户态定时器分为传统信号定时器(秒级)和timerfd+epoll(纳秒级),分别适用于简单任务调度和高精度事件处理。内核态定时器包含timer_list(毫秒级)和hrtimer(微秒级),适用于设备驱动和实时系统。文中提供了具体代码示例:用户态实现日志监控、心跳包检测和传感器数据采集;内核态实现硬件寄存器监控和看门狗检测。最后展示了通过proc文件系统统计定时器事件的方法,为开发者提供了全面的定时器使用参考。
2025-05-26 03:04:38
341
原创 gcc编译优化参数-O0和-Os区别
GCC编译器优化级别选择指南:-O0适合调试阶段(关闭优化保留调试信息),-Os针对嵌入式场景优先减小代码体积。-O2是推荐级别(平衡性能与风险),-O3激进优化可能提升10-15%性能但增大体积。优化路径建议:参数优化→组件裁剪→系统精简→二进制压缩。内存对齐优化(如64字节对齐)可避免伪共享问题,匹配现代CPU缓存行特性。典型优化流程包括编译参数调整(如CFLAGS="-Os")和后期符号剥离(strip命令)。
2025-05-25 17:02:50
661
原创 linux 新增驱动宏config.in配置
本文摘要:介绍Linux内核中添加配置宏的两种方法。推荐方式是通过修改Kconfig文件,在相应子目录中添加bool或tristate类型的配置选项(如MY_SET_FEATURE),并设置默认值和帮助信息。旧版内核可使用config.in方式直接定义。修改后需运行make menuconfig更新.config文件,代码中可通过#ifdef检测宏是否启用
2025-05-25 16:41:06
240
原创 linux 内存碎片分析
本文分析了Linux系统内存管理的两个关键文件/proc/pagetypeinfo和/proc/zoneinfo的输出信息。/proc/pagetypeinfo显示了内存页面按迁移类型(不可移动、可移动、可回收等)和阶数(0-10)的分布情况,其中DMA32区域的可移动页块数量较多,而DMA区域则以不可移动页为主。/proc/zoneinfo则详细记录了各内存区域(DMA、DMA32)的状态,包括空闲页数、内存水位线、活动内存类型等,数据显示系统当前内存充足,但DMA32区域的slab不可回收内存较高,可能
2025-05-24 13:07:15
779
原创 linux taskset 查询或设置进程绑定CPU
本文介绍了Linux系统中CPU亲和性设置的方法。主要分为用户态和内核态两种方式:用户态可通过taskset工具或sched_setaffinity()函数绑定进程/线程到指定CPU核心,示例展示了查询CPU信息、修改进程亲和性等操作;内核态则需使用set_cpus_allowed_ptr()函数和cpumask操作。文章包含具体命令示例和代码片段,说明了如何将线程绑定到特定CPU核心,以及如何在内核模块中设置内核线程的CPU亲和性。
2025-05-24 12:05:34
484
原创 linux strace调式定位系统问题
strace是Linux系统调试工具,主要用于跟踪进程的系统调用和信号。其核心功能包括:监控系统调用(显示函数参数和返回值)、跟踪信号接收、分析调用耗时(-T/-tt参数)和统计调用次数(-c参数)。常用命令示例:跟踪指定函数(-e trace=function)、监控信号(-e trace=signal)、统计调用耗时(strace -T ls)以及输出调试信息(-d参数)。通过-p可附加到运行中的进程,-f可跟踪子进程。该工具能有效帮助开发者分析程序行为、定位性能瓶颈和调试异常问题。
2025-05-23 22:21:36
1092
原创 linux 内核warn_on/Bug_on
本文介绍了Linux内核中两种错误处理机制:warn_on()和bug_on()。warn_on()用于报告潜在问题,会打印警告信息和调用堆栈但允许继续执行;而bug_on()用于严重错误,会触发Oops并打印详细错误信息(包括调用堆栈),通常导致进程终止或系统崩溃。两者都通过条件判断触发,但处理方式不同:warn_on()记录警告后继续执行,bug_on()则终止执行并打印完整调试信息。文中通过代码示例展示了两种机制的具体使用场景和输出格式,并说明了如何通过串口、dmesg或系统日志获取这些调试信息。
2025-05-23 22:20:34
863
原创 linux hungtask detect机制分析
hungtaskdetect是Linux内核中用于检测长时间阻塞任务的机制,主要针对因死锁、死循环或资源竞争导致无法调度的任务。其核心目标是防止系统因单个任务阻塞而完全僵死,并提供诊断信息辅助排查问题。该机制通过内核线程khungtaskd定期扫描所有进程的task_struct结构体,检查任务是否处于TASK_UNINTERRUPTIBLE状态,并记录任务进入该状态的时间戳。若任务阻塞时长超过预设阈值(默认120秒),则触发警告并打印任务堆栈信息到内核日志。用户可以通过/proc/sys/kernel/下
2025-05-18 19:23:25
201
原创 linux oom panic重启代码跟踪
Linux系统在内存耗尽时会触发OOM(Out of Memory)Killer机制,通过终止进程释放内存。OOMKiller的行为可通过多个内核参数控制,如/proc/sys/vm/panic_on_oom决定是否触发系统崩溃,/proc/sys/vm/oom_kill_allocating_task决定是否直接杀死触发OOM的进程,/proc/<PID>/oom_score_adj调整进程的OOM优先级。OOMKiller根据进程的内存占用量、运行时间等计算oom_score,优先终止得分最高的进程。
2025-05-18 19:21:46
45
原创 linux perf top分析系统性能
本文介绍了在Linux系统中使用perf工具进行性能监控的步骤。首先,通过检查内核宏CONFIG_PERF_EVENTS和CONFIG_HAVE_PERF_EVENTS确认系统支持perf功能。在使用perf top时,若遇到权限问题,可以通过调整/proc/sys/kernel/perf_event_paranoid设置来解决。接着,安装调试符号表并更新系统,以确保perf能够正确解析符号。随后,使用perf top分析系统性能,识别CPU占用率较高的函数,并通过绑定CPU进一步细化分析。
2025-05-10 23:39:14
324
原创 bcm5482 phy 场景总结
BCM5482是一款双端口10/100/1000BASE-T以太网PHY芯片,支持多种速率和双工模式。其配置主要通过MDIO接口进行,该接口用于访问PHY芯片内部的寄存器,以配置网络速率、双工模式等参数。寄存器的配置与一般寄存器相似,包括0/1/4/5/9/a/11寄存器,此外还涉及影子寄存器的使用。相关技术文档可参考CSDN博客中的YT8614phy芯片调试纪要、marvel1548phy芯片调试、光模块调试总结以及SFP-8636QSFP光模块解析学习等内容。
2025-05-10 23:38:32
158
原创 linux netlink实现用户态和内核态数据交互
/ 获取发送者的 PID。// 目标为用户空间。运行insmod hello.ko。// 接收内核的回复。
2025-05-03 12:24:53
699
1
原创 linux unsigned int 和signed int 造成的数据翻转问题定位
我们一般使用相同类型的定义,比如将上面代码里面的unsigned int b 得定义改为int b。你可以通过显式地将unsigned int转换为int,或者将int转换为unsigned int,来控制结果的类型。:根据C和C++的标准,当不同类型的数值进行运算时,会进行类型提升。对于整型来说,如果其中一个操作数是。的值较大时,相加可能会导致溢出,从而产生未定义行为。为了保持一致性并避免这种潜在的问题,结果被转换为。如果你在乎符号并且想要避免无符号整数的行为,你可以检查int的符号,并相应地处理。
2025-05-03 12:24:23
183
原创 bcm5396数据交互过程
接口link ability状态。bcm5396到cpu接口的连接。bcm5396到phy的硬件连接。3,bcm5396芯片复位控制。cpu和bcm5396的连接。1,读取chip_id。2,设置和获取接口状态。
2025-04-21 10:28:15
187
原创 串口 IAP 升级
通过这一步设置,我们就可以在 MDK 编译成功之后,调用 fromelf.exe(注意,我的 MDK是安装在 D:toolMDKMDK5.23 文件夹下,如果你是安装在其他目录,请根据你自己的目录修改 fromelf.exe 的路径),根据当前工程的 LED.axf(如果是其他的名字,请记住修改,这个文件存放在 OBJ 目录下面,格式为 xxx.axf),生成一个 LED.bin 的文件。通过以上两个步骤的设置,我们就可以生成 APP 程序了,只要 APP 程序的 FLASH 大小不超过我们的设置即可。
2025-04-21 10:26:41
630
原创 rk3568 phy驱动框架
每个 phy 芯片会创建一个 struct phy_device 类型的设备,对应的有 struct phy_driver 类型的驱动,这两者实际上是挂载在 mdio_bus_type 总线上的,mac 会被注册成 struct net_device。代码路径:\rk356x-linux\kernel\drivers\net\phy ,RK 内部 EPHY 驱动代码 drivers/net/phy/rockchip.c。(1),phy_driver初始化phy_init。1,phy_devices结构体。
2025-04-20 00:52:13
361
原创 phy接口100M/1000M测试使用纪要
2,右击 Ethernet-001-10/100/1000 选择ping就可以了。1,仪表设置,选择protocols->protocol Interfaces。端口速率配置:将10.10.10.4改成10.10.10.3即可。4,在主控系统口上面show arp 查看是否有学习到。3,在主控端口下设置ip(10.10.10.4)仪表设置强制,100M业务通。
2025-04-20 00:50:41
65
原创 linux RCU技术
RCU(Read-Copy-Update)是Linux内核中的一种同步机制,用于在多核处理器环境中实现无锁读取和延迟更新。Linux RCU(Read-Copy-Update)技术通过一种高效的同步机制来处理并发冲突,确保在多核环境中读者和写者对共享数据的访问能够安全、高效地进行。RCU的核心思想是通过和。
2025-04-13 00:07:59
651
原创 linux 内存踩踏导致的空指针问题分析纪要
最开始测试说这个问题是必现或者高概率复现的,我们查看日志看着空指针又没看出什么,后面我们自己想复现问题找到问题的触发条件,后面我们发现wifi测速时这个问题出现的概率比较高,但是后面我们加了一些打开符号表和其他的调试信息后发现问题问题出现的概率也不是很高,驱动专家们怀疑这个时候改了逻辑打开了符号表,可能踩到了其他的内存,这个时候我们只能通过测试场景去看问题了。和协议栈的专家确认以及查看协议栈的发包函数的实现以及发包的流程,发现该线程是可重入的,但是没有加锁,所以可能会有问题,所以我们试着把。
2025-04-13 00:07:11
1135
原创 linux signal up/down/down_interruptiable\down_uninterruptiable使用
在Linux内核中,down, down_interruptible, down_killable, 和 up 是用于操作信号量(semap hores)的函数,它们用于进程同步和互斥。如果信号量的值为0,并且进程收到一个信号(比如用户按下Ctrl+C),down_interruptible会失败并返回-EINTR,而不是一直阻塞。通常,down函数本身就是不可中断的,除非在特定的情况下,内核代码可能提供了一个自定义的不可中断版本,但这不是标准做法。如果信号量的值大于0,它会减少信号量的计数并立即返回。
2025-04-04 20:43:35
577
原创 linux 进程/线程设置核亲和性
设置本线程的CPU亲和性到CPU 0使用的函数是 set_thread_affinity(pthread_self(), 0),使用。// 设置本线程的CPU亲和性到CPU 0。// 假设我们要绑定到第0个CPU核心上。// 定义一个函数,用于设置线程的CPU亲和性。// 清空CPU集合并添加指定的CPU。// 打印进程ID和设置的CPU亲和性。// 清空CPU集合并设置亲和性掩码。// 设置当前进程的CPU亲和性。// 打印CPU亲和性设置结果。// 设置线程的CPU亲和性。// 获取当前进程的PID。
2025-04-04 20:43:14
418
原创 rk3568 yt8521S phy设备层丢包定位处理
PC持续向主控端发包时,发现mac-rx有误码统计,我们交叉对换硬件设备上的phy设备,查看丢包是跟着phy芯片走的,而且我们查看对接设备打流100M没有丢包,1000M有丢包统计。3,查看a001和a003 寄存器,查看工作模式和tx-delay和rx-delay。b, 配置ext_reg0xA0 bit15置1 bit14清0 打开收发包统计。查看是否还是否有丢包,如果没有就要查看mac层。c,轮询 读取下图查看收发包计数结果。2,环回查看收发包情况寄存器配置。由PC持续向主控端发包。
2025-03-16 19:32:46
742
原创 rk3568 phy驱动调式_phy寄存器
2,代码分析:rk3568\rk356x-linux\kernel\drivers\net\phy\phy_device.c。device_attribute描述phy_registers的属性,而他有show和store两种操作(读和写)。sys/bus/mdio_bus/devices/stmmac-0\:00/里面的 phy_registers。查看调用sysfs调用过程。1,phy调式相关寄存器。
2025-03-16 19:32:13
513
原创 Linux内核常见的调试方法总结
另外一种调试模块初始化函数的方法是:当插入内核模块时,内核模块机制将调用函数 sys_init_module(kernel/modle.c)执行对内核模块的初始化,该函数将调用所插入模块的初始化函数。在这 个优化级别之下,编译器要对内核中的某些代码的执行顺序进行改动,所以在调试时会出现程序运行与代码顺序不 一致的情况。当前使用的日志级别。虽然内核调试有一定的困难,但是通过 你的努力和理解,说不定你会喜欢上这样的挑战。由于内核模块中各段的地址是在模块加载进内核的时候才最终确定的,所以develop机的。
2025-03-09 14:43:12
428
原创 rk3568 串口波特率更改
根据上面的配置文件,我们可以看出 使用需要更改的文件是bin/rk35/rk3568_ddr_1560MHz _v1. 19.bin,所以接下来我们围绕着/rk3568_ddr_1560MHz _v1. 19.bin进行修改展开。1,get ddr.bin file config to gen_param.txt file(读bin文件到txt文件)我们首先查看rkbin\tools\ddrbin_tool_user_guide.txt的相关说明。而后重新编译uboot,可以看到下面的生成文件。
2025-03-09 14:40:15
903
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人