- 博客(78)
- 资源 (1)
- 收藏
- 关注
原创 Linux程序调试优化(2)—— 一次学会嵌入式Linux下程序崩溃定位
方法名优点缺点gdb调试简单方便,还能调试其他问题基本仅适用于debug阶段coredump文件+gdb栈回溯可用于release版本需要debug版本挂死才能看到具体行号使用不当会引入其他严重问题signal捕捉挂死信号+backtrace回溯堆栈+rdynamic编译参数不需要-g选项,不增大应用程序体积会增大动态符号表,降低程序运行中动态寻找符号表的效率signal捕捉挂死信号+backtrace回溯堆栈+addr2line获取具体函数地址。
2024-04-24 00:22:12
1840
2
原创 Linux程序调试优化(1)——内存占用详解及优化思路
linux开发最重要的两个参数,分别是内存以及CPU使用率,若内存出现严重不足,则在需要使用内存时,可能出现申请不到的情况,导致,Linux系统主动杀死占用内存比较高的进程。
2024-04-15 20:21:48
2330
原创 Linux多进程通信(4)——消息队列从入门到实战!
1)获取消息队列键值pathname:路径名,是必须存在的,ftok只是根据文件inode在系统内的唯一性来取一个数值,和文件的权限无关。proj:1-255之间的数字返回值: 生成一个独有的数,失败则返回-1key 31-24 proj_id 低8位key 23-16 pathname的st_dev属性的低8位key 15-0 pathname的st_ino属性的低16位32位组合而成一个int值,就是我们的ftok的返回值了根据路径名以及数字,合成系统中唯一的Key值。
2024-04-04 11:09:40
1643
原创 Linux多线程(2)-线程间同步的5种方式,一次性说清楚!
这里都是一些个人血和泪的经验~1)锁的粒度太大,容易出现很多线程阻塞等待锁的情况,导致程序并发性差而如果锁的粒度太细,过度的锁开销会使系统性能受到影响,代码变的复杂,所以要找到一个平衡2)在程序开发中,写完lock之后,就要条件反射一般,将unlock写好,防止之后忘记3)在函数内进行lock之后,一定要谨防函数直接return的情况,return 之前要释放锁,否则下次拿锁会出现死锁的情况。4)带锁的线程,在使用pthread_cancle强制取消线程时,要对锁进行处理,详情可见。
2024-03-23 23:12:20
2043
原创 网络编程学习-TCP三次握手四次挥手抓包实战分析
TCP/IP是一个协议族,每个层次负责不同的通信功能。链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和对应的网络接口卡。处理与物理层传输介质(如电缆)之间的物理接口细节。网络层,也称作网际层,处理数据包分组在网络中的活动,例如分组的选路和转发等。网络层协议包括IP协议(网际协议)、ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)等。传输层,提供两台主机上的应用程序端到端的通信。
2023-11-12 15:57:45
535
1
原创 Linux架构优化——spdlog实现压缩及异步写日志
程序日志分散,大家都是直接写日志裸文件数据。而对Flash存储器而言。该写入方式,会存在大量的随机写,造成文件碎片化,降低Flash使用寿命,降低读写速度。
2025-12-02 17:48:01
355
原创 ros2—交叉编译ros bridge自定义消息
本文介绍了如何拉取ROS bridge并进行自定义消息编译。首先克隆ros1_bridge仓库并切换到foxy分支,然后创建ROS1工作区并建立自定义消息包。详细说明了MotCmd、Pose、ShapeBox消息和PlannerPlanPath服务的定义格式,以及如何修改CMakeLists.txt和package.xml文件来支持消息生成。编译步骤包括创建消息文件、配置编译依赖项和生成消息等关键操作,为ROS1和ROS2之间的消息桥接提供了完整实现方案。
2025-10-16 19:25:41
811
原创 块设备驱动(2)—EMMC磨损均衡、概念及优化路线
本文介绍了SSD存储中的磨损均衡技术及相关概念。主要内容包括:1.坏块的四种成因(出厂坏块、擦除/写入失败、ECC错误);2.磨损均衡的作用是通过动态/静态方式平衡闪存单元磨损,动态均衡仅处理新写入数据,静态均衡包含冷数据迁移;3.全局磨损均衡可跨盘调配空间,避免单盘提前失效;4.垃圾回收机制通过整理有效数据、擦除无效块来释放空间,涉及写放大问题和OP预留空间优化。这些技术共同提升了SSD的寿命和性能表现。
2025-10-09 17:01:33
1135
原创 ROS2学习(1)—基础概念及环境搭建
本文介绍了ROS2的核心框架及基础环境搭建。核心框架包括四大通信机制(Topic、Service、Action、Param)、调试工具(Rviz、Gazebo等)、建模工具(TF、URDF)和应用框架(Navigation2、Moveit2)。环境搭建部分详细说明了在Ubuntu 22.04上安装ROS2 Humble版本的过程,并通过小乌龟示例演示了节点启动、键盘控制和rqt可视化工具的使用,验证了ROS2环境安装成功。
2025-08-12 00:11:46
401
原创 架构优化——submodule转为subtree
本文介绍将Git子模块(submodule)转换为子树(subtree)的解决方案。针对20个子模块带来的多分支管理困扰,subtree方案具有三大优势:保留子模块复用性、简化开发流程(只需操作主仓库)、减少代码合并工作量。文章提供了自动化转换脚本,并详细说明日常开发使用方法:创建分支、提交代码仅需操作主仓库;特殊场景下可通过subtree命令单独推送/同步子模块代码。该方案显著提升了团队协作效率,特别适合需要共享基础模块的多仓库项目。转换过程需注意子模块分支配置,且初期可能需要同步历史提交。
2025-06-18 18:59:28
386
原创 ROS2——cyclonedds替换及共享内存支持
使用sudo apt install ros-foxy-rmw-cyclonedds-cpp 直接安装的无法支持共享内存,所以采用源码编译,也利于版本管理。
2025-02-05 15:20:45
1750
2
原创 ROS2——零基础入门到实战全网最全QuickStart指南
ROS2 quicktstart指南 其中包括demo,测试,概念介绍等。零基础实战,四种通信方式实战
2025-02-05 15:14:39
3173
原创 strace工具使用——实战解决文件描述符超限too many open files导致CPU飙高问题
CPU异常飙高,会突然出现飙到百分之110的情况。这周突然飙高大概率和程序死循环执行某事情有关,可以选择拿stace快速定位。
2025-01-12 16:39:21
471
原创 Linux-systemd管理——简述常用命令及如何添加一个service
systemd架构是作为所有进程的父进程,以PID为1一直运行在Linux系统中,作为所有进程的父进程,涵盖了Linux操作系统中绝大多数操作,比如用户登陆(loginctl),设备挂载,日志采集(journalctl),网络管理(networkctl)等,以unit file为基本单位。
2024-11-17 16:15:08
1312
1
原创 Linux网络配置及网卡策略-挑重点版
etc/udev/rules.d/70-persistent-net.rules,更改可以实现mac地址绑定网卡名,从而实现自定义#SUBSYSTEM========"ethUSB0"/etc/network/interfaces,更改可以配置不同网卡联网策略5ifup8ifdown8。
2024-11-17 16:13:58
584
原创 rsyslog服务日志记录——简述规则及原理
etc/rsyslog.conf rsyslog默认配置文件/etc/rsyslog.d/50-default.conf 默认配置,查看syslog、kern.log等路径例如:kern 的log输出到/userdata/var/log/kern.log。
2024-11-17 16:10:05
576
原创 音视频——RTSP流媒体传输技术介绍及抓包解析
将声音影像向用户计算机 连续、不间断的进行传送,延时小。抓包route add 添加到指定网络的路由规则route add [-net|-host] [网域或主机] netmask [mask] [gw|dev]route del [-net|-host] [网域或主机] netmask [mask] [gw|dev]
2024-08-31 15:30:57
3034
原创 Linux内存管理(1)——MMU内存管理单元及Buddy算法详解
最近复习Linux内存管理部分,简单将自己的理解记录一下:包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE):随机存取存储器,掉电丢失,CPU直接交换数据的内部存储器,也叫主存(内存)。可以随时读写,而且速度很快:只读存储器,掉电不丢失,只读不可写,用于存放计算机的基本程序和数据:高速缓冲存储器,位于CPU与内存之间,读写速度比内存更快。当CPU向内存中写入或读出数据时,这个数据也被存储进高速缓冲存储器中。
2024-08-28 23:26:02
1489
原创 Linux内核(5)——从udev/mdev工作原理到亲手实现SD卡热插拔
手动创建设备节点的命令:可以用于创建设备节点,创建设备节点的逻辑在内核空间(内核2.4版本之前使用):自动创建设备节点的机制,创建设备节点的逻辑在用户空间(从内核2.6版本一直使用至今):是一种轻量级的udev机制,用于一些嵌入式操作系统中,是busybox中自带的一种udev机制。
2024-08-19 23:18:54
2291
原创 Linux内核(4)——Linux设备文件open函数从应用到内核全过程解析
用户调用glibc接口Open函数->调用到open_not_cancel_2宏定义->INLINE_SYSCALL宏定义->INTERNAL_SYSCALL_RAW宏定义->系统调用的scno映射到寄存器值,并执行swi软中断指令->此时进入内核态,触发syscall系统调用,执行内核的vevtor_swi函数->获取scno,并根据call.s组成的sys_call_table中找到对应的系统调用函数->执行函数,调用retq指令返回用户态。
2024-08-01 23:19:08
1895
原创 Linux内核(3)-内核模块结构详解
lsmod:查看已加载模块ls /sys/module :查看内核已加载模块如果有tree命令,也可以用tree -a以树状查看,其中refcnt是模块引用计数cat /proc/kallsyms:查看内核符号表inmod:加载驱动模块modprobe:加载驱动模块,并加载驱动所依赖其他模块modprobe -r: 卸载驱动模块modinfo:查看驱动信息2.1 模块加载及卸载函数当内核模块被加载时,执行模块加载函数,当内核模块被卸载时,执行模块卸载函数内核驱动加载分为模块动态加载和直接编
2024-07-20 23:38:38
1035
原创 Linux驱动调试——使用DEVICE_ATTR实现cat、echo指令调试驱动
DEVICE_ATTR宏定义在kernel/include/linux/device.h文件中。struct__ATTR作用:定义一个device_attribute结构体,之后device_create_file使用。_name:名称,在/sys/device/virtual中的名称,##name代表将name的字段直接替换到##_name处,所以假设_name为ap3216c_test,那这边定义的结构体名就是dev_attr_ap3216c_test_mode。
2024-06-22 12:35:47
1722
原创 I2C总线驱动——ap3216c光感传感器从寄存器手册开始入手的实战版(附思维导图)
IIC驱动框架,也是一个标准的platform驱动,其中分为I2C总线驱动和I2C设备驱动I2C总线驱动:( 适配器驱动 )一般是原厂维护,主要是提供读写等APII2C设备驱动:是针对具体I2C设备所编写的驱动IIC总线驱动也遵循驱动、设备、总线的匹配规则,设备和驱动匹配成功后,probe函数便会执行,probe函数在i2c_driver中,我们主要需要实现的也是driver这部分。其中i2c_device_match完成IIC总线的设备和驱动匹配。i2c_client:描述设备信息。
2024-06-17 12:34:20
1815
1
原创 faad2交叉编译——aac解码为pcm,解决faad单通道转双通道问题
FAAD是比较成熟高效的开源AAC解码库,这里用于解码AAC生成PCM数据,用于音频播放。这里因为faad库,会将单通道转化为双通道踩了些坑,所以记录一下。我使用的是2.11.0版本,貌似往前的版本没有使用CMake,需要configure配置编译。
2024-05-08 19:44:07
1222
原创 IO复用技术(1)——select/poll/epoll原理介绍及使用案例
IO复用中epoll会更高效,内存拷贝次数少,事件复杂度低,且不受fd数量的限制。
2024-05-04 21:41:42
1214
1
原创 网络编程——TCP的特性之自动重传/流量控制/拥塞控制,一篇说清楚
协议窗口大小是否有序接收具体做法停止等待ARQ发送=1, 接收=1有序发送窗口每次只能发送一个数据包,然后就停止等待ack包。接收窗口有序的接收数据包,接收成功后发送ack包给发送窗口,如果收到的数据包是无序的,就直接丢弃连续ARQ-回退协议发送 = N,接收 = 1有序发送窗口每次最多一次性发送n个数据包,接收窗口有序的接收数据包,当接收到有序的数据包后,发送ack包给发送窗口,如果收到的数据包时无序的,就直接丢弃。当数据包丢失的时候,会将发送窗口中的后面的所有数据包都重新发送。
2024-04-19 17:52:15
1338
原创 C++基础(1)——学习C++必须要知道的基础数据类型及引用介绍
1)避免不想修改的值被修改2)相比普通引用,可以直接按临时值传递3)相比值传递,能减小时间和空间开销4)相比值传递,能避免截断问题。基本数据类型,最好还是按值传递。//不合法,引用必须引一块合法的内存void func(const int &val)//防止val被误修改当参数类型和引用类型不符时,可被转换为引用类型,将创建一个临时变量,并传递这个临时变量的引用,而因为临时变量不能用来初始化 非常量引用,所以必须是常量引用。
2024-04-09 23:15:20
759
原创 C++11新特性(2) ——动态内存和智能指针从入门到入坑
动态内存的使用十分容易出现问题(内存泄漏/非法内存),而智能指针能更安全、容易的使用动态内存,因为他负责自动释放所指向的对象,并且在出现异常时,也会自动释放。:允许指向同一个对象所指向的对象,指向shared_ptr所管理的对象。:和weak相比,主要差异是支持拷贝构造与赋值操作///< 指向string///< 指向int的list默认初始化的智能指针中保存一个空指针,使用方法与指针类似。
2024-04-08 23:15:12
1124
原创 Linux多进程通信(3)——详细说说共享内存原理及使用例程
共享内存的原理便是将相同的一片物理内存映射到进程A和进程B不同的逻辑地址空间,两个进程同时访问这块物理内存(共享内存)。共享内存是进程间通信访问速度最快。例如消息队列,FIFO,管道的消息传递方式一般为1:服务器得到输入2:通过管道,消息队列写入数据,通常需要从进程拷贝到内核。3:客户从内核拷贝到进程4:然后再从进程中拷贝到输出文件上述过程通常要经过4次拷贝,才能完成文件的传递。而1:从输入文件到共享内存区2:从共享内存区输出到文件上述过程。
2024-04-01 22:31:40
2038
原创 Linux多进程通信(2)——POSIX信号量使用例程
1),而POSIX信号量分为有名信号量和无名信号量,而System V标准的信号量并不是,Posix通过sem_open单一的调用就完成了信号量的创建、初始化和权限的设置,而System V要两步。POSIX无名信号量,POSIX信号量,用能看到,而System V信号量,则是使用查看。:可以在多进程间使用,多进程通过名字来打开同一个信号量,使用范围更广:一般在多线程使用,因为没有名字,所以没法在多进程中打开同一个信号量。
2024-04-01 22:29:51
1034
原创 Linux多进程通信(1)——无名管道及有名管道使用例程
管道是半双工通信,如果需要 双向通信,则需要建立两个管道,:只能父子进程间通信,且是非永久性管道通信结构,当它访问的进程全部终止时,管道也随之被撤销:进程间不需要有亲缘关系,是永久性管道通信结构,直到pclose才被关闭。(提供了一个路径名,以FIFO的形式存在于文件系统)
2024-04-01 00:54:03
758
2
原创 Linux多线程(1)- 线程基础概念及AP介绍
1)注册pthread_clean_up线程清理函数,在处理函数内释放锁、共享资源等(效率较高)2)加锁前,使用pthread_setcancelstate,禁止被cancle,随后再重新允许cancle(需要等到一段代码执行完)下面两个宏,分别是用方法1和方法2完成对锁的清理。
2024-03-21 19:53:00
719
原创 ntp同步时间原理-openwrt配置编译应用完整版
NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输,使用的UDP端口号为123。使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。对于运行NTP的本地系统,既可以接收来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以和其他设备互相同步。
2024-03-16 14:11:54
1202
原创 块设备驱动(1)-什么是块设备驱动?块设备驱动概念总结
块设备驱动是针对存储设备,例如SD卡、EMMC、NAND FLASH、NOR FLSASH。块设备驱动,当发生写入操作时,并不会立马操作硬盘,因为写之前要擦除,擦写频繁影响flash寿命。对于flash设备而言,,所以对于不对存储设备,Linux里有实现不同的I/O调度算法。而字符设备。借鉴一张在网上找到的图片,框架图当然是学习中必不可备的东西,一眼便能有个清晰的认识其中块设备驱动请求有两种形式,使用requeset_queue请求队列,以及不使用请求队列的。
2024-03-10 20:27:33
1673
原创 timezoneinfo的裁剪移植之uclibc/gclibc/openwrt的最详细实战版!
因为项目需要,产品售卖到国外各个地区,需要能适配各个国家的不同时区,一些国家可能会有多个不同时区,并且还存在冬夏令时问题,都需要做到一次性的兼容。而目前板子上可用的flash空间也已经不足200KB,需要同时考虑对flash空间节省。网上的资料并不齐全,这里完成后特地进行总结。这里需要做到,例如收到后,需要得出对应时区的UTC偏移,然后更改系统时间,并且是需要适应冬夏令时的情况。按照网上资料进行zoneinfo移植并设置时区后,发现时间并不对,后来查找资料发现。
2024-03-07 10:35:26
1660
3
原创 platfor设备驱动(1)-什么是platform设备驱动?platform设备驱动基础总结
Linux系统内核使用bus_type结构体表示总线,该结构体定义在文其中的match函数用于总线完成设备和驱动之间匹配 dev为设备,drv为驱动,所以每一条总线都必须实现这个函数。platform总线是bus_type的一个示例,在其中使用进行驱动和设备之间的匹配。return!return 1;return 1;= NULL;:设备树的匹配方式,通过compatible属性在OF表匹配,匹配后执行probe函数。
2024-02-28 16:31:04
1853
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅