自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

嵌入式Linux开发从业者,立志做一名优秀的博客输出者!

主要是嵌入式Linux开发相关,涉及C/C++ Linux,python等

  • 博客(73)
  • 资源 (1)
  • 收藏
  • 关注

原创 Linux程序调试优化(2)—— 一次学会嵌入式Linux下程序崩溃定位

方法名优点缺点gdb调试简单方便,还能调试其他问题基本仅适用于debug阶段coredump文件+gdb栈回溯可用于release版本需要debug版本挂死才能看到具体行号使用不当会引入其他严重问题signal捕捉挂死信号+backtrace回溯堆栈+rdynamic编译参数不需要-g选项,不增大应用程序体积会增大动态符号表,降低程序运行中动态寻找符号表的效率signal捕捉挂死信号+backtrace回溯堆栈+addr2line获取具体函数地址。

2024-04-24 00:22:12 1553 2

原创 Linux程序调试优化(1)——内存占用详解及优化思路

linux开发最重要的两个参数,分别是内存以及CPU使用率,若内存出现严重不足,则在需要使用内存时,可能出现申请不到的情况,导致,Linux系统主动杀死占用内存比较高的进程。

2024-04-15 20:21:48 2011

原创 Linux多进程通信总结——进程间通信看这一篇足够啦!

五种进程间通信汇总,必看!

2024-04-04 11:15:33 445

原创 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 1507

原创 Linux多线程(2)-线程间同步的5种方式,一次性说清楚!

这里都是一些个人血和泪的经验~1)锁的粒度太大,容易出现很多线程阻塞等待锁的情况,导致程序并发性差而如果锁的粒度太细,过度的锁开销会使系统性能受到影响,代码变的复杂,所以要找到一个平衡2)在程序开发中,写完lock之后,就要条件反射一般,将unlock写好,防止之后忘记3)在函数内进行lock之后,一定要谨防函数直接return的情况,return 之前要释放锁,否则下次拿锁会出现死锁的情况。4)带锁的线程,在使用pthread_cancle强制取消线程时,要对锁进行处理,详情可见。

2024-03-23 23:12:20 1860

原创 网络编程学习-TCP三次握手四次挥手抓包实战分析

TCP/IP是一个协议族,每个层次负责不同的通信功能。链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和对应的网络接口卡。处理与物理层传输介质(如电缆)之间的物理接口细节。网络层,也称作网际层,处理数据包分组在网络中的活动,例如分组的选路和转发等。网络层协议包括IP协议(网际协议)、ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)等。传输层,提供两台主机上的应用程序端到端的通信。

2023-11-12 15:57:45 369 1

原创 ROS2——foxy apt打包离线安装deb包

需要从A设备复制ROS2环境到B设备,且B设备有可能没网络,所以选择制作离线资源包。

2025-04-09 18:29:27 239

原创 ROS2——cyclonedds替换及共享内存支持

使用sudo apt install ros-foxy-rmw-cyclonedds-cpp 直接安装的无法支持共享内存,所以采用源码编译,也利于版本管理。

2025-02-05 15:20:45 745

原创 ROS2环境安装及搭建——零基础版

基于rk3588构建ROS2环境,从0开始安装

2025-02-05 15:18:13 375

原创 ROS2——零基础入门到实战全网最全QuickStart指南

ROS2 quicktstart指南 其中包括demo,测试,概念介绍等。零基础实战,四种通信方式实战

2025-02-05 15:14:39 1802

原创 strace工具使用——实战解决文件描述符超限too many open files导致CPU飙高问题

CPU异常飙高,会突然出现飙到百分之110的情况。这周突然飙高大概率和程序死循环执行某事情有关,可以选择拿stace快速定位。

2025-01-12 16:39:21 368

原创 Linux-systemd管理——简述常用命令及如何添加一个service

systemd架构是作为所有进程的父进程,以PID为1一直运行在Linux系统中,作为所有进程的父进程,涵盖了Linux操作系统中绝大多数操作,比如用户登陆(loginctl),设备挂载,日志采集(journalctl),网络管理(networkctl)等,以unit file为基本单位。

2024-11-17 16:15:08 1052 1

原创 Linux网络配置及网卡策略-挑重点版

etc/udev/rules.d/70-persistent-net.rules,更改可以实现mac地址绑定网卡名,从而实现自定义#SUBSYSTEM========"ethUSB0"/etc/network/interfaces,更改可以配置不同网卡联网策略5ifup8ifdown8。

2024-11-17 16:13:58 413

原创 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 468

原创 音视频——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 2315

原创 Linux内存管理(1)——MMU内存管理单元及Buddy算法详解

最近复习Linux内存管理部分,简单将自己的理解记录一下:包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE):随机存取存储器,掉电丢失,CPU直接交换数据的内部存储器,也叫主存(内存)。可以随时读写,而且速度很快:只读存储器,掉电不丢失,只读不可写,用于存放计算机的基本程序和数据:高速缓冲存储器,位于CPU与内存之间,读写速度比内存更快。当CPU向内存中写入或读出数据时,这个数据也被存储进高速缓冲存储器中。

2024-08-28 23:26:02 1251

原创 Linux内核(5)——从udev/mdev工作原理到亲手实现SD卡热插拔

手动创建设备节点的命令:可以用于创建设备节点,创建设备节点的逻辑在内核空间(内核2.4版本之前使用):自动创建设备节点的机制,创建设备节点的逻辑在用户空间(从内核2.6版本一直使用至今):是一种轻量级的udev机制,用于一些嵌入式操作系统中,是busybox中自带的一种udev机制。

2024-08-19 23:18:54 1667

原创 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 1654

原创 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 879

原创 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 1504

原创 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 1479 1

原创 faad2交叉编译——aac解码为pcm,解决faad单通道转双通道问题

FAAD是比较成熟高效的开源AAC解码库,这里用于解码AAC生成PCM数据,用于音频播放。这里因为faad库,会将单通道转化为双通道踩了些坑,所以记录一下。我使用的是2.11.0版本,貌似往前的版本没有使用CMake,需要configure配置编译。

2024-05-08 19:44:07 990

原创 IO复用技术(1)——select/poll/epoll原理介绍及使用案例

IO复用中epoll会更高效,内存拷贝次数少,事件复杂度低,且不受fd数量的限制。

2024-05-04 21:41:42 1094 1

原创 音视频封装格式解析(1)——H264格式简析,I/P/B帧是什么?H264压缩原理

的前提下,

2024-04-20 17:47:33 3013 4

原创 网络编程——TCP的特性之自动重传/流量控制/拥塞控制,一篇说清楚

协议窗口大小是否有序接收具体做法停止等待ARQ发送=1, 接收=1有序发送窗口每次只能发送一个数据包,然后就停止等待ack包。接收窗口有序的接收数据包,接收成功后发送ack包给发送窗口,如果收到的数据包是无序的,就直接丢弃连续ARQ-回退协议发送 = N,接收 = 1有序发送窗口每次最多一次性发送n个数据包,接收窗口有序的接收数据包,当接收到有序的数据包后,发送ack包给发送窗口,如果收到的数据包时无序的,就直接丢弃。当数据包丢失的时候,会将发送窗口中的后面的所有数据包都重新发送。

2024-04-19 17:52:15 1193

原创 C++基础(1)——学习C++必须要知道的基础数据类型及引用介绍

1)避免不想修改的值被修改2)相比普通引用,可以直接按临时值传递3)相比值传递,能减小时间和空间开销4)相比值传递,能避免截断问题。基本数据类型,最好还是按值传递。//不合法,引用必须引一块合法的内存void func(const int &val)//防止val被误修改当参数类型和引用类型不符时,可被转换为引用类型,将创建一个临时变量,并传递这个临时变量的引用,而因为临时变量不能用来初始化 非常量引用,所以必须是常量引用。

2024-04-09 23:15:20 683

原创 C++11新特性(2) ——动态内存和智能指针从入门到入坑

动态内存的使用十分容易出现问题(内存泄漏/非法内存),而智能指针能更安全、容易的使用动态内存,因为他负责自动释放所指向的对象,并且在出现异常时,也会自动释放。:允许指向同一个对象所指向的对象,指向shared_ptr所管理的对象。:和weak相比,主要差异是支持拷贝构造与赋值操作///< 指向string///< 指向int的list默认初始化的智能指针中保存一个空指针,使用方法与指针类似。

2024-04-08 23:15:12 1085

原创 Linux多进程通信(3)——详细说说共享内存原理及使用例程

共享内存的原理便是将相同的一片物理内存映射到进程A和进程B不同的逻辑地址空间,两个进程同时访问这块物理内存(共享内存)。共享内存是进程间通信访问速度最快。例如消息队列,FIFO,管道的消息传递方式一般为1:服务器得到输入2:通过管道,消息队列写入数据,通常需要从进程拷贝到内核。3:客户从内核拷贝到进程4:然后再从进程中拷贝到输出文件上述过程通常要经过4次拷贝,才能完成文件的传递。而1:从输入文件到共享内存区2:从共享内存区输出到文件上述过程。

2024-04-01 22:31:40 1805

原创 Linux多进程通信(2)——POSIX信号量使用例程

1),而POSIX信号量分为有名信号量和无名信号量,而System V标准的信号量并不是,Posix通过sem_open单一的调用就完成了信号量的创建、初始化和权限的设置,而System V要两步。POSIX无名信号量,POSIX信号量,用能看到,而System V信号量,则是使用查看。:可以在多进程间使用,多进程通过名字来打开同一个信号量,使用范围更广:一般在多线程使用,因为没有名字,所以没法在多进程中打开同一个信号量。

2024-04-01 22:29:51 936

原创 Linux多进程通信(1)——无名管道及有名管道使用例程

管道是半双工通信,如果需要 双向通信,则需要建立两个管道,:只能父子进程间通信,且是非永久性管道通信结构,当它访问的进程全部终止时,管道也随之被撤销:进程间不需要有亲缘关系,是永久性管道通信结构,直到pclose才被关闭。(提供了一个路径名,以FIFO的形式存在于文件系统)

2024-04-01 00:54:03 683 2

原创 Linux多线程(1)- 线程基础概念及AP介绍

1)注册pthread_clean_up线程清理函数,在处理函数内释放锁、共享资源等(效率较高)2)加锁前,使用pthread_setcancelstate,禁止被cancle,随后再重新允许cancle(需要等到一段代码执行完)下面两个宏,分别是用方法1和方法2完成对锁的清理。

2024-03-21 19:53:00 677

原创 ntp同步时间原理-openwrt配置编译应用完整版

NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输,使用的UDP端口号为123。使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。对于运行NTP的本地系统,既可以接收来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以和其他设备互相同步。

2024-03-16 14:11:54 808

原创 块设备驱动(1)-什么是块设备驱动?块设备驱动概念总结

块设备驱动是针对存储设备,例如SD卡、EMMC、NAND FLASH、NOR FLSASH。块设备驱动,当发生写入操作时,并不会立马操作硬盘,因为写之前要擦除,擦写频繁影响flash寿命。对于flash设备而言,,所以对于不对存储设备,Linux里有实现不同的I/O调度算法。而字符设备。借鉴一张在网上找到的图片,框架图当然是学习中必不可备的东西,一眼便能有个清晰的认识其中块设备驱动请求有两种形式,使用requeset_queue请求队列,以及不使用请求队列的。

2024-03-10 20:27:33 1528

原创 timezoneinfo的裁剪移植之uclibc/gclibc/openwrt的最详细实战版!

因为项目需要,产品售卖到国外各个地区,需要能适配各个国家的不同时区,一些国家可能会有多个不同时区,并且还存在冬夏令时问题,都需要做到一次性的兼容。而目前板子上可用的flash空间也已经不足200KB,需要同时考虑对flash空间节省。网上的资料并不齐全,这里完成后特地进行总结。这里需要做到,例如收到后,需要得出对应时区的UTC偏移,然后更改系统时间,并且是需要适应冬夏令时的情况。按照网上资料进行zoneinfo移植并设置时区后,发现时间并不对,后来查找资料发现。

2024-03-07 10:35:26 1356 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 1727

原创 Linux中的并发与竞争(2)最简单的自旋锁概念及范例

当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。:如果持有锁的线程能在短时间内释放锁资源,那么竞争锁就不需要做内核态和用户态之间的切换,只需要等到持有锁的线程释放锁,避免了用户进程和内核切换的消耗。:为读和写提供了不同的锁,当没有写操作时,允许多个线程使用读锁,进行并发的读取操作。更适用于读取场合更多的情况。在进入临界区时,线程A获取到锁,并且保存中断状态,禁止了中断,防止被中断服务打断而造成死锁现象。

2024-02-22 23:59:07 534

原创 Linux中的并发与竞争(1)并发是如何发生的以及原子操作介绍

A、B、C任务,同时对共享数据段S进行访问A任务对S写入3000个字符"a",B任务对S写入3000个字符"b",C任务负责读取所有数据,当执行顺序如下时,A将数据从用户态拷贝完成后,还未累加当前访问下标,B便对数据进行了访问,此后C获取数据,获取到的数据并不是3000个字符"a",而是3000个字符"b"。

2024-02-22 23:55:56 429

原创 pinctrl/gpio子系统(2)-gpio子系统介绍及驱动源码简单分析

哈喽~我是徐章鑫,沪漂嵌入式开发工程师一枚,立志成为嵌入式全栈开发工程师,成为优秀博客创作者,共同学习进步。

2024-02-02 17:10:06 1110

原创 pinctrl/gpio子系统(1)-pinctrl子系统介绍及驱动源码分析

在如今的驱动开发工作中,实际上已经很少去对着寄存器手册进行驱动开发了,一般板子拿到手,已经有原厂的驱动开发工程师,在gpio子系统、pinctrl子系统中将自家芯片的引脚适配好了。我们直接基于设备树已配置好的寄存器值,去使用子系统对应的API函数,就能快速完成驱动开发,不需要再那么关心IO寄存器的值,借助这种驱动分层的思想,快速完成驱动开发。其中配置一个GPIO最重要的几点就是配置:从设备树中获取,PIN 可复用为 I2C、SPI、GPIO,当复用为gpio的时候,就需要用到gpio子系统。

2024-01-31 17:24:18 1254

原创 设备树(2)-设备树在Linux系统的具体体现及内核解析设备树文件过程

哈喽~我是Embedded-Xin,沪漂嵌入式开发工程师一枚,立志成为嵌入式全栈开发工程师,成为优秀博客创作者,共同学习进步。这里先不深度去跟踪整个解析流程,能看懂设备树,遇到问题能有解决思路,待之后实际用到遇到问题了,再开始来逐步学习,加强记忆。内核启动时解析dtb文件, 后在/proc/device-tree 目录 生成设备树节点文件,过程大概如下。这里先关注结果,不关注过程,之后实际用到了再来捋这个过程~进入soc节点,soc节点下所有子节点和属性如下。这样的话,可以使用spi0访问节点。

2024-01-23 17:21:27 810

qt5.9-lib-gcc

qt5.9交叉编译环境,亲测可用,欢迎下载,欢迎察看。大家随意下载,使用于linux操作系统,交叉编译的开发环境,是不错的资源

2020-09-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除